双均线策略报错
由bq8aahdd创建,最终由small_q 被浏览 49 用户
本代码由可视化策略环境自动生成 2023年6月15日 17:24
本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
回测引擎:初始化函数,只执行一次
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))
回测引擎:每日数据处理函数,每天执行一次
def m19_handle_data_bigquant_run(context, data):
# 按日期过滤得到今日的预测数据
options_data = context.ranker_prediction[context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]
# 标的为字符串格式
sid = context.symbol(context.instruments[0])# 标的为字符串格式
price = data.current(sid, 'price') # 最新价格
cash = context.portfolio.cash # 现金
cur_position = context.portfolio.positions[sid].amount # 持仓
short_mavg = options_data['m5'].values # 短期均线值
long_mavg = options_data['m60'].values # 长期均线值
#交易逻辑
# 如果短期均线大于长期均线形成金叉,并且没有持仓,并且该股票可以交易
if short_mavg > long_mavg and cur_position == 0 and data.can_trade(sid):context.order(sid, int(cash/price/100)*100) # 买入
print('{}全仓买入{}股票'.format(data.current_dt.strftime('%Y-%m-%d'),sid.symbol))
# 如果短期均线小于长期均线形成死叉,并且有持仓,并且该股票可以交易
elif short_mavg < long_mavg and cur_position > 0 and data.can_trade(sid):context.order_target_percent(sid, 0) # 全部卖出
print('{}卖出{}股票'.format(data.current_dt.strftime('%Y-%m-%d'),sid.symbol))
回测引擎:准备数据,只执行一次
def m19_prepare_bigquant_run(context): pass
回测引擎:每个单位时间开始前调用一次,即每日开盘前调用一次。
def m19_before_trading_start_bigquant_run(context, data): pass
m1 = M.instruments.v2( start_date='2018-01-01', end_date='2020-12-31', market='CN_STOCK_A', instrument_list="""603369.SHA 600779.SHA 000568.SZA 000860.SZA 000596.SZA 000858.SZA 002646.SZA 603919.SHA 002304.SZA 600702.SHA 603589.SHA 000799.SZA 600599.SHA 603198.SHA 600519.SHA 600199.SHA 600809.SHA 600197.SHA 600696.SHA""", max_count=0 )
m2 = M.advanced_auto_labeler.v2( instruments=m1.data, label_expr="""# #号开始的表示注释
0. 每行一个,顺序执行,从第二个开始,可以使用label字段
1. 可用数据字段见 https://bigquant.com/docs/develop/datasource/deprecated/history_data.html
添加benchmark_前缀,可使用对应的benchmark数据
2. 可用操作符和函数见 表达式引擎 <https://bigquant.com/docs/develop/bigexpr/usage.html>
_
计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
shift(close, -5) / 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) """, start_date='', end_date='', benchmark='000300.HIX', drop_na_label=True, cast_label_int=True )
m3 = M.input_features.v1( features="""# #号开始的表示注释
多个特征,每行一个,可以包含基础特征和衍生特征
m5 = ta_ema_5_0 m60 = ta_ema_60_0 """ )
m15 = M.general_feature_extractor.v7( instruments=m1.data, features=m3.data, start_date='', end_date='', before_start_days=90 )
m16 = M.derived_feature_extractor.v3( input_data=m15.data, features=m3.data, date_col='date', instrument_col='instrument', drop_na=True, remove_extra_columns=False, user_functions={} )
m4 = M.dai_join.v1( data1=m2.data, data2=m16.data, on='date,instrument', how='inner', sort=False )
m13 = M.dropnan.v1( input_data=m4.data )
m6 = M.stock_ranker_train.v6( training_ds=m13.data, features=m3.data, learning_algorithm='排序', number_of_leaves=30, minimum_docs_per_leaf=1000, number_of_trees=20, learning_rate=0.1, max_bins=1023, feature_fraction=1, data_row_fraction=1, plot_charts=True, ndcg_discount_base=1, m_lazy_run=False )
m9 = M.instruments.v2( start_date=T.live_run_param('trading_date', '2021-01-01'), end_date=T.live_run_param('trading_date', '2021-12-31'), market='CN_STOCK_A', instrument_list="""603369.SHA 600779.SHA 000568.SZA 000860.SZA 000596.SZA 000858.SZA 002646.SZA 603919.SHA 002304.SZA 600702.SHA 603589.SHA 000799.SZA 600599.SHA 603198.SHA 600519.SHA 600199.SHA 600809.SHA 600197.SHA 600696.SHA""", max_count=0 )
m17 = M.general_feature_extractor.v7( instruments=m9.data, features=m3.data, start_date='', end_date='', before_start_days=90 )
m18 = M.derived_feature_extractor.v3( input_data=m17.data, features=m3.data, date_col='date', instrument_col='instrument', drop_na=True, remove_extra_columns=False, user_functions={} )
m14 = M.dropnan.v1( input_data=m18.data )
m8 = M.stock_ranker_predict.v5( model=m6.model, data=m14.data, m_lazy_run=False )
m19 = M.trade.v4( instruments=m9.data, options_data=m8.predictions, start_date='', end_date='', initialize=m19_initialize_bigquant_run, handle_data=m19_handle_data_bigquant_run, prepare=m19_prepare_bigquant_run, before_trading_start=m19_before_trading_start_bigquant_run, volume_limit=0.025, order_price_field_buy='open', order_price_field_sell='close', capital_base=1000000, auto_cancel_non_tradable_orders=True, data_frequency='daily', price_type='真实价格', product_type='股票', plot_charts=True, backtest_only=False, benchmark='000300.HIX' )
为什么说我出现这个错误呀,我已经设置m5了呀
[2023-06-15 17:18:37.934705] ERROR: moduleinvoker: module name: backtest, module version: v8, trackeback: KeyError: 'm5'
The above exception was the direct cause of the following exception:
KeyError: 'm5' [2023-06-15 17:18:37.947924] ERROR: moduleinvoker: module name: trade, module version: v4, trackeback: KeyError: 'm5'
The above exception was the direct cause of the following exception: