复制链接
克隆策略

策略简介

因子:样例因子(7个)

因子是否标准化:是

标注:未来5日收益(不做离散化)

算法:LSTM

类型:回归问题

训练集:10-16年

测试集:16-19年

选股依据:根据预测值降序排序买入

持股数:30

持仓天数:5

    {"description":"实验创建于2017/8/26","graph":{"edges":[{"to_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15:instruments","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-8:data"},{"to_node_id":"-106:instruments","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-8:data"},{"to_node_id":"-773:input_1","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15:data"},{"to_node_id":"-243:input_data","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data"},{"to_node_id":"-122:instruments","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"to_node_id":"-141:instruments","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"to_node_id":"-113:input_data","from_node_id":"-106:data"},{"to_node_id":"-768:input_1","from_node_id":"-113:data"},{"to_node_id":"-129:input_data","from_node_id":"-122:data"},{"to_node_id":"-2431:input_2","from_node_id":"-129:data"},{"to_node_id":"-778:input_1","from_node_id":"-129:data"},{"to_node_id":"-3880:inputs","from_node_id":"-160:data"},{"to_node_id":"-356:inputs","from_node_id":"-160:data"},{"to_node_id":"-1540:trained_model","from_node_id":"-1098:data"},{"to_node_id":"-2431:input_1","from_node_id":"-1540:data"},{"to_node_id":"-141:options_data","from_node_id":"-2431:data_1"},{"to_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data2","from_node_id":"-768:data"},{"to_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data1","from_node_id":"-773:data"},{"to_node_id":"-251:input_data","from_node_id":"-778:data"},{"to_node_id":"-3895:input_1","from_node_id":"-243:data"},{"to_node_id":"-3907:input_1","from_node_id":"-251:data"},{"to_node_id":"-1098:input_model","from_node_id":"-3880:data"},{"to_node_id":"-1098:training_data","from_node_id":"-3895:data_1"},{"to_node_id":"-1540:input_data","from_node_id":"-3907:data_1"},{"to_node_id":"-567:inputs","from_node_id":"-356:data"},{"to_node_id":"-412:inputs","from_node_id":"-567:data"},{"to_node_id":"-574:inputs","from_node_id":"-412:data"},{"to_node_id":"-440:inputs","from_node_id":"-574:data"},{"to_node_id":"-3880:outputs","from_node_id":"-440:data"},{"to_node_id":"-1331:data1","from_node_id":"-3136:data"},{"to_node_id":"-3159:instruments","from_node_id":"-3142:data"},{"to_node_id":"-3159:features","from_node_id":"-3154:data"},{"to_node_id":"-1331:data2","from_node_id":"-3159:data"},{"to_node_id":"-1337:features_ds","from_node_id":"-1331:data"},{"to_node_id":"-106:features","from_node_id":"-1337:data"},{"to_node_id":"-113:features","from_node_id":"-1337:data"},{"to_node_id":"-243:features","from_node_id":"-1337:data"},{"to_node_id":"-768:input_2","from_node_id":"-1337:data"},{"to_node_id":"-122:features","from_node_id":"-1337:data"},{"to_node_id":"-129:features","from_node_id":"-1337:data"},{"to_node_id":"-778:input_2","from_node_id":"-1337:data"},{"to_node_id":"-251:features","from_node_id":"-1337:data"}],"nodes":[{"node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-8","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2020-01-01","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"2021-06-30","type":"Literal","bound_global_parameter":null},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"300014.SZA\n002202.SZA\n600236.SHA\n600884.SHA\n300037.SZA\n002266.SZA\n300073.SZA\n600732.SHA\n002340.SZA\n002129.SZA\n601908.SHA\n300316.SZA\n601012.SHA\n603806.SHA\n601985.SHA\n603659.SHA\n300724.SZA\n300751.SZA\n300763.SZA\n688005.SHA\n003816.SZA\n688116.SHA\n688599.SHA\n300919.SZA\n600032.SHA\n600905.SHA\n600900.SHA\n600438.SHA\n600674.SHA\n002459.SZA\n002506.SZA\n300070.SZA\n002074.SZA\n600886.SHA\n000883.SZA\n300274.SZA\n002709.SZA\n300450.SZA\n603568.SHA\n603026.SHA\n002812.SZA\n603218.SHA\n600025.SHA\n300750.SZA\n603185.SHA\n601615.SHA\n601865.SHA\n688408.SHA\n688390.SHA\n003035.SZA\n","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":"0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-8"}],"output_ports":[{"name":"data","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-8"}],"cacheable":true,"seq_num":1,"comment":"","comment_collapsed":true},{"node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15","module_id":"BigQuantSpace.advanced_auto_labeler.advanced_auto_labeler-v2","parameters":[{"name":"label_expr","value":"# #号开始的表示注释\n# 0. 每行一个,顺序执行,从第二个开始,可以使用label字段\n# 1. 可用数据字段见 https://bigquant.com/docs/data_history_data.html\n# 添加benchmark_前缀,可使用对应的benchmark数据\n# 2. 可用操作符和函数见 `表达式引擎 <https://bigquant.com/docs/big_expr.html>`_\n\n# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)\nshift(close, -5) / shift(open, -1)-1\n\n# 极值处理:用1%和99%分位的值做clip\nclip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))\n\n# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)\nwhere(shift(high, -1) == shift(low, -1), NaN, label)\n","type":"Literal","bound_global_parameter":null},{"name":"start_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"benchmark","value":"h00977.CSI","type":"Literal","bound_global_parameter":null},{"name":"drop_na_label","value":"True","type":"Literal","bound_global_parameter":null},{"name":"cast_label_int","value":"False","type":"Literal","bound_global_parameter":null},{"name":"user_functions","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15"}],"output_ports":[{"name":"data","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15"}],"cacheable":true,"seq_num":2,"comment":"","comment_collapsed":true},{"node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53","module_id":"BigQuantSpace.join.join-v3","parameters":[{"name":"on","value":"date,instrument","type":"Literal","bound_global_parameter":null},{"name":"how","value":"inner","type":"Literal","bound_global_parameter":null},{"name":"sort","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"data1","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53"},{"name":"data2","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53"}],"output_ports":[{"name":"data","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53"}],"cacheable":true,"seq_num":7,"comment":"","comment_collapsed":true},{"node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2021-07-01","type":"Literal","bound_global_parameter":"交易日期"},{"name":"end_date","value":"2021-12-31","type":"Literal","bound_global_parameter":"交易日期"},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"300014.SZA\n002202.SZA\n600236.SHA\n600884.SHA\n300037.SZA\n002266.SZA\n300073.SZA\n600732.SHA\n002340.SZA\n002129.SZA\n601908.SHA\n300316.SZA\n601012.SHA\n603806.SHA\n601985.SHA\n603659.SHA\n300724.SZA\n300751.SZA\n300763.SZA\n688005.SHA\n003816.SZA\n688116.SHA\n688599.SHA\n300919.SZA\n600032.SHA\n600905.SHA\n600900.SHA\n600438.SHA\n600674.SHA\n002459.SZA\n002506.SZA\n300070.SZA\n002074.SZA\n600886.SHA\n000883.SZA\n300274.SZA\n002709.SZA\n300450.SZA\n603568.SHA\n603026.SHA\n002812.SZA\n603218.SHA\n600025.SHA\n300750.SZA\n603185.SHA\n601615.SHA\n601865.SHA\n688408.SHA\n688390.SHA\n003035.SZA\n","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":"0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62"}],"output_ports":[{"name":"data","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62"}],"cacheable":true,"seq_num":9,"comment":"预测数据,用于回测和模拟","comment_collapsed":false},{"node_id":"-106","module_id":"BigQuantSpace.general_feature_extractor.general_feature_extractor-v7","parameters":[{"name":"start_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"before_start_days","value":"30","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-106"},{"name":"features","node_id":"-106"}],"output_ports":[{"name":"data","node_id":"-106"}],"cacheable":true,"seq_num":15,"comment":"","comment_collapsed":true},{"node_id":"-113","module_id":"BigQuantSpace.derived_feature_extractor.derived_feature_extractor-v3","parameters":[{"name":"date_col","value":"date","type":"Literal","bound_global_parameter":null},{"name":"instrument_col","value":"instrument","type":"Literal","bound_global_parameter":null},{"name":"drop_na","value":"True","type":"Literal","bound_global_parameter":null},{"name":"remove_extra_columns","value":"False","type":"Literal","bound_global_parameter":null},{"name":"user_functions","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-113"},{"name":"features","node_id":"-113"}],"output_ports":[{"name":"data","node_id":"-113"}],"cacheable":true,"seq_num":16,"comment":"","comment_collapsed":true},{"node_id":"-122","module_id":"BigQuantSpace.general_feature_extractor.general_feature_extractor-v7","parameters":[{"name":"start_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"before_start_days","value":"30","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-122"},{"name":"features","node_id":"-122"}],"output_ports":[{"name":"data","node_id":"-122"}],"cacheable":true,"seq_num":17,"comment":"","comment_collapsed":true},{"node_id":"-129","module_id":"BigQuantSpace.derived_feature_extractor.derived_feature_extractor-v3","parameters":[{"name":"date_col","value":"date","type":"Literal","bound_global_parameter":null},{"name":"instrument_col","value":"instrument","type":"Literal","bound_global_parameter":null},{"name":"drop_na","value":"True","type":"Literal","bound_global_parameter":null},{"name":"remove_extra_columns","value":"False","type":"Literal","bound_global_parameter":null},{"name":"user_functions","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-129"},{"name":"features","node_id":"-129"}],"output_ports":[{"name":"data","node_id":"-129"}],"cacheable":true,"seq_num":18,"comment":"","comment_collapsed":true},{"node_id":"-141","module_id":"BigQuantSpace.trade.trade-v4","parameters":[{"name":"start_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"","type":"Literal","bound_global_parameter":null},{"name":"initialize","value":"# 回测引擎:初始化函数,只执行一次\ndef bigquant_run(context):\n # 加载预测数据\n context.ranker_prediction = context.options['data'].read_df()\n\n # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数\n context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))\n # 预测数据,通过options传入进来,使用 read_df 函数,加载到内存 (DataFrame)\n # 设置买入的股票数量,这里买入预测股票列表排名靠前的5只\n stock_count = 10\n # 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]\n context.stock_weights = T.norm([1 / math.log(i + 2) for i in range(0, stock_count)])\n # 设置每只股票占用的最大资金比例\n context.max_cash_per_instrument = 0.9\n context.options['hold_days'] = 5","type":"Literal","bound_global_parameter":null},{"name":"handle_data","value":"# 回测引擎:每日数据处理函数,每天执行一次\ndef bigquant_run(context, data):\n # 按日期过滤得到今日的预测数据\n ranker_prediction = context.ranker_prediction[\n context.ranker_prediction.date == data.current_dt.strftime('%Y-%m-%d')]\n\n # 1. 资金分配\n # 平均持仓时间是hold_days,每日都将买入股票,每日预期使用 1/hold_days 的资金\n # 实际操作中,会存在一定的买入误差,所以在前hold_days天,等量使用资金;之后,尽量使用剩余资金(这里设置最多用等量的1.5倍)\n is_staging = context.trading_day_index < context.options['hold_days'] # 是否在建仓期间(前 hold_days 天)\n cash_avg = context.portfolio.portfolio_value / context.options['hold_days']\n cash_for_buy = min(context.portfolio.cash, (1 if is_staging else 1.5) * cash_avg)\n cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy)\n positions = {e.symbol: p.amount * p.last_sale_price\n for e, p in context.perf_tracker.position_tracker.positions.items()}\n\n # 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰\n if not is_staging and cash_for_sell > 0:\n equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()}\n instruments = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(\n lambda x: x in equities and not context.has_unfinished_sell_order(equities[x]))])))\n # print('rank order for sell %s' % instruments)\n for instrument in instruments:\n context.order_target(context.symbol(instrument), 0)\n cash_for_sell -= positions[instrument]\n if cash_for_sell <= 0:\n break\n\n # 3. 生成买入订单:按机器学习算法预测的排序,买入前面的stock_count只股票\n buy_cash_weights = context.stock_weights\n buy_instruments = list(ranker_prediction.instrument[:len(buy_cash_weights)])\n max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument\n for i, instrument in enumerate(buy_instruments):\n cash = cash_for_buy * buy_cash_weights[i]\n if cash > max_cash_per_instrument - positions.get(instrument, 0):\n # 确保股票持仓量不会超过每次股票最大的占用资金量\n cash = max_cash_per_instrument - positions.get(instrument, 0)\n if cash > 0:\n context.order_value(context.symbol(instrument), cash)\n","type":"Literal","bound_global_parameter":null},{"name":"prepare","value":"# 回测引擎:准备数据,只执行一次\ndef bigquant_run(context):\n pass\n","type":"Literal","bound_global_parameter":null},{"name":"before_trading_start","value":"","type":"Literal","bound_global_parameter":null},{"name":"volume_limit","value":0.025,"type":"Literal","bound_global_parameter":null},{"name":"order_price_field_buy","value":"open","type":"Literal","bound_global_parameter":null},{"name":"order_price_field_sell","value":"close","type":"Literal","bound_global_parameter":null},{"name":"capital_base","value":1000000,"type":"Literal","bound_global_parameter":null},{"name":"auto_cancel_non_tradable_orders","value":"True","type":"Literal","bound_global_parameter":null},{"name":"data_frequency","value":"daily","type":"Literal","bound_global_parameter":null},{"name":"price_type","value":"后复权","type":"Literal","bound_global_parameter":null},{"name":"product_type","value":"股票","type":"Literal","bound_global_parameter":null},{"name":"plot_charts","value":"True","type":"Literal","bound_global_parameter":null},{"name":"backtest_only","value":"False","type":"Literal","bound_global_parameter":null},{"name":"benchmark","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-141"},{"name":"options_data","node_id":"-141"},{"name":"history_ds","node_id":"-141"},{"name":"benchmark_ds","node_id":"-141"},{"name":"trading_calendar","node_id":"-141"}],"output_ports":[{"name":"raw_perf","node_id":"-141"}],"cacheable":false,"seq_num":19,"comment":"","comment_collapsed":true},{"node_id":"-160","module_id":"BigQuantSpace.dl_layer_input.dl_layer_input-v1","parameters":[{"name":"shape","value":"16,10","type":"Literal","bound_global_parameter":null},{"name":"batch_shape","value":"","type":"Literal","bound_global_parameter":null},{"name":"dtype","value":"float32","type":"Literal","bound_global_parameter":null},{"name":"sparse","value":"False","type":"Literal","bound_global_parameter":null},{"name":"name","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"inputs","node_id":"-160"}],"output_ports":[{"name":"data","node_id":"-160"}],"cacheable":false,"seq_num":6,"comment":"","comment_collapsed":true},{"node_id":"-1098","module_id":"BigQuantSpace.dl_model_train.dl_model_train-v1","parameters":[{"name":"optimizer","value":"RMSprop","type":"Literal","bound_global_parameter":null},{"name":"user_optimizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"loss","value":"mean_squared_error","type":"Literal","bound_global_parameter":null},{"name":"user_loss","value":"","type":"Literal","bound_global_parameter":null},{"name":"metrics","value":"mae","type":"Literal","bound_global_parameter":null},{"name":"batch_size","value":"256","type":"Literal","bound_global_parameter":null},{"name":"epochs","value":"5","type":"Literal","bound_global_parameter":null},{"name":"earlystop","value":"","type":"Literal","bound_global_parameter":null},{"name":"custom_objects","value":"# 用户的自定义层需要写到字典中,比如\n# {\n# \"MyLayer\": MyLayer\n# }\nbigquant_run = {\n \n}\n","type":"Literal","bound_global_parameter":null},{"name":"n_gpus","value":0,"type":"Literal","bound_global_parameter":null},{"name":"verbose","value":"2:每个epoch输出一行记录","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_model","node_id":"-1098"},{"name":"training_data","node_id":"-1098"},{"name":"validation_data","node_id":"-1098"}],"output_ports":[{"name":"data","node_id":"-1098"}],"cacheable":true,"seq_num":5,"comment":"","comment_collapsed":true},{"node_id":"-1540","module_id":"BigQuantSpace.dl_model_predict.dl_model_predict-v1","parameters":[{"name":"batch_size","value":"1024","type":"Literal","bound_global_parameter":null},{"name":"n_gpus","value":0,"type":"Literal","bound_global_parameter":null},{"name":"verbose","value":"2:每个epoch输出一行记录","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"trained_model","node_id":"-1540"},{"name":"input_data","node_id":"-1540"}],"output_ports":[{"name":"data","node_id":"-1540"}],"cacheable":true,"seq_num":11,"comment":"","comment_collapsed":true},{"node_id":"-2431","module_id":"BigQuantSpace.cached.cached-v3","parameters":[{"name":"run","value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n # 示例代码如下。在这里编写您的代码\n pred_label = input_1.read_pickle()\n df = input_2.read_df()\n df = pd.DataFrame({'pred_label':pred_label[:,0], 'instrument':df.instrument, 'date':df.date})\n df.sort_values(['date','pred_label'],inplace=True, ascending=[True,False])\n return Outputs(data_1=DataSource.write_df(df), data_2=None, data_3=None)\n","type":"Literal","bound_global_parameter":null},{"name":"post_run","value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","type":"Literal","bound_global_parameter":null},{"name":"input_ports","value":"","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-2431"},{"name":"input_2","node_id":"-2431"},{"name":"input_3","node_id":"-2431"}],"output_ports":[{"name":"data_1","node_id":"-2431"},{"name":"data_2","node_id":"-2431"},{"name":"data_3","node_id":"-2431"}],"cacheable":true,"seq_num":24,"comment":"","comment_collapsed":true},{"node_id":"-768","module_id":"BigQuantSpace.standardlize.standardlize-v8","parameters":[{"name":"columns_input","value":"[]","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-768"},{"name":"input_2","node_id":"-768"}],"output_ports":[{"name":"data","node_id":"-768"}],"cacheable":true,"seq_num":14,"comment":"","comment_collapsed":true},{"node_id":"-773","module_id":"BigQuantSpace.standardlize.standardlize-v8","parameters":[{"name":"columns_input","value":"label","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-773"},{"name":"input_2","node_id":"-773"}],"output_ports":[{"name":"data","node_id":"-773"}],"cacheable":true,"seq_num":13,"comment":"","comment_collapsed":true},{"node_id":"-778","module_id":"BigQuantSpace.standardlize.standardlize-v8","parameters":[{"name":"columns_input","value":"[]","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-778"},{"name":"input_2","node_id":"-778"}],"output_ports":[{"name":"data","node_id":"-778"}],"cacheable":true,"seq_num":25,"comment":"","comment_collapsed":true},{"node_id":"-243","module_id":"BigQuantSpace.dl_convert_to_bin.dl_convert_to_bin-v2","parameters":[{"name":"window_size","value":"10","type":"Literal","bound_global_parameter":null},{"name":"feature_clip","value":5,"type":"Literal","bound_global_parameter":null},{"name":"flatten","value":"True","type":"Literal","bound_global_parameter":null},{"name":"window_along_col","value":"instrument","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-243"},{"name":"features","node_id":"-243"}],"output_ports":[{"name":"data","node_id":"-243"}],"cacheable":true,"seq_num":26,"comment":"","comment_collapsed":true},{"node_id":"-251","module_id":"BigQuantSpace.dl_convert_to_bin.dl_convert_to_bin-v2","parameters":[{"name":"window_size","value":"10","type":"Literal","bound_global_parameter":null},{"name":"feature_clip","value":5,"type":"Literal","bound_global_parameter":null},{"name":"flatten","value":"True","type":"Literal","bound_global_parameter":null},{"name":"window_along_col","value":"instrument","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-251"},{"name":"features","node_id":"-251"}],"output_ports":[{"name":"data","node_id":"-251"}],"cacheable":true,"seq_num":27,"comment":"","comment_collapsed":true},{"node_id":"-3880","module_id":"BigQuantSpace.dl_model_init.dl_model_init-v1","parameters":[],"input_ports":[{"name":"inputs","node_id":"-3880"},{"name":"outputs","node_id":"-3880"}],"output_ports":[{"name":"data","node_id":"-3880"}],"cacheable":false,"seq_num":34,"comment":"","comment_collapsed":true},{"node_id":"-3895","module_id":"BigQuantSpace.cached.cached-v3","parameters":[{"name":"run","value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n # 示例代码如下。在这里编写您的代码\n df = input_1.read_pickle()\n feature_len = len(input_2.read_pickle())\n \n \n df['x'] = df['x'].reshape(df['x'].shape[0], int(feature_len), int(df['x'].shape[1]/feature_len))\n \n data_1 = DataSource.write_pickle(df)\n return Outputs(data_1=data_1)\n","type":"Literal","bound_global_parameter":null},{"name":"post_run","value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","type":"Literal","bound_global_parameter":null},{"name":"input_ports","value":"","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-3895"},{"name":"input_2","node_id":"-3895"},{"name":"input_3","node_id":"-3895"}],"output_ports":[{"name":"data_1","node_id":"-3895"},{"name":"data_2","node_id":"-3895"},{"name":"data_3","node_id":"-3895"}],"cacheable":true,"seq_num":4,"comment":"","comment_collapsed":true},{"node_id":"-3907","module_id":"BigQuantSpace.cached.cached-v3","parameters":[{"name":"run","value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n # 示例代码如下。在这里编写您的代码\n df = input_1.read_pickle()\n feature_len = len(input_2.read_pickle())\n \n \n df['x'] = df['x'].reshape(df['x'].shape[0], int(feature_len), int(df['x'].shape[1]/feature_len))\n \n data_1 = DataSource.write_pickle(df)\n return Outputs(data_1=data_1)\n","type":"Literal","bound_global_parameter":null},{"name":"post_run","value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","type":"Literal","bound_global_parameter":null},{"name":"input_ports","value":"","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-3907"},{"name":"input_2","node_id":"-3907"},{"name":"input_3","node_id":"-3907"}],"output_ports":[{"name":"data_1","node_id":"-3907"},{"name":"data_2","node_id":"-3907"},{"name":"data_3","node_id":"-3907"}],"cacheable":true,"seq_num":8,"comment":"","comment_collapsed":true},{"node_id":"-356","module_id":"BigQuantSpace.dl_layer_lstm.dl_layer_lstm-v1","parameters":[{"name":"units","value":"32","type":"Literal","bound_global_parameter":null},{"name":"activation","value":"tanh","type":"Literal","bound_global_parameter":null},{"name":"user_activation","value":"","type":"Literal","bound_global_parameter":null},{"name":"recurrent_activation","value":"hard_sigmoid","type":"Literal","bound_global_parameter":null},{"name":"user_recurrent_activation","value":"","type":"Literal","bound_global_parameter":null},{"name":"use_bias","value":"True","type":"Literal","bound_global_parameter":null},{"name":"kernel_initializer","value":"glorot_uniform","type":"Literal","bound_global_parameter":null},{"name":"user_kernel_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"recurrent_initializer","value":"Orthogonal","type":"Literal","bound_global_parameter":null},{"name":"user_recurrent_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_initializer","value":"Zeros","type":"Literal","bound_global_parameter":null},{"name":"user_bias_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"unit_forget_bias","value":"True","type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_kernel_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"recurrent_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"recurrent_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"recurrent_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_recurrent_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_bias_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_activity_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"kernel_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_kernel_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"recurrent_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_recurrent_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_bias_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"dropout","value":0,"type":"Literal","bound_global_parameter":null},{"name":"recurrent_dropout","value":0,"type":"Literal","bound_global_parameter":null},{"name":"return_sequences","value":"False","type":"Literal","bound_global_parameter":null},{"name":"implementation","value":"0","type":"Literal","bound_global_parameter":null},{"name":"name","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"inputs","node_id":"-356"}],"output_ports":[{"name":"data","node_id":"-356"}],"cacheable":false,"seq_num":10,"comment":"","comment_collapsed":true},{"node_id":"-567","module_id":"BigQuantSpace.dl_layer_dropout.dl_layer_dropout-v1","parameters":[{"name":"rate","value":"0.2","type":"Literal","bound_global_parameter":null},{"name":"noise_shape","value":"","type":"Literal","bound_global_parameter":null},{"name":"seed","value":"","type":"Literal","bound_global_parameter":null},{"name":"name","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"inputs","node_id":"-567"}],"output_ports":[{"name":"data","node_id":"-567"}],"cacheable":false,"seq_num":12,"comment":"","comment_collapsed":true},{"node_id":"-412","module_id":"BigQuantSpace.dl_layer_dense.dl_layer_dense-v1","parameters":[{"name":"units","value":"32","type":"Literal","bound_global_parameter":null},{"name":"activation","value":"tanh","type":"Literal","bound_global_parameter":null},{"name":"user_activation","value":"","type":"Literal","bound_global_parameter":null},{"name":"use_bias","value":"True","type":"Literal","bound_global_parameter":null},{"name":"kernel_initializer","value":"glorot_uniform","type":"Literal","bound_global_parameter":null},{"name":"user_kernel_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_initializer","value":"Zeros","type":"Literal","bound_global_parameter":null},{"name":"user_bias_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_kernel_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_bias_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_activity_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"kernel_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_kernel_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_bias_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"name","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"inputs","node_id":"-412"}],"output_ports":[{"name":"data","node_id":"-412"}],"cacheable":false,"seq_num":20,"comment":"","comment_collapsed":true},{"node_id":"-574","module_id":"BigQuantSpace.dl_layer_dropout.dl_layer_dropout-v1","parameters":[{"name":"rate","value":"0.2","type":"Literal","bound_global_parameter":null},{"name":"noise_shape","value":"","type":"Literal","bound_global_parameter":null},{"name":"seed","value":"","type":"Literal","bound_global_parameter":null},{"name":"name","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"inputs","node_id":"-574"}],"output_ports":[{"name":"data","node_id":"-574"}],"cacheable":false,"seq_num":21,"comment":"","comment_collapsed":true},{"node_id":"-440","module_id":"BigQuantSpace.dl_layer_dense.dl_layer_dense-v1","parameters":[{"name":"units","value":"1","type":"Literal","bound_global_parameter":null},{"name":"activation","value":"tanh","type":"Literal","bound_global_parameter":null},{"name":"user_activation","value":"","type":"Literal","bound_global_parameter":null},{"name":"use_bias","value":"True","type":"Literal","bound_global_parameter":null},{"name":"kernel_initializer","value":"glorot_uniform","type":"Literal","bound_global_parameter":null},{"name":"user_kernel_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_initializer","value":"Zeros","type":"Literal","bound_global_parameter":null},{"name":"user_bias_initializer","value":"","type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"kernel_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_kernel_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"bias_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_bias_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer","value":"None","type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer_l1","value":0,"type":"Literal","bound_global_parameter":null},{"name":"activity_regularizer_l2","value":0,"type":"Literal","bound_global_parameter":null},{"name":"user_activity_regularizer","value":"","type":"Literal","bound_global_parameter":null},{"name":"kernel_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_kernel_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"bias_constraint","value":"None","type":"Literal","bound_global_parameter":null},{"name":"user_bias_constraint","value":"","type":"Literal","bound_global_parameter":null},{"name":"name","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"inputs","node_id":"-440"}],"output_ports":[{"name":"data","node_id":"-440"}],"cacheable":false,"seq_num":22,"comment":"","comment_collapsed":true},{"node_id":"-3136","module_id":"BigQuantSpace.use_datasource.use_datasource-v1","parameters":[{"name":"datasource_id","value":"874ec1faafd8491f84154f1e86f79f4cT","type":"Literal","bound_global_parameter":null},{"name":"start_date","value":"2020-01-01","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"2021-12-31","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-3136"},{"name":"features","node_id":"-3136"}],"output_ports":[{"name":"data","node_id":"-3136"}],"cacheable":true,"seq_num":23,"comment":"","comment_collapsed":true},{"node_id":"-3142","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2020-01-01","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"2021-12-31","type":"Literal","bound_global_parameter":null},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"300014.SZA\n002202.SZA\n600236.SHA\n600884.SHA\n300037.SZA\n002266.SZA\n300073.SZA\n600732.SHA\n002340.SZA\n002129.SZA\n601908.SHA\n300316.SZA\n601012.SHA\n603806.SHA\n601985.SHA\n603659.SHA\n300724.SZA\n300751.SZA\n300763.SZA\n688005.SHA\n003816.SZA\n688116.SHA\n688599.SHA\n300919.SZA\n600032.SHA\n600905.SHA\n600900.SHA\n600438.SHA\n600674.SHA\n002459.SZA\n002506.SZA\n300070.SZA\n002074.SZA\n600886.SHA\n000883.SZA\n300274.SZA\n002709.SZA\n300450.SZA\n603568.SHA\n603026.SHA\n002812.SZA\n603218.SHA\n600025.SHA\n300750.SZA\n603185.SHA\n601615.SHA\n601865.SHA\n688408.SHA\n688390.SHA\n003035.SZA\n","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":0,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"-3142"}],"output_ports":[{"name":"data","node_id":"-3142"}],"cacheable":true,"seq_num":28,"comment":"","comment_collapsed":true},{"node_id":"-3154","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\nlow_0\nta_ma(close_0, timeperiod=5)\nta_ma(close_0, timeperiod=10)\nta_ma(close_0, timeperiod=15)\nmarket_cap_0/close_0\nfs_current_assets_0/fs_current_liabilities_0\nfs_bps_0\nfs_cash_equivalents_0/fs_current_liabilities_0\nmarket_cap_float_0\nmarket_cap_float_0/close_0\nfs_eps_0\ndeal_number_0\nclose_0\nopen_0\nhigh_0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-3154"}],"output_ports":[{"name":"data","node_id":"-3154"}],"cacheable":true,"seq_num":30,"comment":"","comment_collapsed":true},{"node_id":"-3159","module_id":"BigQuantSpace.general_feature_extractor.general_feature_extractor-v7","parameters":[{"name":"start_date","value":"2020-01-01","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"2021-12-31","type":"Literal","bound_global_parameter":null},{"name":"before_start_days","value":90,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-3159"},{"name":"features","node_id":"-3159"}],"output_ports":[{"name":"data","node_id":"-3159"}],"cacheable":true,"seq_num":31,"comment":"","comment_collapsed":true},{"node_id":"-1331","module_id":"BigQuantSpace.join.join-v3","parameters":[{"name":"on","value":"date,instrument","type":"Literal","bound_global_parameter":null},{"name":"how","value":"inner","type":"Literal","bound_global_parameter":null},{"name":"sort","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"data1","node_id":"-1331"},{"name":"data2","node_id":"-1331"}],"output_ports":[{"name":"data","node_id":"-1331"}],"cacheable":true,"seq_num":3,"comment":"","comment_collapsed":true},{"node_id":"-1337","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\nlow_0\nta_ma(close_0, timeperiod=5)\nta_ma(close_0, timeperiod=10)\nta_ma(close_0, timeperiod=15)\nmarket_cap_0/close_0\nfs_current_assets_0/fs_current_liabilities_0\nfs_bps_0\nfs_cash_equivalents_0/fs_current_liabilities_0\nmarket_cap_float_0\nmarket_cap_float_0/close_0\nfs_eps_0\ndeal_number_0\nclose_0\nopen_0\nhigh_0\nnews","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-1337"}],"output_ports":[{"name":"data","node_id":"-1337"}],"cacheable":true,"seq_num":29,"comment":"","comment_collapsed":true}],"node_layout":"<node_postions><node_position Node='287d2cb0-f53c-4101-bdf8-104b137c8601-8' Position='391,23,200,200'/><node_position Node='287d2cb0-f53c-4101-bdf8-104b137c8601-15' Position='208,222,200,200'/><node_position Node='287d2cb0-f53c-4101-bdf8-104b137c8601-53' Position='379,435,200,200'/><node_position Node='287d2cb0-f53c-4101-bdf8-104b137c8601-62' Position='1074,139,200,200'/><node_position Node='-106' Position='547,173,200,200'/><node_position Node='-113' Position='548,275,200,200'/><node_position Node='-122' Position='1078,236,200,200'/><node_position Node='-129' Position='1081,327,200,200'/><node_position Node='-141' Position='562,1031,200,200'/><node_position Node='-160' Position='-279,-153,200,200'/><node_position Node='-1098' Position='137,642,200,200'/><node_position Node='-1540' Position='203,733,200,200'/><node_position Node='-2431' Position='345,827,200,200'/><node_position Node='-768' Position='683,355,200,200'/><node_position Node='-773' Position='200,329,200,200'/><node_position Node='-778' Position='1067,432,200,200'/><node_position Node='-243' Position='381,513,200,200'/><node_position Node='-251' Position='1059,508,200,200'/><node_position Node='-3880' Position='-136,516,200,200'/><node_position Node='-3895' Position='385,585,200,200'/><node_position Node='-3907' Position='1056,590,200,200'/><node_position Node='-356' Position='-281,-31,200,200'/><node_position Node='-567' Position='-279,65,200,200'/><node_position Node='-412' Position='-277,154,200,200'/><node_position Node='-574' Position='-276,242,200,200'/><node_position Node='-440' Position='-280,333,200,200'/><node_position Node='-3136' Position='349,-435,200,200'/><node_position Node='-3142' Position='657,-469,200,200'/><node_position Node='-3154' Position='905,-392,200,200'/><node_position Node='-3159' Position='628,-342,200,200'/><node_position Node='-1331' Position='515,-224,200,200'/><node_position Node='-1337' Position='736.2979125976562,-114,200,200'/></node_postions>"},"nodes_readonly":false,"studio_version":"v2"}
    In [5]:
    # 本代码由可视化策略环境自动生成 2022年3月22日 00:12
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
    
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m4_run_bigquant_run(input_1, input_2, input_3):
        # 示例代码如下。在这里编写您的代码
        df =  input_1.read_pickle()
        feature_len = len(input_2.read_pickle())
        
        
        df['x'] = df['x'].reshape(df['x'].shape[0], int(feature_len), int(df['x'].shape[1]/feature_len))
        
        data_1 = DataSource.write_pickle(df)
        return Outputs(data_1=data_1)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m4_post_run_bigquant_run(outputs):
        return outputs
    
    # 用户的自定义层需要写到字典中,比如
    # {
    #   "MyLayer": MyLayer
    # }
    m5_custom_objects_bigquant_run = {
        
    }
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m8_run_bigquant_run(input_1, input_2, input_3):
        # 示例代码如下。在这里编写您的代码
        df =  input_1.read_pickle()
        feature_len = len(input_2.read_pickle())
        
        
        df['x'] = df['x'].reshape(df['x'].shape[0], int(feature_len), int(df['x'].shape[1]/feature_len))
        
        data_1 = DataSource.write_pickle(df)
        return Outputs(data_1=data_1)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m8_post_run_bigquant_run(outputs):
        return outputs
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m24_run_bigquant_run(input_1, input_2, input_3):
        # 示例代码如下。在这里编写您的代码
        pred_label = input_1.read_pickle()
        df = input_2.read_df()
        df = pd.DataFrame({'pred_label':pred_label[:,0], 'instrument':df.instrument, 'date':df.date})
        df.sort_values(['date','pred_label'],inplace=True, ascending=[True,False])
        return Outputs(data_1=DataSource.write_df(df), data_2=None, data_3=None)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m24_post_run_bigquant_run(outputs):
        return outputs
    
    # 回测引擎:初始化函数,只执行一次
    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 = 10
        # 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[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.9
        context.options['hold_days'] = 5
    # 回测引擎:每日数据处理函数,每天执行一次
    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]))])))
            # print('rank order for sell %s' % instruments)
            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
    
    
    m1 = M.instruments.v2(
        start_date='2020-01-01',
        end_date='2021-06-30',
        market='CN_STOCK_A',
        instrument_list="""300014.SZA
    002202.SZA
    600236.SHA
    600884.SHA
    300037.SZA
    002266.SZA
    300073.SZA
    600732.SHA
    002340.SZA
    002129.SZA
    601908.SHA
    300316.SZA
    601012.SHA
    603806.SHA
    601985.SHA
    603659.SHA
    300724.SZA
    300751.SZA
    300763.SZA
    688005.SHA
    003816.SZA
    688116.SHA
    688599.SHA
    300919.SZA
    600032.SHA
    600905.SHA
    600900.SHA
    600438.SHA
    600674.SHA
    002459.SZA
    002506.SZA
    300070.SZA
    002074.SZA
    600886.SHA
    000883.SZA
    300274.SZA
    002709.SZA
    300450.SZA
    603568.SHA
    603026.SHA
    002812.SZA
    603218.SHA
    600025.SHA
    300750.SZA
    603185.SHA
    601615.SHA
    601865.SHA
    688408.SHA
    688390.SHA
    003035.SZA
    """,
        max_count=0
    )
    
    m2 = M.advanced_auto_labeler.v2(
        instruments=m1.data,
        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, -5) / shift(open, -1)-1
    
    # 极值处理:用1%和99%分位的值做clip
    clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
    
    # 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
    where(shift(high, -1) == shift(low, -1), NaN, label)
    """,
        start_date='',
        end_date='',
        benchmark='h00977.CSI',
        drop_na_label=True,
        cast_label_int=False
    )
    
    m13 = M.standardlize.v8(
        input_1=m2.data,
        columns_input='label'
    )
    
    m9 = M.instruments.v2(
        start_date=T.live_run_param('trading_date', '2021-07-01'),
        end_date=T.live_run_param('trading_date', '2021-12-31'),
        market='CN_STOCK_A',
        instrument_list="""300014.SZA
    002202.SZA
    600236.SHA
    600884.SHA
    300037.SZA
    002266.SZA
    300073.SZA
    600732.SHA
    002340.SZA
    002129.SZA
    601908.SHA
    300316.SZA
    601012.SHA
    603806.SHA
    601985.SHA
    603659.SHA
    300724.SZA
    300751.SZA
    300763.SZA
    688005.SHA
    003816.SZA
    688116.SHA
    688599.SHA
    300919.SZA
    600032.SHA
    600905.SHA
    600900.SHA
    600438.SHA
    600674.SHA
    002459.SZA
    002506.SZA
    300070.SZA
    002074.SZA
    600886.SHA
    000883.SZA
    300274.SZA
    002709.SZA
    300450.SZA
    603568.SHA
    603026.SHA
    002812.SZA
    603218.SHA
    600025.SHA
    300750.SZA
    603185.SHA
    601615.SHA
    601865.SHA
    688408.SHA
    688390.SHA
    003035.SZA
    """,
        max_count=0
    )
    
    m6 = M.dl_layer_input.v1(
        shape='16,10',
        batch_shape='',
        dtype='float32',
        sparse=False,
        name=''
    )
    
    m10 = M.dl_layer_lstm.v1(
        inputs=m6.data,
        units=32,
        activation='tanh',
        recurrent_activation='hard_sigmoid',
        use_bias=True,
        kernel_initializer='glorot_uniform',
        recurrent_initializer='Orthogonal',
        bias_initializer='Zeros',
        unit_forget_bias=True,
        kernel_regularizer='None',
        kernel_regularizer_l1=0,
        kernel_regularizer_l2=0,
        recurrent_regularizer='None',
        recurrent_regularizer_l1=0,
        recurrent_regularizer_l2=0,
        bias_regularizer='None',
        bias_regularizer_l1=0,
        bias_regularizer_l2=0,
        activity_regularizer='None',
        activity_regularizer_l1=0,
        activity_regularizer_l2=0,
        kernel_constraint='None',
        recurrent_constraint='None',
        bias_constraint='None',
        dropout=0,
        recurrent_dropout=0,
        return_sequences=False,
        implementation='0',
        name=''
    )
    
    m12 = M.dl_layer_dropout.v1(
        inputs=m10.data,
        rate=0.2,
        noise_shape='',
        name=''
    )
    
    m20 = M.dl_layer_dense.v1(
        inputs=m12.data,
        units=32,
        activation='tanh',
        use_bias=True,
        kernel_initializer='glorot_uniform',
        bias_initializer='Zeros',
        kernel_regularizer='None',
        kernel_regularizer_l1=0,
        kernel_regularizer_l2=0,
        bias_regularizer='None',
        bias_regularizer_l1=0,
        bias_regularizer_l2=0,
        activity_regularizer='None',
        activity_regularizer_l1=0,
        activity_regularizer_l2=0,
        kernel_constraint='None',
        bias_constraint='None',
        name=''
    )
    
    m21 = M.dl_layer_dropout.v1(
        inputs=m20.data,
        rate=0.2,
        noise_shape='',
        name=''
    )
    
    m22 = M.dl_layer_dense.v1(
        inputs=m21.data,
        units=1,
        activation='tanh',
        use_bias=True,
        kernel_initializer='glorot_uniform',
        bias_initializer='Zeros',
        kernel_regularizer='None',
        kernel_regularizer_l1=0,
        kernel_regularizer_l2=0,
        bias_regularizer='None',
        bias_regularizer_l1=0,
        bias_regularizer_l2=0,
        activity_regularizer='None',
        activity_regularizer_l1=0,
        activity_regularizer_l2=0,
        kernel_constraint='None',
        bias_constraint='None',
        name=''
    )
    
    m34 = M.dl_model_init.v1(
        inputs=m6.data,
        outputs=m22.data
    )
    
    m23 = M.use_datasource.v1(
        datasource_id='874ec1faafd8491f84154f1e86f79f4cT',
        start_date='2020-01-01',
        end_date='2021-12-31'
    )
    
    m28 = M.instruments.v2(
        start_date='2020-01-01',
        end_date='2021-12-31',
        market='CN_STOCK_A',
        instrument_list="""300014.SZA
    002202.SZA
    600236.SHA
    600884.SHA
    300037.SZA
    002266.SZA
    300073.SZA
    600732.SHA
    002340.SZA
    002129.SZA
    601908.SHA
    300316.SZA
    601012.SHA
    603806.SHA
    601985.SHA
    603659.SHA
    300724.SZA
    300751.SZA
    300763.SZA
    688005.SHA
    003816.SZA
    688116.SHA
    688599.SHA
    300919.SZA
    600032.SHA
    600905.SHA
    600900.SHA
    600438.SHA
    600674.SHA
    002459.SZA
    002506.SZA
    300070.SZA
    002074.SZA
    600886.SHA
    000883.SZA
    300274.SZA
    002709.SZA
    300450.SZA
    603568.SHA
    603026.SHA
    002812.SZA
    603218.SHA
    600025.SHA
    300750.SZA
    603185.SHA
    601615.SHA
    601865.SHA
    688408.SHA
    688390.SHA
    003035.SZA
    """,
        max_count=0
    )
    
    m30 = M.input_features.v1(
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    low_0
    ta_ma(close_0, timeperiod=5)
    ta_ma(close_0, timeperiod=10)
    ta_ma(close_0, timeperiod=15)
    market_cap_0/close_0
    fs_current_assets_0/fs_current_liabilities_0
    fs_bps_0
    fs_cash_equivalents_0/fs_current_liabilities_0
    market_cap_float_0
    market_cap_float_0/close_0
    fs_eps_0
    deal_number_0
    close_0
    open_0
    high_0"""
    )
    
    m31 = M.general_feature_extractor.v7(
        instruments=m28.data,
        features=m30.data,
        start_date='2020-01-01',
        end_date='2021-12-31',
        before_start_days=90
    )
    
    m3 = M.join.v3(
        data1=m23.data,
        data2=m31.data,
        on='date,instrument',
        how='inner',
        sort=False
    )
    
    m29 = M.input_features.v1(
        features_ds=m3.data,
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    low_0
    ta_ma(close_0, timeperiod=5)
    ta_ma(close_0, timeperiod=10)
    ta_ma(close_0, timeperiod=15)
    market_cap_0/close_0
    fs_current_assets_0/fs_current_liabilities_0
    fs_bps_0
    fs_cash_equivalents_0/fs_current_liabilities_0
    market_cap_float_0
    market_cap_float_0/close_0
    fs_eps_0
    deal_number_0
    close_0
    open_0
    high_0
    news"""
    )
    
    m15 = M.general_feature_extractor.v7(
        instruments=m1.data,
        features=m29.data,
        start_date='',
        end_date='',
        before_start_days=30
    )
    
    m16 = M.derived_feature_extractor.v3(
        input_data=m15.data,
        features=m29.data,
        date_col='date',
        instrument_col='instrument',
        drop_na=True,
        remove_extra_columns=False
    )
    
    m14 = M.standardlize.v8(
        input_1=m16.data,
        input_2=m29.data,
        columns_input='[]'
    )
    
    m7 = M.join.v3(
        data1=m13.data,
        data2=m14.data,
        on='date,instrument',
        how='inner',
        sort=False
    )
    
    m26 = M.dl_convert_to_bin.v2(
        input_data=m7.data,
        features=m29.data,
        window_size=10,
        feature_clip=5,
        flatten=True,
        window_along_col='instrument'
    )
    
    m4 = M.cached.v3(
        input_1=m26.data,
        run=m4_run_bigquant_run,
        post_run=m4_post_run_bigquant_run,
        input_ports='',
        params='{}',
        output_ports=''
    )
    
    m5 = M.dl_model_train.v1(
        input_model=m34.data,
        training_data=m4.data_1,
        optimizer='RMSprop',
        loss='mean_squared_error',
        metrics='mae',
        batch_size=256,
        epochs=5,
        custom_objects=m5_custom_objects_bigquant_run,
        n_gpus=0,
        verbose='2:每个epoch输出一行记录'
    )
    
    m17 = M.general_feature_extractor.v7(
        instruments=m9.data,
        features=m29.data,
        start_date='',
        end_date='',
        before_start_days=30
    )
    
    m18 = M.derived_feature_extractor.v3(
        input_data=m17.data,
        features=m29.data,
        date_col='date',
        instrument_col='instrument',
        drop_na=True,
        remove_extra_columns=False
    )
    
    m25 = M.standardlize.v8(
        input_1=m18.data,
        input_2=m29.data,
        columns_input='[]'
    )
    
    m27 = M.dl_convert_to_bin.v2(
        input_data=m25.data,
        features=m29.data,
        window_size=10,
        feature_clip=5,
        flatten=True,
        window_along_col='instrument'
    )
    
    m8 = M.cached.v3(
        input_1=m27.data,
        run=m8_run_bigquant_run,
        post_run=m8_post_run_bigquant_run,
        input_ports='',
        params='{}',
        output_ports=''
    )
    
    m11 = M.dl_model_predict.v1(
        trained_model=m5.data,
        input_data=m8.data_1,
        batch_size=1024,
        n_gpus=0,
        verbose='2:每个epoch输出一行记录'
    )
    
    m24 = M.cached.v3(
        input_1=m11.data,
        input_2=m18.data,
        run=m24_run_bigquant_run,
        post_run=m24_post_run_bigquant_run,
        input_ports='',
        params='{}',
        output_ports=''
    )
    
    m19 = M.trade.v4(
        instruments=m9.data,
        options_data=m24.data_1,
        start_date='',
        end_date='',
        initialize=m19_initialize_bigquant_run,
        handle_data=m19_handle_data_bigquant_run,
        prepare=m19_prepare_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=''
    )
    
    WARNING:tensorflow:`implementation=0` has been deprecated, and now defaults to `implementation=1`.Please update your layer call.
    
    ---------------------------------------------------------------------------
    UnpicklingError                           Traceback (most recent call last)
    <ipython-input-5-baa40ccf6935> in <module>
        463 )
        464 
    --> 465 m29 = M.input_features.v1(
        466     features_ds=m3.data,
        467     features="""
    
    UnpicklingError: invalid load key, 'H'.