克隆策略
策略简介¶
因子:样例因子(18个)
标注:未来5日涨幅分类,涨幅靠前的为1,涨幅靠后的为0
算法:决策树算法
类型:分类问题
训练集:10-15年
测试集:15-19年
选股依据:根据上涨概率值排序买入
持股数:30
持仓天数:5
{"Description":"实验创建于2017/8/26","Summary":"","Graph":{"EdgesInternal":[{"DestinationInputPortId":"-787:instruments","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-8:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-15:instruments","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-8:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data1","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-15:data"},{"DestinationInputPortId":"-787:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-794:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-803:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-810:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-8155:input_2","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-8144:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-131:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-84:input_data","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data"},{"DestinationInputPortId":"-803:instruments","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"DestinationInputPortId":"-144:instruments","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"DestinationInputPortId":"-8155:input_1","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-84:data"},{"DestinationInputPortId":"-8155:input_3","SourceOutputPortId":"-86:data"},{"DestinationInputPortId":"-794:input_data","SourceOutputPortId":"-787:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data2","SourceOutputPortId":"-794:data"},{"DestinationInputPortId":"-810:input_data","SourceOutputPortId":"-803:data"},{"DestinationInputPortId":"-86:input_data","SourceOutputPortId":"-810:data"},{"DestinationInputPortId":"-8144:train_ds","SourceOutputPortId":"-8155:data_1"},{"DestinationInputPortId":"-8144:test_ds","SourceOutputPortId":"-8155:data_2"},{"DestinationInputPortId":"-131:training_ds","SourceOutputPortId":"-8144:train_data"},{"DestinationInputPortId":"-131:predict_ds","SourceOutputPortId":"-8144:test_data"},{"DestinationInputPortId":"-144:options_data","SourceOutputPortId":"-131:predictions"}],"ModuleNodes":[{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-8","ModuleId":"BigQuantSpace.instruments.instruments-v2","ModuleParameters":[{"Name":"start_date","Value":"2017-01-01","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"2019-01-01","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"market","Value":"CN_STOCK_A","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"instrument_list","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"max_count","Value":"0","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"rolling_conf","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-8"}],"OutputPortsInternal":[{"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-8","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":1,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15","ModuleId":"BigQuantSpace.advanced_auto_labeler.advanced_auto_labeler-v2","ModuleParameters":[{"Name":"label_expr","Value":"shift(close, -5) / shift(open, -1)-1\nrank(label)\nwhere(label>=0.75,1,where(label<=0.25, 0, NaN))","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"start_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"benchmark","Value":"000300.SHA","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"drop_na_label","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"cast_label_int","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"user_functions","Value":"","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-15"}],"OutputPortsInternal":[{"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-15","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":2,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24","ModuleId":"BigQuantSpace.input_features.input_features-v1","ModuleParameters":[{"Name":"features","Value":"(close_0-mean(close_0,12))/mean(close_0,12)*100\nrank(std(amount_0,15))\nrank_avg_amount_0/rank_avg_amount_8\nts_argmin(low_0,20)\nrank_return_30\n(low_1-close_0)/close_0\nta_bbands_lowerband_14_0\nmean(mf_net_pct_s_0,4)\namount_0/avg_amount_3\nreturn_0/return_5\nreturn_1/return_5\nrank_avg_amount_7/rank_avg_amount_10\nta_sma_10_0/close_0\nsqrt(high_0*low_0)-amount_0/volume_0*adjust_factor_0\navg_turn_15/(turn_0+1e-5)\nreturn_10\nmf_net_pct_s_0\n(close_0-open_0)/close_1\n ","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features_ds","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24"}],"OutputPortsInternal":[{"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":3,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-53","ModuleId":"BigQuantSpace.join.join-v3","ModuleParameters":[{"Name":"on","Value":"date,instrument","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"how","Value":"inner","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"sort","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"data1","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"data2","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53"}],"OutputPortsInternal":[{"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":7,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62","ModuleId":"BigQuantSpace.instruments.instruments-v2","ModuleParameters":[{"Name":"start_date","Value":"2019-01-01","ValueType":"Literal","LinkedGlobalParameter":"交易日期"},{"Name":"end_date","Value":"2020-02-26","ValueType":"Literal","LinkedGlobalParameter":"交易日期"},{"Name":"market","Value":"CN_STOCK_A","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"instrument_list","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"max_count","Value":"0","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"rolling_conf","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-62"}],"OutputPortsInternal":[{"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-62","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":9,"IsPartOfPartialRun":null,"Comment":"预测数据,用于回测和模拟","CommentCollapsed":false},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-84","ModuleId":"BigQuantSpace.dropnan.dropnan-v1","ModuleParameters":[],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-84"}],"OutputPortsInternal":[{"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-84","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":13,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-86","ModuleId":"BigQuantSpace.dropnan.dropnan-v1","ModuleParameters":[],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_data","NodeId":"-86"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-86","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":14,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-787","ModuleId":"BigQuantSpace.general_feature_extractor.general_feature_extractor-v7","ModuleParameters":[{"Name":"start_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"before_start_days","Value":0,"ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-787"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-787"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-787","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":15,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-794","ModuleId":"BigQuantSpace.derived_feature_extractor.derived_feature_extractor-v3","ModuleParameters":[{"Name":"date_col","Value":"date","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"instrument_col","Value":"instrument","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"drop_na","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"remove_extra_columns","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"user_functions","Value":"","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_data","NodeId":"-794"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-794"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-794","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":16,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-803","ModuleId":"BigQuantSpace.general_feature_extractor.general_feature_extractor-v7","ModuleParameters":[{"Name":"start_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"before_start_days","Value":"50","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-803"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-803"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-803","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":17,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-810","ModuleId":"BigQuantSpace.derived_feature_extractor.derived_feature_extractor-v3","ModuleParameters":[{"Name":"date_col","Value":"date","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"instrument_col","Value":"instrument","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"drop_na","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"remove_extra_columns","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"user_functions","Value":"","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_data","NodeId":"-810"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-810"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-810","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":18,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-8155","ModuleId":"BigQuantSpace.cached.cached-v3","ModuleParameters":[{"Name":"run","Value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n train_df = input_1.read()\n features = input_2.read()\n feature_min = train_df[features].quantile(0.005)\n feature_max = train_df[features].quantile(0.995)\n train_df[features] = train_df[features].clip(feature_min,feature_max,axis=1)\n data_1 = DataSource.write_df(train_df)\n test_df = input_3.read()\n test_df[features] = test_df[features].clip(feature_min,feature_max,axis=1)\n data_2 = DataSource.write_df(test_df)\n return Outputs(data_1=data_1, data_2=data_2, data_3=None)\n","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"post_run","Value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"input_ports","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"params","Value":"{}","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"output_ports","Value":"","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_1","NodeId":"-8155"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_2","NodeId":"-8155"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_3","NodeId":"-8155"}],"OutputPortsInternal":[{"Name":"data_1","NodeId":"-8155","OutputType":null},{"Name":"data_2","NodeId":"-8155","OutputType":null},{"Name":"data_3","NodeId":"-8155","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":6,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-8144","ModuleId":"BigQuantSpace.RobustScaler.RobustScaler-v13","ModuleParameters":[{"Name":"scale_type","Value":"standard","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"quantile_range_min","Value":"0.01","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"quantile_range_max","Value":"0.99","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"global_scale","Value":"True","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"train_ds","NodeId":"-8144"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-8144"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"test_ds","NodeId":"-8144"}],"OutputPortsInternal":[{"Name":"train_data","NodeId":"-8144","OutputType":null},{"Name":"test_data","NodeId":"-8144","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":8,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-131","ModuleId":"BigQuantSpace.decision_tree_classifier.decision_tree_classifier-v1","ModuleParameters":[{"Name":"criterion","Value":"gini","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"feature_fraction","Value":1,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"max_depth","Value":30,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"min_samples_per_leaf","Value":200,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"key_cols","Value":"date,instrument","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"other_train_parameters","Value":"{}","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"training_ds","NodeId":"-131"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-131"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"model","NodeId":"-131"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"predict_ds","NodeId":"-131"}],"OutputPortsInternal":[{"Name":"output_model","NodeId":"-131","OutputType":null},{"Name":"predictions","NodeId":"-131","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":10,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true},{"Id":"-144","ModuleId":"BigQuantSpace.trade.trade-v4","ModuleParameters":[{"Name":"start_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"end_date","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"initialize","Value":"# 回测引擎:初始化函数,只执行一次\ndef bigquant_run(context):\n # 加载预测数据\n \n context.indicator_data = context.options['data'].read_df()\n\n # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数\n context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))\n context.rebalance_days = 1\n context.stock_num = 5\n if 'index' not in context.extension:\n context.extension['index'] = 0\n \n","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"handle_data","Value":"# 回测引擎:每日数据处理函数,每天执行一次\ndef bigquant_run(context, data):\n \n context.extension['index'] += 1\n # 不在换仓日就return,相当于后面的代码只会一个月运行一次,买入的股票会持有1个月\n if context.extension['index'] % context.rebalance_days != 0:\n return \n \n # 当前的日期\n date = data.current_dt.strftime('%Y-%m-%d')\n \n cur_data = context.indicator_data[context.indicator_data['date'] == date]\n # 根据日期获取调仓需要买入的股票的列表\n #stock_to_buy = list(cur_data.instrument[:context.stock_num])\n cur_data = cur_data[cur_data['pred_label'] == 1.0]\n \n stock_to_buy = list(cur_data.sort_values('classes_prob_1.0',ascending=False).instrument)[:context.stock_num]\n if date == '2017-02-06':\n print(date, len(stock_to_buy), stock_to_buy)\n # 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表\n stock_hold_now = [equity.symbol for equity in context.portfolio.positions]\n # 继续持有的股票:调仓时,如果买入的股票已经存在于目前的持仓里,那么应继续持有\n no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]\n # 需要卖出的股票\n stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]\n \n # 卖出\n for stock in stock_to_sell:\n # 如果该股票停牌,则没法成交。因此需要用can_trade方法检查下该股票的状态\n # 如果返回真值,则可以正常下单,否则会出错\n # 因为stock是字符串格式,我们用symbol方法将其转化成平台可以接受的形式:Equity格式\n\n if data.can_trade(context.symbol(stock)):\n # order_target_percent是平台的一个下单接口,表明下单使得该股票的权重为0,\n # 即卖出全部股票,可参考回测文档\n context.order_target_percent(context.symbol(stock), 0)\n \n # 如果当天没有买入的股票,就返回\n if len(stock_to_buy) == 0:\n return\n\n # 等权重买入 \n weight = 1 / len(stock_to_buy)\n \n # 买入\n for stock in stock_to_buy:\n if data.can_trade(context.symbol(stock)):\n # 下单使得某只股票的持仓权重达到weight,因为\n # weight大于0,因此是等权重买入\n context.order_target_percent(context.symbol(stock), weight)\n ","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"prepare","Value":"# 回测引擎:准备数据,只执行一次\ndef bigquant_run(context):\n pass\n","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"before_trading_start","Value":"# 回测引擎:每个单位时间开始前调用一次,即每日开盘前调用一次。\ndef bigquant_run(context, data):\n pass\n","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"volume_limit","Value":"0","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"order_price_field_buy","Value":"open","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"order_price_field_sell","Value":"close","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"capital_base","Value":"100000","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"auto_cancel_non_tradable_orders","Value":"True","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"data_frequency","Value":"daily","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"price_type","Value":"真实价格","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"product_type","Value":"股票","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"plot_charts","Value":"True","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"backtest_only","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"benchmark","Value":"","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-144"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"options_data","NodeId":"-144"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"history_ds","NodeId":"-144"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"benchmark_ds","NodeId":"-144"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"trading_calendar","NodeId":"-144"}],"OutputPortsInternal":[{"Name":"raw_perf","NodeId":"-144","OutputType":null}],"UsePreviousResults":false,"moduleIdForCode":11,"IsPartOfPartialRun":null,"Comment":"","CommentCollapsed":true}],"SerializedClientData":"<?xml version='1.0' encoding='utf-16'?><DataV1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><Meta /><NodePositions><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-8' Position='61,2,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-15' Position='-66,122,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-24' Position='656,-21,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-53' Position='151,308,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-62' Position='1077,122,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-84' Position='149,395,200,200'/><NodePosition Node='-86' Position='1078,418,200,200'/><NodePosition Node='-787' Position='301,127,200,200'/><NodePosition Node='-794' Position='304,212,200,200'/><NodePosition Node='-803' Position='1078,236,200,200'/><NodePosition Node='-810' Position='1081,327,200,200'/><NodePosition Node='-8155' Position='525,513,200,200'/><NodePosition Node='-8144' Position='538,594,200,200'/><NodePosition Node='-131' Position='533,675,200,200'/><NodePosition Node='-144' Position='422,770,200,200'/></NodePositions><NodeGroups /></DataV1>"},"IsDraft":true,"ParentExperimentId":null,"WebService":{"IsWebServiceExperiment":false,"Inputs":[],"Outputs":[],"Parameters":[{"Name":"交易日期","Value":"","ParameterDefinition":{"Name":"交易日期","FriendlyName":"交易日期","DefaultValue":"","ParameterType":"String","HasDefaultValue":true,"IsOptional":true,"ParameterRules":[],"HasRules":false,"MarkupType":0,"CredentialDescriptor":null}}],"WebServiceGroupId":null,"SerializedClientData":"<?xml version='1.0' encoding='utf-16'?><DataV1 xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'><Meta /><NodePositions></NodePositions><NodeGroups /></DataV1>"},"DisableNodesUpdate":false,"Category":"user","Tags":[],"IsPartialRun":true}
In [1]:
# 本代码由可视化策略环境自动生成 2020年3月5日 09:32
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m6_run_bigquant_run(input_1, input_2, input_3):
train_df = input_1.read()
features = input_2.read()
feature_min = train_df[features].quantile(0.005)
feature_max = train_df[features].quantile(0.995)
train_df[features] = train_df[features].clip(feature_min,feature_max,axis=1)
data_1 = DataSource.write_df(train_df)
test_df = input_3.read()
test_df[features] = test_df[features].clip(feature_min,feature_max,axis=1)
data_2 = DataSource.write_df(test_df)
return Outputs(data_1=data_1, data_2=data_2, data_3=None)
# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m6_post_run_bigquant_run(outputs):
return outputs
# 回测引擎:初始化函数,只执行一次
def m11_initialize_bigquant_run(context):
# 加载预测数据
context.indicator_data = context.options['data'].read_df()
# 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
context.rebalance_days = 1
context.stock_num = 5
if 'index' not in context.extension:
context.extension['index'] = 0
# 回测引擎:每日数据处理函数,每天执行一次
def m11_handle_data_bigquant_run(context, data):
context.extension['index'] += 1
# 不在换仓日就return,相当于后面的代码只会一个月运行一次,买入的股票会持有1个月
if context.extension['index'] % context.rebalance_days != 0:
return
# 当前的日期
date = data.current_dt.strftime('%Y-%m-%d')
cur_data = context.indicator_data[context.indicator_data['date'] == date]
# 根据日期获取调仓需要买入的股票的列表
#stock_to_buy = list(cur_data.instrument[:context.stock_num])
cur_data = cur_data[cur_data['pred_label'] == 1.0]
stock_to_buy = list(cur_data.sort_values('classes_prob_1.0',ascending=False).instrument)[:context.stock_num]
if date == '2017-02-06':
print(date, len(stock_to_buy), stock_to_buy)
# 通过positions对象,使用列表生成式的方法获取目前持仓的股票列表
stock_hold_now = [equity.symbol for equity in context.portfolio.positions]
# 继续持有的股票:调仓时,如果买入的股票已经存在于目前的持仓里,那么应继续持有
no_need_to_sell = [i for i in stock_hold_now if i in stock_to_buy]
# 需要卖出的股票
stock_to_sell = [i for i in stock_hold_now if i not in no_need_to_sell]
# 卖出
for stock in stock_to_sell:
# 如果该股票停牌,则没法成交。因此需要用can_trade方法检查下该股票的状态
# 如果返回真值,则可以正常下单,否则会出错
# 因为stock是字符串格式,我们用symbol方法将其转化成平台可以接受的形式:Equity格式
if data.can_trade(context.symbol(stock)):
# order_target_percent是平台的一个下单接口,表明下单使得该股票的权重为0,
# 即卖出全部股票,可参考回测文档
context.order_target_percent(context.symbol(stock), 0)
# 如果当天没有买入的股票,就返回
if len(stock_to_buy) == 0:
return
# 等权重买入
weight = 1 / len(stock_to_buy)
# 买入
for stock in stock_to_buy:
if data.can_trade(context.symbol(stock)):
# 下单使得某只股票的持仓权重达到weight,因为
# weight大于0,因此是等权重买入
context.order_target_percent(context.symbol(stock), weight)
# 回测引擎:准备数据,只执行一次
def m11_prepare_bigquant_run(context):
pass
# 回测引擎:每个单位时间开始前调用一次,即每日开盘前调用一次。
def m11_before_trading_start_bigquant_run(context, data):
pass
m1 = M.instruments.v2(
start_date='2017-01-01',
end_date='2019-01-01',
market='CN_STOCK_A',
instrument_list='',
max_count=0
)
m2 = M.advanced_auto_labeler.v2(
instruments=m1.data,
label_expr="""shift(close, -5) / shift(open, -1)-1
rank(label)
where(label>=0.75,1,where(label<=0.25, 0, NaN))""",
start_date='',
end_date='',
benchmark='000300.SHA',
drop_na_label=False,
cast_label_int=False
)
m3 = M.input_features.v1(
features="""(close_0-mean(close_0,12))/mean(close_0,12)*100
rank(std(amount_0,15))
rank_avg_amount_0/rank_avg_amount_8
ts_argmin(low_0,20)
rank_return_30
(low_1-close_0)/close_0
ta_bbands_lowerband_14_0
mean(mf_net_pct_s_0,4)
amount_0/avg_amount_3
return_0/return_5
return_1/return_5
rank_avg_amount_7/rank_avg_amount_10
ta_sma_10_0/close_0
sqrt(high_0*low_0)-amount_0/volume_0*adjust_factor_0
avg_turn_15/(turn_0+1e-5)
return_10
mf_net_pct_s_0
(close_0-open_0)/close_1
"""
)
m15 = M.general_feature_extractor.v7(
instruments=m1.data,
features=m3.data,
start_date='',
end_date='',
before_start_days=0
)
m16 = M.derived_feature_extractor.v3(
input_data=m15.data,
features=m3.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m7 = M.join.v3(
data1=m2.data,
data2=m16.data,
on='date,instrument',
how='inner',
sort=False
)
m13 = M.dropnan.v1(
input_data=m7.data
)
m9 = M.instruments.v2(
start_date=T.live_run_param('trading_date', '2019-01-01'),
end_date=T.live_run_param('trading_date', '2020-02-26'),
market='CN_STOCK_A',
instrument_list='',
max_count=0
)
m17 = M.general_feature_extractor.v7(
instruments=m9.data,
features=m3.data,
start_date='',
end_date='',
before_start_days=50
)
m18 = M.derived_feature_extractor.v3(
input_data=m17.data,
features=m3.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m14 = M.dropnan.v1(
input_data=m18.data
)
m6 = M.cached.v3(
input_1=m13.data,
input_2=m3.data,
input_3=m14.data,
run=m6_run_bigquant_run,
post_run=m6_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
m8 = M.RobustScaler.v13(
train_ds=m6.data_1,
features=m3.data,
test_ds=m6.data_2,
scale_type='standard',
quantile_range_min=0.01,
quantile_range_max=0.99,
global_scale=True
)
m10 = M.decision_tree_classifier.v1(
training_ds=m8.train_data,
features=m3.data,
predict_ds=m8.test_data,
criterion='gini',
feature_fraction=1,
max_depth=30,
min_samples_per_leaf=200,
key_cols='date,instrument',
other_train_parameters={}
)
m11 = M.trade.v4(
instruments=m9.data,
options_data=m10.predictions,
start_date='',
end_date='',
initialize=m11_initialize_bigquant_run,
handle_data=m11_handle_data_bigquant_run,
prepare=m11_prepare_bigquant_run,
before_trading_start=m11_before_trading_start_bigquant_run,
volume_limit=0,
order_price_field_buy='open',
order_price_field_sell='close',
capital_base=100000,
auto_cancel_non_tradable_orders=True,
data_frequency='daily',
price_type='真实价格',
product_type='股票',
plot_charts=True,
backtest_only=False,
benchmark=''
)
日志 97 条,错误日志
0 条
[2020-03-05 09:11:28.968177] INFO: bigquant: instruments.v2 开始运行..
[2020-03-05 09:11:29.024410] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.025516] INFO: bigquant: instruments.v2 运行完成[0.057367s].
[2020-03-05 09:11:29.038688] INFO: bigquant: advanced_auto_labeler.v2 开始运行..
[2020-03-05 09:11:29.059707] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.062186] INFO: bigquant: advanced_auto_labeler.v2 运行完成[0.023484s].
[2020-03-05 09:11:29.069892] INFO: bigquant: input_features.v1 开始运行..
[2020-03-05 09:11:29.091238] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.092312] INFO: bigquant: input_features.v1 运行完成[0.022426s].
[2020-03-05 09:11:29.134556] INFO: bigquant: general_feature_extractor.v7 开始运行..
[2020-03-05 09:11:29.156058] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.157234] INFO: bigquant: general_feature_extractor.v7 运行完成[0.022696s].
[2020-03-05 09:11:29.166703] INFO: bigquant: derived_feature_extractor.v3 开始运行..
[2020-03-05 09:11:29.198270] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.199401] INFO: bigquant: derived_feature_extractor.v3 运行完成[0.03271s].
[2020-03-05 09:11:29.205044] INFO: bigquant: join.v3 开始运行..
[2020-03-05 09:11:29.224616] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.225548] INFO: bigquant: join.v3 运行完成[0.020498s].
[2020-03-05 09:11:29.232051] INFO: bigquant: dropnan.v1 开始运行..
[2020-03-05 09:11:29.251219] INFO: bigquant: 命中缓存
[2020-03-05 09:11:29.252134] INFO: bigquant: dropnan.v1 运行完成[0.02008s].
[2020-03-05 09:11:29.253453] INFO: bigquant: instruments.v2 开始运行..
[2020-03-05 09:11:29.327610] INFO: bigquant: instruments.v2 运行完成[0.074126s].
[2020-03-05 09:11:29.349104] INFO: bigquant: general_feature_extractor.v7 开始运行..
[2020-03-05 09:11:34.567962] INFO: 基础特征抽取: 年份 2018, 特征行数=123568
[2020-03-05 09:11:40.262226] INFO: 基础特征抽取: 年份 2019, 特征行数=884646
[2020-03-05 09:11:41.354471] INFO: 基础特征抽取: 年份 2020, 特征行数=127828
[2020-03-05 09:11:41.919098] INFO: 基础特征抽取: 总行数: 1136042
[2020-03-05 09:11:41.922463] INFO: bigquant: general_feature_extractor.v7 运行完成[12.573381s].
[2020-03-05 09:11:41.924025] INFO: bigquant: derived_feature_extractor.v3 开始运行..
[2020-03-05 09:11:46.663145] INFO: derived_feature_extractor: 提取完成 (close_0-mean(close_0,12))/mean(close_0,12)*100, 3.960s
[2020-03-05 09:11:49.105619] INFO: derived_feature_extractor: 提取完成 rank(std(amount_0,15)), 2.441s
[2020-03-05 09:11:49.111901] INFO: derived_feature_extractor: 提取完成 rank_avg_amount_0/rank_avg_amount_8, 0.005s
[2020-03-05 09:11:52.634132] INFO: derived_feature_extractor: 提取完成 ts_argmin(low_0,20), 3.521s
[2020-03-05 09:11:52.656929] INFO: derived_feature_extractor: 提取完成 (low_1-close_0)/close_0, 0.022s
[2020-03-05 09:11:54.626404] INFO: derived_feature_extractor: 提取完成 mean(mf_net_pct_s_0,4), 1.968s
[2020-03-05 09:11:54.659440] INFO: derived_feature_extractor: 提取完成 amount_0/avg_amount_3, 0.032s
[2020-03-05 09:11:54.670107] INFO: derived_feature_extractor: 提取完成 return_0/return_5, 0.009s
[2020-03-05 09:11:54.680650] INFO: derived_feature_extractor: 提取完成 return_1/return_5, 0.009s
[2020-03-05 09:11:54.689500] INFO: derived_feature_extractor: 提取完成 rank_avg_amount_7/rank_avg_amount_10, 0.007s
[2020-03-05 09:11:54.760332] INFO: derived_feature_extractor: 提取完成 ta_sma_10_0/close_0, 0.069s
[2020-03-05 09:11:54.770770] INFO: derived_feature_extractor: 提取完成 sqrt(high_0*low_0)-amount_0/volume_0*adjust_factor_0, 0.009s
[2020-03-05 09:11:54.779307] INFO: derived_feature_extractor: 提取完成 avg_turn_15/(turn_0+1e-5), 0.007s
[2020-03-05 09:11:54.860271] INFO: derived_feature_extractor: 提取完成 (close_0-open_0)/close_1, 0.080s
[2020-03-05 09:11:56.572783] INFO: derived_feature_extractor: /y_2018, 123568
[2020-03-05 09:11:57.051982] INFO: derived_feature_extractor: /y_2019, 884646
[2020-03-05 09:11:58.232296] INFO: derived_feature_extractor: /y_2020, 127828
[2020-03-05 09:11:59.089785] INFO: bigquant: derived_feature_extractor.v3 运行完成[17.165739s].
[2020-03-05 09:11:59.092169] INFO: bigquant: dropnan.v1 开始运行..
[2020-03-05 09:11:59.337183] INFO: dropnan: /y_2018, 56124/123568
[2020-03-05 09:12:01.349086] INFO: dropnan: /y_2019, 878460/884646
[2020-03-05 09:12:01.620636] INFO: dropnan: /y_2020, 126634/127828
[2020-03-05 09:12:02.876978] INFO: dropnan: 行数: 1061218/1136042
[2020-03-05 09:12:02.883825] INFO: bigquant: dropnan.v1 运行完成[3.791633s].
[2020-03-05 09:12:02.891184] INFO: bigquant: cached.v3 开始运行..
[2020-03-05 09:12:14.307494] INFO: bigquant: cached.v3 运行完成[11.41631s].
[2020-03-05 09:12:14.319790] INFO: bigquant: RobustScaler.v13 开始运行..
[2020-03-05 09:12:24.091416] INFO: bigquant: RobustScaler.v13 运行完成[9.771632s].
[2020-03-05 09:12:24.424942] INFO: bigquant: decision_tree_classifier.v1 开始运行..
[2020-03-05 09:12:32.087459] INFO: bigquant: decision_tree_classifier.v1 运行完成[7.662515s].
[2020-03-05 09:12:33.275737] INFO: bigquant: backtest.v8 开始运行..
[2020-03-05 09:12:33.278582] INFO: bigquant: biglearning backtest:V8.3.2
[2020-03-05 09:12:33.280092] INFO: bigquant: product_type:stock by specified
[2020-03-05 09:12:33.411636] INFO: bigquant: cached.v2 开始运行..
[2020-03-05 09:12:42.510913] INFO: bigquant: 读取股票行情完成:1873798
[2020-03-05 09:12:45.467639] INFO: bigquant: cached.v2 运行完成[12.055968s].
[2020-03-05 09:12:46.540449] INFO: algo: TradingAlgorithm V1.6.6
[2020-03-05 09:12:47.682801] INFO: algo: trading transform...
[2020-03-05 09:12:50.479485] INFO: algo: handle_splits get splits [dt:2019-05-31 00:00:00+00:00] [asset:Equity(3072 [603877.SHA]), ratio:0.9454952478408813]
[2020-03-05 09:12:50.481443] INFO: Position: position stock handle split[sid:3072, orig_amount:2200, new_amount:2326.0, orig_cost:17.229999542236328, new_cost:16.29, ratio:0.9454952478408813, last_sale_price:17.000003814697266]
[2020-03-05 09:12:50.483057] INFO: Position: after split: PositionStock(asset:Equity(3072 [603877.SHA]), amount:2326.0, cost_basis:16.29, last_sale_price:17.979999542236328)
[2020-03-05 09:12:50.484246] INFO: Position: returning cash: 13.99
[2020-03-05 09:12:50.783175] INFO: algo: handle_splits get splits [dt:2019-06-20 00:00:00+00:00] [asset:Equity(2724 [600573.SHA]), ratio:0.9962263107299805]
[2020-03-05 09:12:50.807283] INFO: algo: handle_splits get splits [dt:2019-06-21 00:00:00+00:00] [asset:Equity(624 [600232.SHA]), ratio:0.9836601614952087]
[2020-03-05 09:12:51.045880] INFO: algo: handle_splits get splits [dt:2019-07-05 00:00:00+00:00] [asset:Equity(720 [603699.SHA]), ratio:0.9485182166099548]
[2020-03-05 09:12:51.046998] INFO: Position: position stock handle split[sid:720, orig_amount:3300, new_amount:3479.0, orig_cost:12.699999809265137, new_cost:12.05, ratio:0.9485182166099548, last_sale_price:12.160002708435059]
[2020-03-05 09:12:51.047811] INFO: Position: after split: PositionStock(asset:Equity(720 [603699.SHA]), amount:3479.0, cost_basis:12.05, last_sale_price:12.819998741149902)
[2020-03-05 09:12:51.048494] INFO: Position: returning cash: 1.35
[2020-03-05 09:12:51.145830] INFO: algo: handle_splits get splits [dt:2019-07-11 00:00:00+00:00] [asset:Equity(3207 [601965.SHA]), ratio:0.9663071036338806]
[2020-03-05 09:12:51.146930] INFO: Position: position stock handle split[sid:3207, orig_amount:5200, new_amount:5381.0, orig_cost:7.490000247955322, new_cost:7.24, ratio:0.9663071036338806, last_sale_price:7.169998645782471]
[2020-03-05 09:12:51.147733] INFO: Position: after split: PositionStock(asset:Equity(3207 [601965.SHA]), amount:5381.0, cost_basis:7.24, last_sale_price:7.420000076293945)
[2020-03-05 09:12:51.148423] INFO: Position: returning cash: 2.24
[2020-03-05 09:12:51.224629] INFO: algo: handle_splits get splits [dt:2019-07-16 00:00:00+00:00] [asset:Equity(3637 [600012.SHA]), ratio:0.9611197113990784]
[2020-03-05 09:12:51.225760] INFO: Position: position stock handle split[sid:3637, orig_amount:6100, new_amount:6346.0, orig_cost:6.429999828338623, new_cost:6.18, ratio:0.9611197113990784, last_sale_price:6.179999351501465]
[2020-03-05 09:12:51.226593] INFO: Position: after split: PositionStock(asset:Equity(3637 [600012.SHA]), amount:6346.0, cost_basis:6.18, last_sale_price:6.429999828338623)
[2020-03-05 09:12:51.227296] INFO: Position: returning cash: 4.72
[2020-03-05 09:12:51.266238] INFO: algo: handle_splits get splits [dt:2019-07-17 00:00:00+00:00] [asset:Equity(2962 [600272.SHA]), ratio:0.9951867461204529]
[2020-03-05 09:12:51.268025] INFO: Position: position stock handle split[sid:2962, orig_amount:4800, new_amount:4823.0, orig_cost:8.300000190734863, new_cost:8.26, ratio:0.9951867461204529, last_sale_price:8.270002365112305]
[2020-03-05 09:12:51.268955] INFO: Position: after split: PositionStock(asset:Equity(2962 [600272.SHA]), amount:4823.0, cost_basis:8.26, last_sale_price:8.3100004196167)
[2020-03-05 09:12:51.270496] INFO: Position: returning cash: 1.78
[2020-03-05 09:12:51.323203] INFO: algo: handle_splits get splits [dt:2019-07-19 00:00:00+00:00] [asset:Equity(495 [603227.SHA]), ratio:0.9920843243598938]
[2020-03-05 09:12:52.367620] INFO: algo: handle_splits get splits [dt:2019-09-23 00:00:00+00:00] [asset:Equity(148 [002612.SZA]), ratio:0.9777531027793884]
[2020-03-05 09:12:54.520050] INFO: Performance: Simulated 278 trading days out of 278.
[2020-03-05 09:12:54.521100] INFO: Performance: first open: 2019-01-02 09:30:00+00:00
[2020-03-05 09:12:54.521872] INFO: Performance: last close: 2020-02-26 15:00:00+00:00
[2020-03-05 09:12:59.143404] INFO: bigquant: backtest.v8 运行完成[25.867669s].
[2020-03-05 09:12:59.145056] INFO: bigquant: trade.v4 运行完成[27.046198s].