开盘前1.5秒下单可追涨停股

本文介绍了一种在股市中买入连续涨停股票的技巧。通过详细分析一字线涨停现象,揭示了即使在涨停板上仍有成交的可能性,并提供了具体的操作步骤,包括如何与交易所同步时间、选择合适的交易平台以提高成功率。
因为盛传有新资产注入,中远洋(601919)自7月25日停牌9月4日复牌以来,已连续两天开盘即封死涨停,证券分析人士认为其还应有两个涨停板。这种情况下,如果股民还想买入该股票,是否还有机会?如何操作才可实现?对此,记者采访业内多位专家后得知其确有操作奥妙。

  100个人中会有一个“幸运儿”

  胜龙证券网首席证券分析师、福瑞斯国际金融集团首席讲师徐小明表示,股票市场也有相对而言的零风险和零成本套利。首先要找到特大的利好题材股,这样的股票通常都是一字线涨停,即直接以涨停开盘全天不开板。比如说最近公用科技和凌云股份,其买一价格上封单量很大,全天成交量很少,但不论多少还是有成交的,即有人卖出也有人买入。这种情况买入的就跟中奖了一样。因为市场巨大的人气和惯性,会导致该股以后继续上涨。

  比如说公用科技(000685)8月21日(第一个涨停)之后的成交量平均值为3529手。每天的封单量为40万手左右,即100个想买入这股的人当中,会有一个人成交。

  和交易所对表精确到秒

  怎么才能成为这样的人呢?徐小明表示股票的成交遵循不外乎两个原则,即时间优先和价格优先。所以,遇到这样的股票,所有买入的价格都填涨停挂单,(昨天的收盘价格乘以1.1)。既然价格一样,我们就比谁快。标准的操盘手不考虑批量买入的情况下,每分钟能敲6笔单。很多人觉得速度没有办法比专业的机构操盘手更快,其实是错误的。因为,这样的交易只看最早的一笔单,看谁敲得快。集合竞价时间是9时15分,在这之前先把单填好,最后的确认先不要敲。然后对表,要精确到秒,点对点的直接到上海交易所的证券营业部交易端9时14分59秒敲确认键,数据传输速度大概需要1秒的延迟。然后排队,9时31分之前排到就赚了。排不到,撤单也不亏损。因此这也叫零风险套利。

  东方证券客户经理吴峰在接受记者采访时则提醒,由于大多数普通的操盘软件还需要股民在输单的最后按一个确认键,而这需要0.5秒的时间,因此总体而言股民若想买涨停,应在开盘前1.5秒钟下手。

  精选交易平台应对堵单情况

  然而现实中,不少股民在交易时都会遇到堵单情况,怎么解决这个问题?对此,东方证券客户经理吴峰在接受本报记者采访时表示:“这个时候就要精选好的交易平台了。比如某些总部在上海本地的一些新兴券商,其交易后台的服务器等设备及软件会比较先进,加上其他的综合因素,点对点交易的成功率会比较大,其实现涨停板股票购买的通道可能会畅通。”
分析以下代码的逻辑: # 本代码由可视化策略环境自动生成 2021年4月22日16:29 # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。 # 回测引擎:初始化函数,只执行一次 def m19_initialize_bigquant_run(context): # 加载预测数据 context.ranker_prediction = context.options['data'].read_df() # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数 context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) # 预测数据,通过options传入进来,使用 read_df 函数,加载到内存 (DataFrame) # 设置买入的股票数量,这里买入预测股票列表排名靠5只 stock_count = 30 # 每只的股票的权重,如下的权重分配会使得靠股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..] context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)]) # 设置每只股票占用的最大资金比例 context.max_cash_per_instrument = 0.2 context.options['hold_days'] = 22 # 回测引擎:每日数据处理函数,每天执行一次 def m19_handle_data_bigquant_run(context, data): # 按日期过滤得到今日的预测数据 ranker_prediction = context.ranker_prediction[ context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')] # 1. 资金分配 # 平均持仓时间是hold_days,每日都将买入股票,每日预期使用 1/hold_days 的资金 # 实际操作中,会存在一定的买入误差,所以在hold_days天,等量使用资金;之后,尽量使用剩余资金(这里设置最多用等量的1.5倍) is_staging = context.trading_day_index < context.options['hold_days'] # 是否在建仓期间( hold_days 天) cash_avg = context.portfolio.portfolio_value / context.options['hold_days'] cash_for_buy = min(context.portfolio.cash, (1 if is_staging else 1.5) * cash_avg) cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy) positions = {e.symbol: p.amount * p.last_sale_price for e, p in context.perf_tracker.position_tracker.positions.items()} # 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰 if not is_staging and cash_for_sell > 0: equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()} instruments = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply( lambda x: x in equities and not context.has_unfinished_sell_order(equities[x]))]))) for instrument in instruments: context.order_target(context.symbol(instrument), 0) cash_for_sell -= positions[instrument] if cash_for_sell <= 0: break # 3. 生成买入订单:按机器学习算法预测的排序,买入面的stock_count只股票 buy_cash_weights = context.stock_weights buy_instruments = list(ranker_prediction.instrument[:len(buy_cash_weights)]) max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument for i, instrument in enumerate(buy_instruments): cash = cash_for_buy * buy_cash_weights[i] if cash > max_cash_per_instrument - positions.get(instrument, 0): # 确保股票持仓量不会超过每次股票最大的占用资金量 cash = max_cash_per_instrument - positions.get(instrument, 0) if cash > 0: context.order_value(context.symbol(instrument), cash) # 回测引擎:准备数据,只执行一次 def m19_prepare_bigquant_run(context): pass g = T.Graph({ 'm1': 'M.instruments.v2', 'm1.start_date': '2010-01-01', 'm1.end_date': '2015-01-01', 'm1.market': 'CN_STOCK_A', 'm1.instrument_list': '', 'm1.max_count': 0, 'm2': 'M.advanced_auto_labeler.v2', 'm2.instruments': T.Graph.OutputPort('m1.data'), 'm2.label_expr': """# #号开始的表示注释 # 0. 每行一个,顺序执行,从第二个开始,可以使用label字段 # 1. 可用数据字段见 https://bigquant.com/docs/data_history_data.html # 添加benchmark_缀,可使用对应的benchmark数据 # 2. 可用操作符和函数见 `表达式引擎 <https://bigquant.com/docs/big_expr.html>`_ # 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格) shift(close, -22) / shift(open, -1) # 极值处理:用1%和99%分位的值做clip clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99)) # 将分数映射到分类,这里使用20个分类 all_wbins(label, 20) # 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label) where(shift(high, -1) == shift(low, -1), NaN, label) """, 'm2.start_date': '', 'm2.end_date': '', 'm2.benchmark': '000300.SHA', 'm2.drop_na_label': True, 'm2.cast_label_int': True, 'm3': 'M.input_features.v1', 'm3.features': """# #号开始的表示注释 # 多个特征,每行一个,可以包含基础特征和衍生特征 return_5 return_10 return_20 avg_amount_0/avg_amount_5 avg_amount_5/avg_amount_20 rank_avg_amount_0/rank_avg_amount_5 rank_avg_amount_5/rank_avg_amount_10 rank_return_0 rank_return_5 rank_return_10 rank_return_0/rank_return_5 rank_return_5/rank_return_10 pe_ttm_0""", 'm15': 'M.general_feature_extractor.v7', 'm15.instruments': T.Graph.OutputPort('m1.data'), 'm15.features': T.Graph.OutputPort('m3.data'), 'm15.start_date': '', 'm15.end_date': '', 'm15.before_start_days': 90, 'm16': 'M.derived_feature_extractor.v3', 'm16.input_data': T.Graph.OutputPort('m15.data'), 'm16.features': T.Graph.OutputPort('m3.data'), 'm16.date_col': 'date', 'm16.instrument_col': 'instrument', 'm16.drop_na': False, 'm16.remove_extra_columns': False, 'm7': 'M.join.v3', 'm7.data1': T.Graph.OutputPort('m2.data'), 'm7.data2': T.Graph.OutputPort('m16.data'), 'm7.on': 'date,instrument', 'm7.how': 'inner', 'm7.sort': False, 'm5': 'M.dropnan.v2', 'm5.input_data': T.Graph.OutputPort('m7.data'), 'm4': 'M.stock_ranker_train.v6', 'm4.training_ds': T.Graph.OutputPort('m5.data'), 'm4.features': T.Graph.OutputPort('m3.data'), 'm4.learning_algorithm': '排序', 'm4.number_of_leaves': 30, 'm4.minimum_docs_per_leaf': 1000, 'm4.number_of_trees': 20, 'm4.learning_rate': 0.1, 'm4.max_bins': 1023, 'm4.feature_fraction': 1, 'm4.data_row_fraction': 1, 'm4.ndcg_discount_base': 1, 'm4.m_lazy_run': False, 'm9': 'M.instruments.v2', 'm9.start_date': T.live_run_param('trading_date', '2017-01-01'), 'm9.end_date': T.live_run_param('trading_date', '2018-10-22'), 'm9.market': 'CN_STOCK_A', 'm9.instrument_list': '', 'm9.max_count': 0, 'm17': 'M.general_feature_extractor.v7', 'm17.instruments': T.Graph.OutputPort('m9.data'), 'm17.features': T.Graph.OutputPort('m3.data'), 'm17.start_date': '', 'm17.end_date': '', 'm17.before_start_days': 90, 'm18': 'M.derived_feature_extractor.v3', 'm18.input_data': T.Graph.OutputPort('m17.data'), 'm18.features': T.Graph.OutputPort('m3.data'), 'm18.date_col': 'date', 'm18.instrument_col': 'instrument', 'm18.drop_na': False, 'm18.remove_extra_columns': False, 'm10': 'M.dropnan.v2', 'm10.input_data': T.Graph.OutputPort('m18.data'), 'm8': 'M.stock_ranker_predict.v5', 'm8.model': T.Graph.OutputPort('m4.model'), 'm8.data': T.Graph.OutputPort('m10.data'), 'm8.m_lazy_run': False, 'm19': 'M.trade.v4', 'm19.instruments': T.Graph.OutputPort('m9.data'), 'm19.options_data': T.Graph.OutputPort('m8.predictions'), 'm19.start_date': '', 'm19.end_date': '', 'm19.initialize': m19_initialize_bigquant_run, 'm19.handle_data': m19_handle_data_bigquant_run, 'm19.prepare': m19_prepare_bigquant_run, 'm19.volume_limit': 0.025, 'm19.order_price_field_buy': 'open', 'm19.order_price_field_sell': 'close', 'm19.capital_base': 1000000, 'm19.auto_cancel_non_tradable_orders': True, 'm19.data_frequency': 'daily', 'm19.price_type': '后复权', 'm19.product_type': '股票', 'm19.plot_charts': True, 'm19.backtest_only': False, 'm19.benchmark': '', }) # g.run({}) def m20_run_bigquant_run( bq_graph, inputs, trading_days_market='CN', # 使用那个市场的交易日历 train_instruments_mid='m1', # 训练数据 证券代码列表 模块id test_instruments_mid='m9', # 测试数据 证券代码列表 模块id predict_mid='m8', # 预测 模块id trade_mid='m19', # 回测 模块id start_date='2016-01-01', # 数据开始日期 end_date=T.live_run_param('trading_date', '2018-10-22'), # 数据结束日期 train_update_days=250, # 更新周期,按交易日计算,每多少天更新一次 train_update_days_for_live=None, #模拟实盘模式下的更新周期,按交易日计算,每多少天更新一次。如果需要在模拟实盘阶段使用不同的模型更新周期,可以设置这个参数 train_data_min_days=250, # 最小数据天数,按交易日计算,所以第一个滚动的结束日期是 从开始日期到开始日期+最小数据天数 train_data_max_days=250, # 最大数据天数,按交易日计算,0,表示没有限制,否则每一个滚动的开始日期=max(此滚动的结束日期-最大数据天数, 开始日期 rolling_count_for_live=1, #实盘模式下滚动次数,模拟实盘模式下,取最后多少次滚动。一般在模拟实盘模式下,只用到最后一次滚动训练的模型,这里可以设置为1;如果你的滚动训练数据时间段很短,以至于期间可能没有训练数据,这里可以设置大一点。0表示没有限制 ): def merge_datasources(input_1): df_list = [ds[0].read_df().set_index('date').ix[ds[1]:].reset_index() for ds in input_1] df = pd.concat(df_list) instrument_data = { 'start_date': df['date'].min().strftime('%Y-%m-%d'), 'end_date': df['date'].max().strftime('%Y-%m-%d'), 'instruments': list(set(df['instrument'])), } return Outputs(data=DataSource.write_df(df), instrument_data=DataSource.write_pickle(instrument_data)) def gen_rolling_dates(trading_days_market, start_date, end_date, train_update_days, train_update_days_for_live, train_data_min_days, train_data_max_days, rolling_count_for_live): # 是否实盘模式 tdays = list(D.trading_days(market=trading_days_market, start_date=start_date, end_date=end_date)['date']) is_live_run = T.live_run_param('trading_date', None) is not None if is_live_run and train_update_days_for_live: train_update_days = train_update_days_for_live rollings = [] train_end_date = train_data_min_days while train_end_date < len(tdays): if train_data_max_days is not None: train_start_date = max(train_end_date - train_data_max_days, 0) else: train_start_date = start_date rollings.append({ 'train_start_date': tdays[train_start_date].strftime('%Y-%m-%d'), 'train_end_date': tdays[train_end_date - 1].strftime('%Y-%m-%d'), 'test_start_date': tdays[train_end_date].strftime('%Y-%m-%d'), 'test_end_date': tdays[min(train_end_date + train_update_days, len(tdays)) - 1].strftime('%Y-%m-%d'), }) train_end_date += train_update_days if not rollings: raise Exception('没有滚动需要执行,请检查配置') if is_live_run and rolling_count_for_live: rollings = rollings[-rolling_count_for_live:] return rollings g = bq_graph rolling_dates = gen_rolling_dates( trading_days_market, start_date, end_date, train_update_days, train_update_days_for_live, train_data_min_days, train_data_max_days, rolling_count_for_live) # 训练和预测 results = [] for rolling in rolling_dates: parameters = {} # 先禁用回测 parameters[trade_mid + '.__enabled__'] = False parameters[train_instruments_mid + '.start_date'] = rolling['train_start_date'] parameters[train_instruments_mid + '.end_date'] = rolling['train_end_date'] parameters[test_instruments_mid + '.start_date'] = rolling['test_start_date'] parameters[test_instruments_mid + '.end_date'] = rolling['test_end_date'] # print('------ rolling_train:', parameters) results.append(g.run(parameters)) # 合并预测结果并回测 mx = M.cached.v3(run=merge_datasources, input_1=[[result[predict_mid].predictions,result[test_instruments_mid].data.read_pickle()['start_date']] for result in results]) parameters = {} parameters['*.__enabled__'] = False parameters[trade_mid + '.__enabled__'] = True parameters[trade_mid + '.instruments'] = mx.instrument_data parameters[trade_mid + '.options_data'] = mx.data trade = g.run(parameters) return {'rollings': results, 'trade': trade} m20 = M.hyper_rolling_train.v1( run=m20_run_bigquant_run, run_now=True, bq_graph=g )
07-17
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值