策略分享

StockRanker实盘交易的那些事儿

由ypyu创建,最终由ypyu 被浏览 349 用户

作为平台的铁杆用户,本文主要分享下使用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()

买入股票列表截图为:

img src="/community/uploads/default/original/1X/089113121537fb0ae8715902b2682f7954e520bb.png" width="690" height="275"

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

<img src="/community/uploads/default/original/1X/58c572bf229dfdd8ce44b8f32702e0917f223ca1.png" width="689" height="373">

优先卖出的股票就是: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)

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

标签

实盘交易机器学习算法输入特征StockRanker算法
{link}