【历史文档】高阶技巧-多模型组合使用技巧
由qxiao创建,最终由small_q 被浏览 265 用户
更新
本文内容对应旧版平台与旧版资源,其内容不再适合最新版平台,请查看新版平台的使用说明
新版量化开发IDE(AIStudio):
https://bigquant.com/wiki/doc/aistudio-aiide-NzAjgKapzW
新版模版策略:
https://bigquant.com/wiki/doc/demos-ecdRvuM1TU
新版数据平台:
https://bigquant.com/data/home
https://bigquant.com/wiki/doc/dai-PLSbc1SbZX
新版表达式算子:
https://bigquant.com/wiki/doc/dai-sql-Rceb2JQBdS
新版因子平台:
https://bigquant.com/wiki/doc/bigalpha-EOVmVtJMS5
背景
很多策略研发者会经常想到结合多个模型的训练结果来组合构成买卖信号,下面给出三种思路作为抛砖引玉。
策略思路
思路一
两个模型的输出都是基于股票未来的收益率,那么可以直接利用两个模型的得分之和来作为股票的最终得分,根据新得分重新排序后得出股票排名,根据此排名进行买卖。
具体实现:加入自定义python模块,在此模块中读取两个模型的得分结果,进行求和后再排序,并把重新排序结果传给回测模块。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def bigquant_run(input_1, input_2, input_3):
# 分别读取两个模型的数据
df1 = input_1.read().rename(columns={'score':'score1','position':'position1'})
df2 = input_2.read().rename(columns={'score':'score2','position':'position2'})
#合并重新计算得分
df = pd.merge(left=df1,right=df2,on=['date','instrument'],how='inner')
df['score'] = df.score1 + df.score2
#排序
df = df.groupby('date').apply(lambda x:x.sort_values('score',ascending=False)).reset_index(drop=True)
return Outputs(data_1=DataSource.write_df(df), data_2=None, data_3=None)
思路二
除了预测涨以外,我可以让其中一个模型预测跌,然后计算综合得分时,用预测涨的模型得分减去预测跌的模型得分,算出最终得分来进行排名,然后传给回测模块。
具体实现:
1)在自动标注模块中,在之前的label前加上负号,那么预测结果中的得分越高,表示跌得越多。
-shift(close, -5) / shift(open, -1)
2)加入自定义python模块,在此模块中读取两个模型的得分结果,进行差值后再排序,并把重新排序结果传给回测模块。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def bigquant_run(input_1, input_2, input_3):
# 分别读取两个模型的数据
df1 = input_1.read().rename(columns={'score':'score1','position':'position1'})
df2 = input_2.read().rename(columns={'score':'score2','position':'position2'})
#合并重新计算得分
df = pd.merge(left=df1,right=df2,on=['date','instrument'],how='inner')
df['score'] = df.score1 - df.score2
#排序
df = df.groupby('date').apply(lambda x:x.sort_values('score',ascending=False)).reset_index(drop=True)
return Outputs(data_1=DataSource.write_df(df), data_2=None, data_3=None)
思路三
除了以上两个在买入时做组合外,我们还可以利用卖出点,两个模型都是预测的股票涨幅,一个用于买入,另外一个用于卖出,即在模型二中排名靠后的股票优先卖出。
1)在自定义python模块中,只根据第一个模型的score来排序,但是需要把第二个模型的排名输出一起传给回测模块。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def bigquant_run(input_1, input_2, input_3):
# 分别读取两个模型的数据
df1 = input_1.read().rename(columns={'score':'score1','position':'position1'})
df2 = input_2.read().rename(columns={'score':'score2','position':'position2'})
#合并重新计算得分
df = pd.merge(left=df1,right=df2,on=['date','instrument'],how='inner')
df['score'] = df.score1
#排序
df = df.groupby('date').apply(lambda x:x.sort_values('score',ascending=False)).reset_index(drop=True)
return Outputs(data_1=DataSource.write_df(df), data_2=None, data_3=None)
2)在回测模块中,每天对持仓进行判断,优先卖出模型二排名靠后的股票。
# 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰
if not is_staging and cash_for_sell > 0:
equities = {e.symbol: e for e, p in context.portfolio.positions.items()}
#按照score2卖出股票
df_sell = ranker_prediction[ranker_prediction.instrument.isin(equities)].sort_values('score2')
instruments = df_sell.instrument.unique()
for instrument in instruments:
context.order_target(context.symbol(instrument), 0)
cash_for_sell -= positions[instrument]
if cash_for_sell <= 0:
break
策略链接
策略一:
https://bigquant.com/experimentshare/fed47c008705402a91f6944d863beddf
策略二:
https://bigquant.com/experimentshare/aea3902a2f6a4c178532fdae93116ea8
策略三:
https://bigquant.com/experimentshare/53d3df921e9e42ea99027af6a9c5d256
\