StockRanker实盘交易的那些事儿

stockranker
实盘交易
精选
标签: #<Tag:0x00007f60ad3874e8> #<Tag:0x00007f60ad387358> #<Tag:0x00007f60ad3871f0>

(disc) #1

作为平台的铁杆用户,本文主要分享下使用StockRanker模型来实盘交易的一些经验。

在机器学习领域,预测的结果依赖于:数据、算法和特征,因此真正好的策略一定是特征选择和特征构建非常好。

平台的StockRanker模型策略生成器只是搭建了一个策略框架,输入不同的特征就可以看到不同的策略效果。去年的时候,我构造出了大约10个特征进行回测,从12年到16年底,平均年化收益达到了76%,因此就打算先用一部分小资金实盘,进一步验证特征的有效性。

因为政策原因,目前国内股票实盘交易接口并没有开放,因此量化平台都不会说自己平台上可以实盘交易,免得监管部门叫去喝茶。于是只有手动下单,好在股票持仓时间不是很短,因此手动交易完全没有问题。

那接下来需要做什么呢?

首先,弄明白策略的交易逻辑

  • 进场逻辑:StockRanker是一个股票排序模型,根据历史数据对全市场所有股票进行排序,优先买入排序靠前的股票。

  • 出场逻辑:优先卖出排序靠后的股票。

  • stock_num参数,该参数表明每天买入的股票数量。(我的策略stock_num = 5 )

  • hold_days参数,表明买入的股票理论上持有hold_days是最好的,因为每天都要预测排序,每天都会有买入,相当于每天买入的金额就等于本金除以hold_days。

  • stock_weights参数,表明每天要买入的股票各自的权重,排序靠前的股票权重越大,并非等权重买入。

接着,整理出第二天的买入股票列表、卖出列表

n1 = M.general_feature_extractor.v5(
    instruments=D.instruments(),
    start_date='2017-06-21', end_date='2017-06-21',
    model_id=m5.model_id)
n2 = M.transform.v2(
    data=n1.data, transforms=T.get_stock_ranker_default_transforms(),
    drop_null=True, astype='int32', except_columns=['date', 'instrument'],
    clip_lower=0, clip_upper=200000000)
n3 = M.stock_ranker_predict.v2(model_id=m5.model_id, data=n2.data)

n3.predictions.read_df()

买入股票列表截图为:

则第二天买入的股票为002134、603268、600590、603398、000033,越靠前权重越大。
卖出的股票列表也比较好整理,就是降序排列就行。
卖出股票截图如下:

优先卖出的股票就是:601788、600793、000993、002651、002307…依次往后数

然后,确定交易时间

因为在策略中, order_price_field_buy=‘open’,表明买入股票是在开盘时买入,为了能在开盘顺利买入,可在9:25之前委托下单,下单价格为昨日收盘价*1.05,这样可以保证成交。如果遇到当天推荐买入的股票停牌或者涨停,那么当天就可以不用交易该股票了。

因为在策略中,order_price_field_sell=‘close’,表明回测中卖出股票是在收盘的时候完成的,因此可以在14:57的时候卖出股票,为保证成交,可以按最新价*0.98下单,如果股票停牌或者跌停,那么可以不用下单,反正也成交不了。

最后,资金管理有一些注意

在资金管理这块,为保证账户每日可用资金相等,可以做一些计算,代码里是这样实现的:

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)

这样控制以后,每天买入的股票金额大致相等。当偶尔遇到账户现金多的时候,就可以不用卖出股票。


大家看看这个策略如何?
(kw) #2

为什么要以这样的方式下单呢,不太好控制仓位


(disc) #3

好控制仓位啊,因为每天买入的股票权重是不相等的,排在前面的股票权重越大。你可以详细看一些策略代码,你会发现,策略资金管理思想都已经加在了代码里面


(YQ_YD) #4

感谢分享 但是交易时间是不是至只有开盘和收盘?:grinning:


(iQuant) #5

在回测中,指定成交价格一般是开盘价或者收盘价。


(jiangxiaoyu610) #6

请问实盘收益怎么样?平台的策略生成器框架会不会有过拟合现象?因为随便输入几个因子好像收益率都不低~


BigQuant AI策略详解
(iQuant) #7

在金融预测和数据挖掘中,只要是通过过去的数据来预测未来,都会面临过拟合的问题。即使是趋势跟踪的双均线模型,参数的选择也会面临过拟合。因此过拟合问题只能降低和减少,很难规避。
目前在BigQuant上,大家可以采取滚动训练、参数采取平原地带的参数、因子最好有逻辑意义等多种方式来减少过拟合。

我们的部分用户的实盘情形和回测情形基本一致。


(jiangxiaoyu610) #8

非常感谢您耐心的讲解,我明白了,谢谢:)


(1899) #9

你好 请问有的时候并不是每天都有买入和卖出,例如当天并没有要买入的股票或者没有要卖出的股票,策略可以实现么


(小Q) #10

可以实现啊。
你多了解下策略回测引擎,很好实现的