克隆策略
In [30]:
DataSource("index_constituent_CN_STOCK_A").read().head()
Out[30]:
{"Description":"实验创建于2017/8/26","Summary":"","Graph":{"EdgesInternal":[{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data1","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-15:data"},{"DestinationInputPortId":"-215:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-222:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-231:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-238:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-654:features","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"DestinationInputPortId":"-668:input_data","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data"},{"DestinationInputPortId":"-250:options_data","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60:predictions"},{"DestinationInputPortId":"-231:instruments","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"DestinationInputPortId":"-250:instruments","SourceOutputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"DestinationInputPortId":"-222:input_data","SourceOutputPortId":"-215:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-53:data2","SourceOutputPortId":"-222:data"},{"DestinationInputPortId":"-238:input_data","SourceOutputPortId":"-231:data"},{"DestinationInputPortId":"-672:input_data","SourceOutputPortId":"-238:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60:model","SourceOutputPortId":"-654:model"},{"DestinationInputPortId":"-654:training_ds","SourceOutputPortId":"-668:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60:data","SourceOutputPortId":"-672:data"},{"DestinationInputPortId":"287d2cb0-f53c-4101-bdf8-104b137c8601-15:instruments","SourceOutputPortId":"-130:data_1"},{"DestinationInputPortId":"-215:instruments","SourceOutputPortId":"-130:data_1"}],"ModuleNodes":[{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-15","ModuleId":"BigQuantSpace.advanced_auto_labeler.advanced_auto_labeler-v2","ModuleParameters":[{"Name":"label_expr","Value":"# #号开始的表示注释\n# 0. 每行一个,顺序执行,从第二个开始,可以使用label字段\n# 1. 可用数据字段见 https://bigquant.com/docs/develop/datasource/deprecated/history_data.html\n# 添加benchmark_前缀,可使用对应的benchmark数据\n# 2. 可用操作符和函数见 `表达式引擎 <https://bigquant.com/docs/develop/bigexpr/usage.html>`_\n\n# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)\nshift(close, -5) / shift(open, -1)\n\n# 极值处理:用1%和99%分位的值做clip\nclip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))\n\n# 将分数映射到分类,这里使用20个分类\nall_wbins(label, 20)\n\n# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)\nwhere(shift(high, -1) == shift(low, -1), NaN, label)\n","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":"True","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"cast_label_int","Value":"True","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,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24","ModuleId":"BigQuantSpace.input_features.input_features-v1","ModuleParameters":[{"Name":"features","Value":"# #号开始的表示注释\n# 多个特征,每行一个,可以包含基础特征和衍生特征\nreturn_5\nreturn_10\nreturn_20\navg_amount_0/avg_amount_5\navg_amount_5/avg_amount_20\nrank_avg_amount_0/rank_avg_amount_5\nrank_avg_amount_5/rank_avg_amount_10\nrank_return_0\nrank_return_5\nrank_return_10\nrank_return_0/rank_return_5\nrank_return_5/rank_return_10\npe_ttm_0\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,"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,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-60","ModuleId":"BigQuantSpace.stock_ranker_predict.stock_ranker_predict-v5","ModuleParameters":[{"Name":"m_lazy_run","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"model","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"data","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60"}],"OutputPortsInternal":[{"Name":"predictions","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60","OutputType":null},{"Name":"m_lazy_run","NodeId":"287d2cb0-f53c-4101-bdf8-104b137c8601-60","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":8,"Comment":"","CommentCollapsed":true},{"Id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62","ModuleId":"BigQuantSpace.instruments.instruments-v2","ModuleParameters":[{"Name":"start_date","Value":"2015-01-01","ValueType":"Literal","LinkedGlobalParameter":"交易日期"},{"Name":"end_date","Value":"2017-01-01","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,"Comment":"预测数据,用于回测和模拟","CommentCollapsed":false},{"Id":"-215","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":90,"ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-215"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-215"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-215","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":15,"Comment":"","CommentCollapsed":true},{"Id":"-222","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":"-222"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-222"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-222","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":16,"Comment":"","CommentCollapsed":true},{"Id":"-231","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":90,"ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-231"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-231"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-231","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":17,"Comment":"","CommentCollapsed":true},{"Id":"-238","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":"-238"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-238"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-238","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":18,"Comment":"","CommentCollapsed":true},{"Id":"-250","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 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 = 5\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.2\n context.options['hold_days'] = 5\n","ValueType":"Literal","LinkedGlobalParameter":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.portfolio.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.portfolio.positions.items()}\n instruments = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(\n lambda x: x in equities)])))\n\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","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"prepare","Value":"# 回测引擎:准备数据,只执行一次\ndef bigquant_run(context):\n pass\n","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"before_trading_start","Value":"","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"volume_limit","Value":0.025,"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":1000000,"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":"000300.SHA","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"instruments","NodeId":"-250"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"options_data","NodeId":"-250"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"history_ds","NodeId":"-250"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"benchmark_ds","NodeId":"-250"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"trading_calendar","NodeId":"-250"}],"OutputPortsInternal":[{"Name":"raw_perf","NodeId":"-250","OutputType":null}],"UsePreviousResults":false,"moduleIdForCode":19,"Comment":"","CommentCollapsed":true},{"Id":"-654","ModuleId":"BigQuantSpace.stock_ranker_train.stock_ranker_train-v6","ModuleParameters":[{"Name":"learning_algorithm","Value":"排序","ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"number_of_leaves","Value":30,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"minimum_docs_per_leaf","Value":1000,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"number_of_trees","Value":20,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"learning_rate","Value":0.1,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"max_bins","Value":1023,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"feature_fraction","Value":1,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"data_row_fraction","Value":1,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"ndcg_discount_base","Value":1,"ValueType":"Literal","LinkedGlobalParameter":null},{"Name":"m_lazy_run","Value":"False","ValueType":"Literal","LinkedGlobalParameter":null}],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"training_ds","NodeId":"-654"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-654"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"test_ds","NodeId":"-654"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"base_model","NodeId":"-654"}],"OutputPortsInternal":[{"Name":"model","NodeId":"-654","OutputType":null},{"Name":"feature_gains","NodeId":"-654","OutputType":null},{"Name":"m_lazy_run","NodeId":"-654","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":4,"Comment":"","CommentCollapsed":true},{"Id":"-668","ModuleId":"BigQuantSpace.dropnan.dropnan-v2","ModuleParameters":[],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_data","NodeId":"-668"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-668"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-668","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":5,"Comment":"","CommentCollapsed":true},{"Id":"-672","ModuleId":"BigQuantSpace.dropnan.dropnan-v2","ModuleParameters":[],"InputPortsInternal":[{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_data","NodeId":"-672"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"features","NodeId":"-672"}],"OutputPortsInternal":[{"Name":"data","NodeId":"-672","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":10,"Comment":"","CommentCollapsed":true},{"Id":"-130","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 # 示例代码如下。在这里编写您的代码\n df = DataSource(\"index_constituent_CN_STOCK_A\").read() # 读取A股指数成分表,具体信息见 数据文档-A股-其他常规数据-A股指数成分\n df_csi300 = df[df.in_csi300==1] #选取 沪深300 的记录\n ins_list = df_csi300.instrument.tolist() # 获取对应的 instruments列表\n data_1 = {'end_date': '2015-01-01','instruments':ins_list,'start_date':'2010-01-01'} #输出格式和原代码列表模块输出格式保持一致,代码列表输出格式可通过 m1.data.read()看到\n return Outputs(data_1=data_1, data_2=None, data_3=None) #只需要用到一个输出端,可以把另外两个设为 None。 最后在可视化模块里用输出端口1分别连接 自动标注模块(m2), 基础特征抽取模块(m15),即可。\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":"-130"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_2","NodeId":"-130"},{"DataSourceId":null,"TrainedModelId":null,"TransformModuleId":null,"Name":"input_3","NodeId":"-130"}],"OutputPortsInternal":[{"Name":"data_1","NodeId":"-130","OutputType":null},{"Name":"data_2","NodeId":"-130","OutputType":null},{"Name":"data_3","NodeId":"-130","OutputType":null}],"UsePreviousResults":true,"moduleIdForCode":11,"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-15' Position='59.23162841796875,261.968017578125,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-24' Position='765,21,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-53' Position='249,375,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-60' Position='906,647,200,200'/><NodePosition Node='287d2cb0-f53c-4101-bdf8-104b137c8601-62' Position='1074,127,200,200'/><NodePosition Node='-215' Position='372.0263366699219,213.12615966796875,200,200'/><NodePosition Node='-222' Position='424.4840087890625,294.3578186035156,200,200'/><NodePosition Node='-231' Position='1078,236,200,200'/><NodePosition Node='-238' Position='1081,327,200,200'/><NodePosition Node='-250' Position='1037,751,200,200'/><NodePosition Node='-654' Position='638,561,200,200'/><NodePosition Node='-668' Position='376,467,200,200'/><NodePosition Node='-672' Position='1078,418,200,200'/><NodePosition Node='-130' Position='176.74017333984375,136.44004821777344,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 [31]:
# 本代码由可视化策略环境自动生成 2020年12月29日 15:15
# 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
def m11_run_bigquant_run(input_1, input_2, input_3):
# 示例代码如下。在这里编写您的代码
df = DataSource("index_constituent_CN_STOCK_A").read() # 读取A股指数成分表,具体信息见 数据文档-A股-其他常规数据-A股指数成分
df_csi300 = df[df.in_csi300==1] #选取 沪深300 的记录
ins_list = df_csi300.instrument.tolist() # 获取对应的 instruments列表
data_1 = {'end_date': '2015-01-01','instruments':ins_list,'start_date':'2010-01-01'} #输出格式和原代码列表模块输出格式保持一致,代码列表输出格式可通过 m1.data.read()看到
return Outputs(data_1=data_1, data_2=None, data_3=None) #只需要用到一个输出端,可以把另外两个设为 None。 最后在可视化模块里用输出端口1分别连接 自动标注模块(m2), 基础特征抽取模块(m15),即可。
# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
def m11_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 = 5
# 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[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.2
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.portfolio.positions.items()}
# 2. 生成卖出订单:hold_days天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰
if not is_staging and cash_for_sell > 0:
equities = {e.symbol: e for e, p in context.portfolio.positions.items()}
instruments = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(
lambda x: x in equities)])))
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
m3 = M.input_features.v1(
features="""# #号开始的表示注释
# 多个特征,每行一个,可以包含基础特征和衍生特征
return_5
return_10
return_20
avg_amount_0/avg_amount_5
avg_amount_5/avg_amount_20
rank_avg_amount_0/rank_avg_amount_5
rank_avg_amount_5/rank_avg_amount_10
rank_return_0
rank_return_5
rank_return_10
rank_return_0/rank_return_5
rank_return_5/rank_return_10
pe_ttm_0
"""
)
m9 = M.instruments.v2(
start_date=T.live_run_param('trading_date', '2015-01-01'),
end_date=T.live_run_param('trading_date', '2017-01-01'),
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=90
)
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
)
m10 = M.dropnan.v2(
input_data=m18.data
)
m11 = M.cached.v3(
run=m11_run_bigquant_run,
post_run=m11_post_run_bigquant_run,
input_ports='',
params='{}',
output_ports=''
)
m2 = M.advanced_auto_labeler.v2(
instruments=m11.data_1,
label_expr="""# #号开始的表示注释
# 0. 每行一个,顺序执行,从第二个开始,可以使用label字段
# 1. 可用数据字段见 https://bigquant.com/docs/develop/datasource/deprecated/history_data.html
# 添加benchmark_前缀,可使用对应的benchmark数据
# 2. 可用操作符和函数见 `表达式引擎 <https://bigquant.com/docs/develop/bigexpr/usage.html>`_
# 计算收益:5日收盘价(作为卖出价格)除以明日开盘价(作为买入价格)
shift(close, -5) / shift(open, -1)
# 极值处理:用1%和99%分位的值做clip
clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
# 将分数映射到分类,这里使用20个分类
all_wbins(label, 20)
# 过滤掉一字涨停的情况 (设置label为NaN,在后续处理和训练中会忽略NaN的label)
where(shift(high, -1) == shift(low, -1), NaN, label)
""",
start_date='',
end_date='',
benchmark='000300.SHA',
drop_na_label=True,
cast_label_int=True
)
m15 = M.general_feature_extractor.v7(
instruments=m11.data_1,
features=m3.data,
start_date='',
end_date='',
before_start_days=90
)
m16 = M.derived_feature_extractor.v3(
input_data=m15.data,
features=m3.data,
date_col='date',
instrument_col='instrument',
drop_na=False,
remove_extra_columns=False
)
m7 = M.join.v3(
data1=m2.data,
data2=m16.data,
on='date,instrument',
how='inner',
sort=False
)
m5 = M.dropnan.v2(
input_data=m7.data
)
m4 = M.stock_ranker_train.v6(
training_ds=m5.data,
features=m3.data,
learning_algorithm='排序',
number_of_leaves=30,
minimum_docs_per_leaf=1000,
number_of_trees=20,
learning_rate=0.1,
max_bins=1023,
feature_fraction=1,
data_row_fraction=1,
ndcg_discount_base=1,
m_lazy_run=False
)
m8 = M.stock_ranker_predict.v5(
model=m4.model,
data=m10.data,
m_lazy_run=False
)
m19 = M.trade.v4(
instruments=m9.data,
options_data=m8.predictions,
start_date='',
end_date='',
initialize=m19_initialize_bigquant_run,
handle_data=m19_handle_data_bigquant_run,
prepare=m19_prepare_bigquant_run,
volume_limit=0.025,
order_price_field_buy='open',
order_price_field_sell='close',
capital_base=1000000,
auto_cancel_non_tradable_orders=True,
data_frequency='daily',
price_type='真实价格',
product_type='股票',
plot_charts=True,
backtest_only=False,
benchmark='000300.SHA'
)
日志 209 条,错误日志
0 条
[2020-12-29 14:45:32.492087] INFO: moduleinvoker: input_features.v1 开始运行..
[2020-12-29 14:45:32.599355] INFO: moduleinvoker: 命中缓存
[2020-12-29 14:45:32.600816] INFO: moduleinvoker: input_features.v1 运行完成[0.108731s].
[2020-12-29 14:45:32.602682] INFO: moduleinvoker: instruments.v2 开始运行..
[2020-12-29 14:45:32.606608] INFO: moduleinvoker: 命中缓存
[2020-12-29 14:45:32.607469] INFO: moduleinvoker: instruments.v2 运行完成[0.004781s].
[2020-12-29 14:45:32.613149] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2020-12-29 14:45:32.692912] INFO: moduleinvoker: 命中缓存
[2020-12-29 14:45:32.785538] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[0.17237s].
[2020-12-29 14:45:32.787584] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2020-12-29 14:45:32.792826] INFO: moduleinvoker: 命中缓存
[2020-12-29 14:45:32.884386] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[0.096773s].
[2020-12-29 14:45:32.886643] INFO: moduleinvoker: dropnan.v2 开始运行..
[2020-12-29 14:45:32.984893] INFO: moduleinvoker: 命中缓存
[2020-12-29 14:45:32.986316] INFO: moduleinvoker: dropnan.v2 运行完成[0.099668s].
[2020-12-29 14:45:33.001110] INFO: moduleinvoker: cached.v3 开始运行..
[2020-12-29 14:45:44.588306] WARNING: modulecache: 返回的Outputs实例(size=16065030) 过大,将不会被缓存。
[2020-12-29 14:45:44.590274] INFO: moduleinvoker: cached.v3 运行完成[11.58918s].
[2020-12-29 14:45:45.597741] INFO: moduleinvoker: advanced_auto_labeler.v2 开始运行..
[2020-12-29 14:46:06.385099] INFO: 自动标注(股票): 加载历史数据: 812574 行
[2020-12-29 14:46:06.386618] INFO: 自动标注(股票): 开始标注 ..
[2020-12-29 14:46:22.398450] INFO: moduleinvoker: advanced_auto_labeler.v2 运行完成[36.800709s].
[2020-12-29 14:46:24.193105] INFO: moduleinvoker: general_feature_extractor.v7 开始运行..
[2020-12-29 14:46:28.786964] INFO: 基础特征抽取: 年份 2009, 特征行数=35043
[2020-12-29 14:46:35.896325] INFO: 基础特征抽取: 年份 2010, 特征行数=149580
[2020-12-29 14:46:44.993895] INFO: 基础特征抽取: 年份 2011, 特征行数=161903
[2020-12-29 14:46:54.198220] INFO: 基础特征抽取: 年份 2012, 特征行数=168531
[2020-12-29 14:47:03.601354] INFO: 基础特征抽取: 年份 2013, 特征行数=165577
[2020-12-29 14:47:14.098816] INFO: 基础特征抽取: 年份 2014, 特征行数=166983
[2020-12-29 14:47:20.394810] INFO: 基础特征抽取: 年份 2015, 特征行数=0
[2020-12-29 14:47:21.793883] INFO: 基础特征抽取: 总行数: 847617
[2020-12-29 14:47:21.798780] INFO: moduleinvoker: general_feature_extractor.v7 运行完成[57.60569s].
[2020-12-29 14:47:21.886227] INFO: moduleinvoker: derived_feature_extractor.v3 开始运行..
[2020-12-29 14:47:26.485490] INFO: derived_feature_extractor: 提取完成 avg_amount_0/avg_amount_5, 0.087s
[2020-12-29 14:47:26.494806] INFO: derived_feature_extractor: 提取完成 avg_amount_5/avg_amount_20, 0.008s
[2020-12-29 14:47:26.592099] INFO: derived_feature_extractor: 提取完成 rank_avg_amount_0/rank_avg_amount_5, 0.004s
[2020-12-29 14:47:26.685477] INFO: derived_feature_extractor: 提取完成 rank_avg_amount_5/rank_avg_amount_10, 0.092s
[2020-12-29 14:47:26.693511] INFO: derived_feature_extractor: 提取完成 rank_return_0/rank_return_5, 0.006s
[2020-12-29 14:47:26.789369] INFO: derived_feature_extractor: 提取完成 rank_return_5/rank_return_10, 0.094s
[2020-12-29 14:47:31.484052] INFO: derived_feature_extractor: /y_2009, 35043
[2020-12-29 14:47:35.084982] INFO: derived_feature_extractor: /y_2010, 149580
[2020-12-29 14:47:37.786055] INFO: derived_feature_extractor: /y_2011, 161903
[2020-12-29 14:47:39.985683] INFO: derived_feature_extractor: /y_2012, 168531
[2020-12-29 14:47:41.595237] INFO: derived_feature_extractor: /y_2013, 165577
[2020-12-29 14:47:43.188272] INFO: derived_feature_extractor: /y_2014, 166983
[2020-12-29 14:47:46.490137] INFO: moduleinvoker: derived_feature_extractor.v3 运行完成[24.603885s].
[2020-12-29 14:47:46.493047] INFO: moduleinvoker: join.v3 开始运行..
[2020-12-29 14:47:52.194807] INFO: join: /y_2009, 行数=0/35043, 耗时=3.1053s
[2020-12-29 14:47:55.899417] INFO: join: /y_2010, 行数=149446/149580, 耗时=3.701817s
[2020-12-29 14:48:00.319104] INFO: join: /y_2011, 行数=161786/161903, 耗时=4.327397s
[2020-12-29 14:48:05.089544] INFO: join: /y_2012, 行数=168350/168531, 耗时=4.505411s
[2020-12-29 14:48:10.895396] INFO: join: /y_2013, 行数=165299/165577, 耗时=5.795161s
[2020-12-29 14:48:14.696382] INFO: join: /y_2014, 行数=162976/166983, 耗时=3.792277s
[2020-12-29 14:48:15.795159] INFO: join: 最终行数: 807857
[2020-12-29 14:48:16.005514] INFO: moduleinvoker: join.v3 运行完成[29.512457s].
[2020-12-29 14:48:16.007904] INFO: moduleinvoker: dropnan.v2 开始运行..
[2020-12-29 14:48:16.902293] INFO: dropnan: /y_2009, 0/0
[2020-12-29 14:48:19.000785] INFO: dropnan: /y_2010, 148021/149446
[2020-12-29 14:48:20.888278] INFO: dropnan: /y_2011, 161076/161786
[2020-12-29 14:48:22.688158] INFO: dropnan: /y_2012, 168061/168350
[2020-12-29 14:48:24.588999] INFO: dropnan: /y_2013, 165269/165299
[2020-12-29 14:48:26.605058] INFO: dropnan: /y_2014, 162828/162976
[2020-12-29 14:48:27.462058] INFO: dropnan: 行数: 805255/807857
[2020-12-29 14:48:27.490750] INFO: moduleinvoker: dropnan.v2 运行完成[11.482834s].
[2020-12-29 14:48:27.493146] INFO: moduleinvoker: stock_ranker_train.v6 开始运行..
[2020-12-29 14:48:33.313581] INFO: StockRanker: 特征预处理 ..
[2020-12-29 14:48:40.601360] INFO: StockRanker: prepare data: training ..
[2020-12-29 14:49:03.302123] INFO: StockRanker: sort ..
[2020-12-29 14:50:14.595495] INFO: StockRanker训练: dae4914a 准备训练: 805255 行数
[2020-12-29 14:50:14.685080] INFO: StockRanker训练: AI模型训练,将在805255*13=1046.83万数据上对模型训练进行20轮迭代训练。预计将需要4~8分钟。请耐心等待。
[2020-12-29 14:50:14.688492] WARNING: StockRanker训练: 成为高级会员/超级会员,将获得200%~1000%的加速 [url="https://bigquant.com/account/big_member/?from=lab1" style="display: inline-block;padding: 5px 7px;border-radius: 2px;background: #F0BC41;color: white"]快速开通会员[/url]
[2020-12-29 14:50:14.989248] INFO: StockRanker训练: 正在训练 ..
[2020-12-29 14:50:15.144741] INFO: StockRanker训练: 任务状态: Pending
[2020-12-29 14:50:25.182297] INFO: StockRanker训练: 00:00:05.1265708, finished iteration 1
[2020-12-29 14:50:25.184793] INFO: StockRanker训练: 任务状态: Running
[2020-12-29 14:50:35.384381] INFO: StockRanker训练: 00:00:06.5944972, finished iteration 2
[2020-12-29 14:50:35.385588] INFO: StockRanker训练: 00:00:08.5552345, finished iteration 3
[2020-12-29 14:50:35.485143] INFO: StockRanker训练: 00:00:10.5708341, finished iteration 4
[2020-12-29 14:50:35.486135] INFO: StockRanker训练: 00:00:12.1828592, finished iteration 5
[2020-12-29 14:50:35.487048] INFO: StockRanker训练: 00:00:14.6167683, finished iteration 6
[2020-12-29 14:50:45.616796] INFO: StockRanker训练: 00:00:16.8135613, finished iteration 7
[2020-12-29 14:50:45.617909] INFO: StockRanker训练: 00:00:19.3434172, finished iteration 8
[2020-12-29 14:50:45.684591] INFO: StockRanker训练: 00:00:22.4751700, finished iteration 9
[2020-12-29 14:50:45.685774] INFO: StockRanker训练: 00:00:24.9441649, finished iteration 10
[2020-12-29 14:50:55.732575] INFO: StockRanker训练: 00:00:27.7909573, finished iteration 11
[2020-12-29 14:50:55.733740] INFO: StockRanker训练: 00:00:30.8266563, finished iteration 12
[2020-12-29 14:50:55.785200] INFO: StockRanker训练: 00:00:33.3871416, finished iteration 13
[2020-12-29 14:51:05.884462] INFO: StockRanker训练: 00:00:36.0911263, finished iteration 14
[2020-12-29 14:51:05.885692] INFO: StockRanker训练: 00:00:38.1325894, finished iteration 15
[2020-12-29 14:51:05.985024] INFO: StockRanker训练: 00:00:40.5857782, finished iteration 16
[2020-12-29 14:51:05.986296] INFO: StockRanker训练: 00:00:43.0370726, finished iteration 17
[2020-12-29 14:51:05.987219] INFO: StockRanker训练: 00:00:44.8576684, finished iteration 18
[2020-12-29 14:51:16.063828] INFO: StockRanker训练: 00:00:46.7773486, finished iteration 19
[2020-12-29 14:51:16.085295] INFO: StockRanker训练: 00:00:48.9479737, finished iteration 20
[2020-12-29 14:51:16.086288] INFO: StockRanker训练: 任务状态: Succeeded
[2020-12-29 14:51:17.493902] INFO: moduleinvoker: stock_ranker_train.v6 运行完成[170.000744s].
[2020-12-29 14:51:17.589947] INFO: moduleinvoker: stock_ranker_predict.v5 开始运行..
[2020-12-29 14:51:22.892507] INFO: StockRanker预测: /y_2014 ..
[2020-12-29 14:51:31.784915] INFO: StockRanker预测: /y_2015 ..
[2020-12-29 14:52:10.386857] INFO: StockRanker预测: /y_2016 ..
[2020-12-29 14:52:49.288150] INFO: moduleinvoker: stock_ranker_predict.v5 运行完成[91.698171s].
[2020-12-29 14:52:49.588421] INFO: moduleinvoker: backtest.v8 开始运行..
[2020-12-29 14:52:49.601777] INFO: backtest: biglearning backtest:V8.4.2
[2020-12-29 14:52:49.684677] INFO: backtest: product_type:stock by specified
[2020-12-29 14:52:50.894740] INFO: moduleinvoker: cached.v2 开始运行..
[2020-12-29 14:52:50.902068] INFO: moduleinvoker: 命中缓存
[2020-12-29 14:52:50.989748] INFO: moduleinvoker: cached.v2 运行完成[0.095016s].
[2020-12-29 14:53:01.800449] INFO: algo: TradingAlgorithm V1.7.0
[2020-12-29 14:53:12.391590] INFO: algo: trading transform...
[2020-12-29 14:53:28.786493] INFO: algo: handle_splits get splits [dt:2015-04-16 00:00:00+00:00] [asset:Equity(1698 [300390.SZA]), ratio:0.6630873084068298]
[2020-12-29 14:53:28.788010] INFO: Position: position stock handle split[sid:1698, orig_amount:1300, new_amount:1960.0, orig_cost:39.02000768042313, new_cost:25.8737, ratio:0.6630873084068298, last_sale_price:24.700002670288086]
[2020-12-29 14:53:28.790999] INFO: Position: after split: PositionStock(asset:Equity(1698 [300390.SZA]), amount:1960.0, cost_basis:25.8737, last_sale_price:37.25)
[2020-12-29 14:53:28.792231] INFO: Position: returning cash: 12.9956
[2020-12-29 14:53:32.097724] INFO: algo: handle_splits get splits [dt:2015-05-11 00:00:00+00:00] [asset:Equity(1987 [002381.SZA]), ratio:0.6573165655136108]
[2020-12-29 14:53:32.099112] INFO: Position: position stock handle split[sid:1987, orig_amount:2300, new_amount:3499.0, orig_cost:21.76000057336224, new_cost:14.3032, ratio:0.6573165655136108, last_sale_price:14.059999465942383]
[2020-12-29 14:53:32.185812] INFO: Position: after split: PositionStock(asset:Equity(1987 [002381.SZA]), amount:3499.0, cost_basis:14.3032, last_sale_price:21.389997482299805)
[2020-12-29 14:53:32.189082] INFO: Position: returning cash: 1.0553
[2020-12-29 14:53:32.388892] INFO: algo: handle_splits get splits [dt:2015-05-12 00:00:00+00:00] [asset:Equity(2788 [300210.SZA]), ratio:0.9973901510238647]
[2020-12-29 14:53:33.006567] INFO: algo: handle_splits get splits [dt:2015-05-18 00:00:00+00:00] [asset:Equity(2535 [300298.SZA]), ratio:0.7643759846687317]
[2020-12-29 14:53:33.007736] INFO: Position: position stock handle split[sid:2535, orig_amount:1400, new_amount:1831.0, orig_cost:47.04999996876466, new_cost:35.9639, ratio:0.7643759846687317, last_sale_price:38.15000534057617]
[2020-12-29 14:53:33.008720] INFO: Position: after split: PositionStock(asset:Equity(2535 [300298.SZA]), amount:1831.0, cost_basis:35.9639, last_sale_price:49.90999984741211)
[2020-12-29 14:53:33.088503] INFO: Position: returning cash: 21.3401
[2020-12-29 14:53:34.899729] INFO: algo: handle_splits get splits [dt:2015-06-01 00:00:00+00:00] [asset:Equity(2516 [002534.SZA]), ratio:0.9940923452377319]
[2020-12-29 14:53:34.901665] INFO: Position: position stock handle split[sid:2516, orig_amount:2300, new_amount:2313.0, orig_cost:25.149999853129852, new_cost:25.0014, ratio:0.9940923452377319, last_sale_price:25.240005493164062]
[2020-12-29 14:53:34.902732] INFO: Position: after split: PositionStock(asset:Equity(2516 [002534.SZA]), amount:2313.0, cost_basis:25.0014, last_sale_price:25.39000129699707)
[2020-12-29 14:53:34.984893] INFO: Position: returning cash: 16.8693
[2020-12-29 14:53:35.091638] INFO: algo: handle_splits get splits [dt:2015-06-02 00:00:00+00:00] [asset:Equity(1039 [300013.SZA]), ratio:0.9997615218162537]
[2020-12-29 14:53:35.093043] INFO: Position: position stock handle split[sid:1039, orig_amount:8600, new_amount:8602.0, orig_cost:37.404649270915115, new_cost:37.3957, ratio:0.9997615218162537, last_sale_price:41.90000534057617]
[2020-12-29 14:53:35.096172] INFO: Position: after split: PositionStock(asset:Equity(1039 [300013.SZA]), amount:8602.0, cost_basis:37.3957, last_sale_price:41.90999984741211)
[2020-12-29 14:53:35.098584] INFO: Position: returning cash: 2.1537
[2020-12-29 14:53:36.585418] INFO: algo: handle_splits get splits [dt:2015-06-10 00:00:00+00:00] [asset:Equity(295 [603686.SHA]), ratio:0.9965032339096069]
[2020-12-29 14:53:36.586805] INFO: algo: handle_splits get splits [dt:2015-06-10 00:00:00+00:00] [asset:Equity(605 [002545.SZA]), ratio:0.9981369376182556]
[2020-12-29 14:53:36.590142] INFO: Position: position stock handle split[sid:295, orig_amount:900, new_amount:903.0, orig_cost:101.98999987351675, new_cost:101.6334, ratio:0.9965032339096069, last_sale_price:99.73004913330078]
[2020-12-29 14:53:36.593040] INFO: Position: after split: PositionStock(asset:Equity(295 [603686.SHA]), amount:903.0, cost_basis:101.6334, last_sale_price:100.08000183105469)
[2020-12-29 14:53:36.595201] INFO: Position: returning cash: 15.7706
[2020-12-29 14:53:36.596261] INFO: Position: position stock handle split[sid:605, orig_amount:2500, new_amount:2504.0, orig_cost:24.38999956790517, new_cost:24.3446, ratio:0.9981369376182556, last_sale_price:26.789995193481445]
[2020-12-29 14:53:36.597302] INFO: Position: after split: PositionStock(asset:Equity(605 [002545.SZA]), amount:2504.0, cost_basis:24.3446, last_sale_price:26.84000015258789)
[2020-12-29 14:53:36.684878] INFO: Position: returning cash: 17.8515
[2020-12-29 14:53:36.989462] INFO: algo: handle_splits get splits [dt:2015-06-11 00:00:00+00:00] [asset:Equity(1248 [601799.SHA]), ratio:0.9848071932792664]
[2020-12-29 14:53:36.991187] INFO: Position: position stock handle split[sid:1248, orig_amount:2500, new_amount:2538.0, orig_cost:49.840002258188676, new_cost:49.0828, ratio:0.9848071932792664, last_sale_price:50.560001373291016]
[2020-12-29 14:53:36.994394] INFO: Position: after split: PositionStock(asset:Equity(1248 [601799.SHA]), amount:2538.0, cost_basis:49.0828, last_sale_price:51.34000015258789)
[2020-12-29 14:53:36.996674] INFO: Position: returning cash: 28.7167
[2020-12-29 14:53:40.399095] INFO: algo: handle_splits get splits [dt:2015-07-03 00:00:00+00:00] [asset:Equity(1094 [300065.SZA]), ratio:0.9988888502120972]
[2020-12-29 14:53:40.400370] INFO: Position: position stock handle split[sid:1094, orig_amount:3000, new_amount:3003.0, orig_cost:31.399999679569728, new_cost:31.3651, ratio:0.9988888502120972, last_sale_price:26.969999313354492]
[2020-12-29 14:53:40.401402] INFO: Position: after split: PositionStock(asset:Equity(1094 [300065.SZA]), amount:3003.0, cost_basis:31.3651, last_sale_price:27.0)
[2020-12-29 14:53:40.485922] INFO: Position: returning cash: 9.0931
[2020-12-29 14:53:41.099819] INFO: algo: handle_splits get splits [dt:2015-07-08 00:00:00+00:00] [asset:Equity(1955 [300441.SZA]), ratio:0.9971550703048706]
[2020-12-29 14:53:41.199639] INFO: algo: handle_splits get splits [dt:2015-07-08 00:00:00+00:00] [asset:Equity(3318 [002552.SZA]), ratio:0.9986004829406738]
[2020-12-29 14:53:41.200924] INFO: Position: position stock handle split[sid:1955, orig_amount:3800, new_amount:3810.0, orig_cost:60.49001522838512, new_cost:60.3179, ratio:0.9971550703048706, last_sale_price:35.05000305175781]
[2020-12-29 14:53:41.284673] INFO: Position: after split: PositionStock(asset:Equity(1955 [300441.SZA]), amount:3810.0, cost_basis:60.3179, last_sale_price:35.150001525878906)
[2020-12-29 14:53:41.288185] INFO: Position: returning cash: 29.4973
[2020-12-29 14:53:41.291142] INFO: Position: position stock handle split[sid:3318, orig_amount:1100, new_amount:1101.0, orig_cost:19.26000025425286, new_cost:19.233, ratio:0.9986004829406738, last_sale_price:14.270000457763672]
[2020-12-29 14:53:41.293848] INFO: Position: after split: PositionStock(asset:Equity(3318 [002552.SZA]), amount:1101.0, cost_basis:19.233, last_sale_price:14.289999961853027)
[2020-12-29 14:53:41.294953] INFO: Position: returning cash: 7.729
[2020-12-29 14:53:41.886140] INFO: algo: handle_splits get splits [dt:2015-07-10 00:00:00+00:00] [asset:Equity(673 [000981.SZA]), ratio:0.9937267899513245]
[2020-12-29 14:53:41.887578] INFO: Position: position stock handle split[sid:673, orig_amount:2100, new_amount:2113.0, orig_cost:23.00000025732527, new_cost:22.8557, ratio:0.9937267899513245, last_sale_price:19.009994506835938]
[2020-12-29 14:53:41.890776] INFO: Position: after split: PositionStock(asset:Equity(673 [000981.SZA]), amount:2113.0, cost_basis:22.8557, last_sale_price:19.130001068115234)
[2020-12-29 14:53:41.893440] INFO: Position: returning cash: 4.8838
[2020-12-29 14:53:42.587006] INFO: algo: handle_splits get splits [dt:2015-07-14 00:00:00+00:00] [asset:Equity(2877 [600387.SHA]), ratio:0.9939687848091125]
[2020-12-29 14:53:42.588472] INFO: Position: position stock handle split[sid:2877, orig_amount:16100, new_amount:16197.0, orig_cost:22.055897218400723, new_cost:21.9229, ratio:0.9939687848091125, last_sale_price:16.48000144958496]
[2020-12-29 14:53:42.591865] INFO: Position: after split: PositionStock(asset:Equity(2877 [600387.SHA]), amount:16197.0, cost_basis:21.9229, last_sale_price:16.579999923706055)
[2020-12-29 14:53:42.594837] INFO: Position: returning cash: 11.4003
[2020-12-29 14:53:43.486866] INFO: algo: handle_splits get splits [dt:2015-07-17 00:00:00+00:00] [asset:Equity(2531 [000876.SZA]), ratio:0.9857631325721741]
[2020-12-29 14:53:43.488341] INFO: Position: position stock handle split[sid:2531, orig_amount:4700, new_amount:4767.0, orig_cost:17.899999635148145, new_cost:17.6452, ratio:0.9857631325721741, last_sale_price:17.309999465942383]
[2020-12-29 14:53:43.491611] INFO: Position: after split: PositionStock(asset:Equity(2531 [000876.SZA]), amount:4767.0, cost_basis:17.6452, last_sale_price:17.559999465942383)
[2020-12-29 14:53:43.494386] INFO: Position: returning cash: 15.2271
[2020-12-29 14:53:46.693840] INFO: algo: handle_splits get splits [dt:2015-08-05 00:00:00+00:00] [asset:Equity(2069 [600621.SHA]), ratio:0.9914772510528564]
[2020-12-29 14:53:46.695710] INFO: Position: position stock handle split[sid:2069, orig_amount:5200, new_amount:5244.0, orig_cost:9.780000774979888, new_cost:9.6966, ratio:0.9914772510528564, last_sale_price:10.469999313354492]
[2020-12-29 14:53:46.696801] INFO: Position: after split: PositionStock(asset:Equity(2069 [600621.SHA]), amount:5244.0, cost_basis:9.6966, last_sale_price:10.559999465942383)
[2020-12-29 14:53:46.697757] INFO: Position: returning cash: 7.3212
[2020-12-29 14:53:55.288489] INFO: algo: handle_splits get splits [dt:2015-09-28 00:00:00+00:00] [asset:Equity(1966 [002651.SZA]), ratio:0.3999229967594147]
[2020-12-29 14:53:55.289748] INFO: Position: position stock handle split[sid:1966, orig_amount:4100, new_amount:10251.0, orig_cost:27.00000031102789, new_cost:10.7979, ratio:0.3999229967594147, last_sale_price:10.389999389648438]
[2020-12-29 14:53:55.290809] INFO: Position: after split: PositionStock(asset:Equity(1966 [002651.SZA]), amount:10251.0, cost_basis:10.7979, last_sale_price:25.979999542236328)
[2020-12-29 14:53:55.291880] INFO: Position: returning cash: 10.1156
[2020-12-29 14:53:57.087346] INFO: algo: handle_splits get splits [dt:2015-10-19 00:00:00+00:00] [asset:Equity(605 [002545.SZA]), ratio:0.3146696388721466]
[2020-12-29 14:53:57.088760] INFO: Position: position stock handle split[sid:605, orig_amount:2504.0, new_amount:7957.0, orig_cost:24.3446, new_cost:7.6605, ratio:0.3146696388721466, last_sale_price:8.430000305175781]
[2020-12-29 14:53:57.091952] INFO: Position: after split: PositionStock(asset:Equity(605 [002545.SZA]), amount:7957.0, cost_basis:7.6605, last_sale_price:26.790000915527344)
[2020-12-29 14:53:57.094667] INFO: Position: returning cash: 4.653
[2020-12-29 14:54:18.500631] INFO: algo: handle_splits get splits [dt:2016-04-15 00:00:00+00:00] [asset:Equity(2529 [603288.SHA]), ratio:0.9807999134063721]
[2020-12-29 14:54:18.585144] INFO: Position: position stock handle split[sid:2529, orig_amount:2900, new_amount:2956.0, orig_cost:30.18000353814304, new_cost:29.6005, ratio:0.9807999134063721, last_sale_price:30.649999618530273]
[2020-12-29 14:54:18.586627] INFO: Position: after split: PositionStock(asset:Equity(2529 [603288.SHA]), amount:2956.0, cost_basis:29.6005, last_sale_price:31.250001907348633)
[2020-12-29 14:54:18.587933] INFO: Position: returning cash: 23.608
[2020-12-29 14:54:20.299137] INFO: algo: handle_splits get splits [dt:2016-04-27 00:00:00+00:00] [asset:Equity(517 [000661.SZA]), ratio:0.8729651570320129]
[2020-12-29 14:54:20.300539] INFO: Position: position stock handle split[sid:517, orig_amount:500, new_amount:572.0, orig_cost:104.59999865576887, new_cost:91.3122, ratio:0.8729651570320129, last_sale_price:90.09001159667969]
[2020-12-29 14:54:20.301678] INFO: Position: after split: PositionStock(asset:Equity(517 [000661.SZA]), amount:572.0, cost_basis:91.3122, last_sale_price:103.20000457763672)
[2020-12-29 14:54:20.388655] INFO: Position: returning cash: 68.5176
[2020-12-29 14:54:21.286287] INFO: algo: handle_splits get splits [dt:2016-05-05 00:00:00+00:00] [asset:Equity(2236 [300284.SZA]), ratio:0.994111955165863]
[2020-12-29 14:54:21.588753] INFO: algo: handle_splits get splits [dt:2016-05-06 00:00:00+00:00] [asset:Equity(209 [600654.SHA]), ratio:0.9957947731018066]
[2020-12-29 14:54:21.590062] INFO: Position: position stock handle split[sid:209, orig_amount:6200, new_amount:6226.0, orig_cost:22.874999096249756, new_cost:22.7788, ratio:0.9957947731018066, last_sale_price:23.68000030517578]
[2020-12-29 14:54:21.684808] INFO: Position: after split: PositionStock(asset:Equity(209 [600654.SHA]), amount:6226.0, cost_basis:22.7788, last_sale_price:23.780000686645508)
[2020-12-29 14:54:21.687708] INFO: Position: returning cash: 4.3218
[2020-12-29 14:54:26.102928] INFO: algo: handle_splits get splits [dt:2016-06-17 00:00:00+00:00] [asset:Equity(2569 [000090.SZA]), ratio:0.7030497789382935]
[2020-12-29 14:54:26.104375] INFO: Position: position stock handle split[sid:2569, orig_amount:7500, new_amount:10667.0, orig_cost:12.590004538409978, new_cost:8.8514, ratio:0.7030497789382935, last_sale_price:8.760000228881836]
[2020-12-29 14:54:26.107775] INFO: Position: after split: PositionStock(asset:Equity(2569 [000090.SZA]), amount:10667.0, cost_basis:8.8514, last_sale_price:12.460000038146973)
[2020-12-29 14:54:26.111051] INFO: Position: returning cash: 7.0774
[2020-12-29 14:54:26.286538] INFO: algo: handle_splits get splits [dt:2016-06-20 00:00:00+00:00] [asset:Equity(1766 [600873.SHA]), ratio:0.9842022061347961]
[2020-12-29 14:54:26.287927] INFO: algo: handle_splits get splits [dt:2016-06-20 00:00:00+00:00] [asset:Equity(1483 [002238.SZA]), ratio:0.8237682580947876]
[2020-12-29 14:54:26.289140] INFO: Position: position stock handle split[sid:1766, orig_amount:22900, new_amount:23267.0, orig_cost:6.260000354159725, new_cost:6.1611, ratio:0.9842022061347961, last_sale_price:6.230000019073486]
[2020-12-29 14:54:26.290355] INFO: Position: after split: PositionStock(asset:Equity(1766 [600873.SHA]), amount:23267.0, cost_basis:6.1611, last_sale_price:6.329999923706055)
[2020-12-29 14:54:26.291492] INFO: Position: returning cash: 3.5908
[2020-12-29 14:54:26.292666] INFO: Position: position stock handle split[sid:1483, orig_amount:3200, new_amount:3884.0, orig_cost:17.30000031419009, new_cost:14.2512, ratio:0.8237682580947876, last_sale_price:14.210002899169922]
[2020-12-29 14:54:26.293829] INFO: Position: after split: PositionStock(asset:Equity(1483 [002238.SZA]), amount:3884.0, cost_basis:14.2512, last_sale_price:17.25)
[2020-12-29 14:54:26.294874] INFO: Position: returning cash: 8.3505
[2020-12-29 14:54:27.087965] INFO: algo: handle_splits get splits [dt:2016-06-24 00:00:00+00:00] [asset:Equity(1549 [002462.SZA]), ratio:0.992947518825531]
[2020-12-29 14:54:48.698976] INFO: Performance: Simulated 488 trading days out of 488.
[2020-12-29 14:54:48.884914] INFO: Performance: first open: 2015-01-05 09:30:00+00:00
[2020-12-29 14:54:48.886016] INFO: Performance: last close: 2016-12-30 15:00:00+00:00
[2020-12-29 14:55:47.913462] INFO: moduleinvoker: backtest.v8 运行完成[178.325046s].
[2020-12-29 14:55:47.985301] INFO: moduleinvoker: trade.v4 运行完成[178.694784s].
In [32]:
m1.data.read()
Out[32]: