克隆策略

    {"description":"实验创建于2021/9/25","graph":{"edges":[{"to_node_id":"-55:data2","from_node_id":"-1120:data"},{"to_node_id":"-315:data1","from_node_id":"-1131:data"},{"to_node_id":"-1120:features","from_node_id":"-1230:data"},{"to_node_id":"-1131:features","from_node_id":"-1230:data"},{"to_node_id":"-55:data1","from_node_id":"-40:data"},{"to_node_id":"-690:training_ds","from_node_id":"-51:data"},{"to_node_id":"-329:data1","from_node_id":"-55:data"},{"to_node_id":"-322:features","from_node_id":"-4158:data"},{"to_node_id":"-336:features","from_node_id":"-4158:data"},{"to_node_id":"-2032:features","from_node_id":"-4158:data"},{"to_node_id":"-2041:features","from_node_id":"-4158:data"},{"to_node_id":"-2201:input_data","from_node_id":"-315:data"},{"to_node_id":"-2032:input_data","from_node_id":"-322:data"},{"to_node_id":"-51:input_data","from_node_id":"-329:data"},{"to_node_id":"-2041:input_data","from_node_id":"-336:data"},{"to_node_id":"-141:options_data","from_node_id":"-690:predictions"},{"to_node_id":"-690:features","from_node_id":"-1061:data"},{"to_node_id":"-329:data2","from_node_id":"-2032:data"},{"to_node_id":"-315:data2","from_node_id":"-2041:data"},{"to_node_id":"-241:features","from_node_id":"-236:data"},{"to_node_id":"-248:input_data","from_node_id":"-241:data"},{"to_node_id":"-257:input_1","from_node_id":"-248:data"},{"to_node_id":"-1131:instruments","from_node_id":"-257:data_1"},{"to_node_id":"-336:instruments","from_node_id":"-257:data_1"},{"to_node_id":"-141:instruments","from_node_id":"-257:data_1"},{"to_node_id":"-1536:instruments","from_node_id":"-1523:data"},{"to_node_id":"-1552:input_2","from_node_id":"-1523:data"},{"to_node_id":"-1536:features","from_node_id":"-1531:data"},{"to_node_id":"-1543:input_data","from_node_id":"-1536:data"},{"to_node_id":"-1552:input_1","from_node_id":"-1543:data"},{"to_node_id":"-1120:instruments","from_node_id":"-1552:data_1"},{"to_node_id":"-40:instruments","from_node_id":"-1552:data_1"},{"to_node_id":"-322:instruments","from_node_id":"-1552:data_1"},{"to_node_id":"-241:instruments","from_node_id":"-223:data"},{"to_node_id":"-257:input_2","from_node_id":"-223:data"},{"to_node_id":"-690:predict_ds","from_node_id":"-2201:data"}],"nodes":[{"node_id":"-1120","module_id":"BigQuantSpace.feature_extractor_1m.feature_extractor_1m-v2","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":"0","type":"Literal","bound_global_parameter":null},{"name":"workers","value":"10","type":"Literal","bound_global_parameter":null},{"name":"parallel_mode","value":"单机","type":"Literal","bound_global_parameter":null},{"name":"table_1m","value":"降频分钟数据(股票)","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-1120"},{"name":"features","node_id":"-1120"},{"name":"user_functions","node_id":"-1120"}],"output_ports":[{"name":"data","node_id":"-1120"}],"cacheable":true,"seq_num":2,"comment":"","comment_collapsed":true},{"node_id":"-1131","module_id":"BigQuantSpace.feature_extractor_1m.feature_extractor_1m-v2","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":"0","type":"Literal","bound_global_parameter":null},{"name":"workers","value":"10","type":"Literal","bound_global_parameter":null},{"name":"parallel_mode","value":"单机","type":"Literal","bound_global_parameter":null},{"name":"table_1m","value":"降频分钟数据(股票)","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-1131"},{"name":"features","node_id":"-1131"},{"name":"user_functions","node_id":"-1131"}],"output_ports":[{"name":"data","node_id":"-1131"}],"cacheable":true,"seq_num":3,"comment":"","comment_collapsed":true},{"node_id":"-1230","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\n#支持np pd ta math库 支持pandas内置函数 支持自定义表达式\n#close_=close.loc[145700] #抽取14点57分收盘价\n#(close*volume).sum()/volume.sum() #等同于vwap\n#vwap(close,volume) #vwap为自定义表达式\n#mean_4=close.loc[103000]+close.loc[113000]+close.loc[140000]+close.loc[145700]\n_ret=close.pct_change().fillna(close.iloc[0]/open.iloc[0])\n\n#分钟收益各阶局\nskew=_ret.skew()\ninday_ret=close.loc[145700]/close.loc[95900]-1 #日内涨跌幅累计\nlow_volume_cov=low.cov(volume) #日内成交量与最低价的协方差\nsome_rsi=ta.RSI(close).loc[95900] #RSI技术指标\nsar=ta.SAR(high,low,0.02,0.2).loc[145700] #SAR抛物线转向\n_pvt=(_ret*volume).cumsum()\npvt=_pvt.iloc[-1]-_pvt.mean() #PVT量价趋势因子\n\n#聪明钱指标\n_st=((close/close.shift(1)-1).abs()/volume.pow(0.5)).sort_values(ascending=False)\n_volume=volume[_st.index]\n_close=close[_st.index]\n_smart_money=(_volume.cumsum()/volume.sum())>=0.2\nsmart_money=((_volume[_smart_money]*_close[_smart_money]).sum()/_volume[_smart_money].sum())/((volume*close).sum()/volume.sum())\n\n#成交量各阶矩\nmean_v=volume.mean()\nstd_v=volume.std()\nskew_v=volume.skew()\nkurt_v=volume.kurt()\n#人气指标\n_mid=(high+low+close)/3\n_strong_sum=where(high>_mid.shift(1), high-_mid.shift(1), 0).sum()\n_weak_sum=where(low<_mid.shift(1),_mid.shift(1)-low,0).sum()\ncr=_strong_sum/_weak_sum\n#MFI资金流因子\n_mf=_mid*volume\n_mf_p=where(_mid>_mid.shift(1), _mf, 0)\n_mf_n=where(_mid<_mid.shift(1), -1*_mf, 0)\n_positive_mf=_mf_p.loc[100000:145700].sum()\n_negative_mf=_mf_n.loc[100000:145700].sum()\n_mr=_positive_mf/_negative_mf\nmfi=100-(100/(1+_mr))\n#MACD指数平滑异同平均\n_dif=ta.EMA(close,12)-ta.EMA(close,26)\nmacd=_dif.loc[145700]\n\n#SRDM动向速度比率\n_dmz=where(high+low<high.shift(1)+low.shift(1), 0, max(abs(high-high.shift(1)),abs(low-low.shift(1))))\n_dmf=where(high+low>=high.shift(1)+low.shift(1), 0, max(abs(high-high.shift(1)),abs(low-low.shift(1))))\n_admz=mean(_dmz,10)\n_admf=mean(_dmf,10)\n_srdm=where(_admz>_admf, (_admz-_admf)/_admz, where(_admz==_admf, 0, (_admz-_admf)/_admf))\nasrdm=mean(_srdm,10).loc[145700]\n# 真正的强度指数TSI\n_mom=close-close.shift(1)\n_mom_real=np.array(_mom,dtype='f8')\n_tsi_series=(ta.EMA(ta.EMA(_mom_real,25),13)/ta.EMA(ta.EMA(abs(_mom_real),25),13))*100\ntsi=_tsi_series.loc[145700]\n\n#日内大单流入\n_up_volumes=volume[_ret>0]\nmy_mf_net_amount_l=_up_volumes.nlargest(math.floor(0.1*len(_up_volumes))).sum()","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-1230"}],"output_ports":[{"name":"data","node_id":"-1230"}],"cacheable":true,"seq_num":4,"comment":"","comment_collapsed":true},{"node_id":"-40","module_id":"BigQuantSpace.advanced_auto_labeler.advanced_auto_labeler-v2","parameters":[{"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, -2) / 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, 8)\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":"000300.SHA","type":"Literal","bound_global_parameter":null},{"name":"drop_na_label","value":"True","type":"Literal","bound_global_parameter":null},{"name":"cast_label_int","value":"True","type":"Literal","bound_global_parameter":null},{"name":"user_functions","value":"{}","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-40"}],"output_ports":[{"name":"data","node_id":"-40"}],"cacheable":true,"seq_num":5,"comment":"此策略为模拟运行中证800的高频因子策略","comment_collapsed":true},{"node_id":"-51","module_id":"BigQuantSpace.dropnan.dropnan-v2","parameters":[],"input_ports":[{"name":"input_data","node_id":"-51"},{"name":"features","node_id":"-51"}],"output_ports":[{"name":"data","node_id":"-51"}],"cacheable":true,"seq_num":6,"comment":"","comment_collapsed":true},{"node_id":"-55","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":"-55"},{"name":"data2","node_id":"-55"}],"output_ports":[{"name":"data","node_id":"-55"}],"cacheable":true,"seq_num":7,"comment":"","comment_collapsed":true},{"node_id":"-4158","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"#用在高频因子抽取的模块上\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\n#支持np pd ta math库 支持pandas内置函数 支持自定义表达式\nreturn_5\nreturn_10\nreturn_20\navg_amount_5/avg_amount_10\nreturn_5/return_10\nta_cci_14_0\nturn_5/avg_turn_10\navg_amount_0/avg_amount_5\nswing_volatility_5_0/swing_volatility_60_0\namount_10/amount_30\nrank_volatility_10_0\nreturn_0\nta_ema_5_0/close_0\nclose_0/low_0\nta_ema_20_0/close_0\nopen_0/close_1\nhigh_1/close_0\nta_ema_30_0/close_0\nta_rsi(close_0, 6)\namount_0/amount_1\nriskOK=where(abs((close_1-open_1)/open_1)<0.09, 1,0) #前一天是否有极端行情","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-4158"}],"output_ports":[{"name":"data","node_id":"-4158"}],"cacheable":true,"seq_num":9,"comment":"","comment_collapsed":true},{"node_id":"-315","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":"-315"},{"name":"data2","node_id":"-315"}],"output_ports":[{"name":"data","node_id":"-315"}],"cacheable":false,"seq_num":10,"comment":"","comment_collapsed":true},{"node_id":"-322","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":"10","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-322"},{"name":"features","node_id":"-322"}],"output_ports":[{"name":"data","node_id":"-322"}],"cacheable":true,"seq_num":11,"comment":"","comment_collapsed":true},{"node_id":"-329","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":"-329"},{"name":"data2","node_id":"-329"}],"output_ports":[{"name":"data","node_id":"-329"}],"cacheable":true,"seq_num":8,"comment":"","comment_collapsed":true},{"node_id":"-336","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":90,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-336"},{"name":"features","node_id":"-336"}],"output_ports":[{"name":"data","node_id":"-336"}],"cacheable":true,"seq_num":12,"comment":"","comment_collapsed":true},{"node_id":"-690","module_id":"BigQuantSpace.lightgbm.lightgbm-v2","parameters":[{"name":"num_boost_round","value":"79","type":"Literal","bound_global_parameter":null},{"name":"objective","value":"排序(ndcg)","type":"Literal","bound_global_parameter":null},{"name":"num_class","value":"1","type":"Literal","bound_global_parameter":null},{"name":"num_leaves","value":"60","type":"Literal","bound_global_parameter":null},{"name":"learning_rate","value":"0.1","type":"Literal","bound_global_parameter":null},{"name":"min_data_in_leaf","value":"900","type":"Literal","bound_global_parameter":null},{"name":"max_bin","value":"1023","type":"Literal","bound_global_parameter":null},{"name":"key_cols","value":"date,instrument","type":"Literal","bound_global_parameter":null},{"name":"group_col","value":"date","type":"Literal","bound_global_parameter":null},{"name":"random_seed","value":"101","type":"Literal","bound_global_parameter":null},{"name":"other_train_parameters","value":"{'n_jobs':4,'label_gain':','.join([str(x) for x in range(20)]),\"max_position\":29,\"eval_at\":\"1,3,5,10\"}","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"training_ds","node_id":"-690"},{"name":"features","node_id":"-690"},{"name":"model","node_id":"-690"},{"name":"predict_ds","node_id":"-690"}],"output_ports":[{"name":"output_model","node_id":"-690"},{"name":"predictions","node_id":"-690"},{"name":"feature_gains","node_id":"-690"}],"cacheable":true,"seq_num":16,"comment":"","comment_collapsed":true},{"node_id":"-1061","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\n#支持np pd ta math库 支持pandas内置函数 支持自定义表达式\n#close_=close.loc[145700] #抽取14点57分收盘价\n#(close*volume).sum()/volume.sum() #等同于vwap\n#vwap(close,volume) #vwap为自定义表达式\n#mean_4=close.loc[103000]+close.loc[113000]+close.loc[140000]+close.loc[145700]\n\nskew\ninday_ret\nlow_volume_cov\nsome_rsi\nsar\npvt\nsmart_money\n#成交量各阶矩\nmean_v\nstd_v\nskew_v\nkurt_v\n#MFI资金流因子\nmfi \n#MACD指数平滑异同平均\n\nmacd\n\n#SRDM动向速度比率\n\nasrdm\n# 真正的强度指数TSI\n\ntsi\n\n#日内大单流入\n\n#my_mf_net_amount_l\n\n#cr\n#以下为日频因子\n\n\n#avg_amount_5/avg_amount_10\n#return_5/return_10\n#ta_cci_14_0\n#turn_5/avg_turn_10\n#avg_amount_0/avg_amount_5\n#swing_volatility_5_0/swing_volatility_60_0\n#amount_10/amount_30\n#rank_volatility_10_0\n#return_0\n#ta_ema_5_0/close_0\n#close_0/low_0\n#ta_ema_20_0/close_0\n#open_0/close_1\n#high_1/close_0\n#ta_ema_30_0/close_0\n#ta_rsi(close_0, 6)\n#amount_0/amount_1\n ","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-1061"}],"output_ports":[{"name":"data","node_id":"-1061"}],"cacheable":true,"seq_num":14,"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 =2\n # 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]\n context.stock_weights = [1 / stock_count for i in range(0, stock_count)]\n # 设置每只股票占用的最大资金比例\n context.max_cash_per_instrument = 1\n context.options['hold_days'] = 2\n","type":"Literal","bound_global_parameter":null},{"name":"handle_data","value":"# 回测引擎:每日数据处理函数,每天执行一次\ndef bigquant_run(context, data):\n\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 equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()}\n tmp = 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 sell_instruments = equities #instruments为卖出订单 \n \n if not is_staging and cash_for_sell > 0:\n\n# # print('rank order for sell %s' % instruments)\n for instrument in sell_instruments:\n# if instrument in tmp:\n# print(\"涨停,不卖出\",instrument)\n# continue\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 \n #自己加入的 防止同一天卖出后又买入'''\n '''buySet=set(buy_instruments)\n sellSet=[]\n for key in sell_instruments.keys():\n sellSet.append(key)\n sellSet=set(sellSet)\n buySet=buySet.difference(sellSet) #去除重复股票代码\n buy_instruments=list(buySet)\n print(\"buySet=\")\n print(buy_instruments)\n print(\"sellSet\")\n print(sellSet) '''\n #自己加入的 防止同一天卖出后又买入**********\n \n \n \n max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument\n #个股风控模块################################### \n '''\n if len(ranker_prediction)==0:\n return\n \n end_date =ranker_prediction.date.iloc[0]\n start_date = pd.to_datetime(end_date)-datetime.timedelta(days=4)\n\n \n print(end_date)\n \n #获取数据\n buy_df = DataSource(\"bar1d_CN_STOCK_A\").read(instruments=buy_instruments,start_date=start_date.strftime(\"%Y-%m-%d\"),end_date=end_date,feild=['date','instrument','close'])\n def riskCp(subdf): \n subdf2=subdf.iloc[::-1] #颠倒顺序,最新的放在前面\n subdf2.set_index('date',inplace=True)\n subdf2.reset_index(inplace=True)\n #print(subdf2)\n try:\n close1=subdf2.loc[0,'close'] #前一日的收盘价\n close2=subdf2.loc[1,'close'] #前二日的开盘价 , \n #print(\"close1=\")\n #print(close1)\n #print(\"close2=\")\n #print(close2)\n #print(\"abs=\")\n \n \n except BaseException:\n return 2\n if abs((close1-close2)/close2)<0.09:\n return 0\n else:\n return 1 # 如果是1 说明有风险 \n #获得风险列表\n riskList=buy_df.groupby(by=\"instrument\").apply(riskCp)\n for StockName in buy_instruments:\n if riskList[StockName]!=0:\n buy_instruments.remove(StockName) #去除buy_instruments中的风险代码\n \n print('riskList=')\n print(riskList)\n print('buy_instruments=')\n print(buy_instruments)\n '''\n #################################################个股风控代码结束\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&data.can_trade(context.symbol(instrument)):\n \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","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":"100000","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":"000300.SHA","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":17,"comment":"","comment_collapsed":true},{"node_id":"-2032","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":"False","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":"-2032"},{"name":"features","node_id":"-2032"}],"output_ports":[{"name":"data","node_id":"-2032"}],"cacheable":true,"seq_num":19,"comment":"","comment_collapsed":true},{"node_id":"-2041","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":"False","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":"-2041"},{"name":"features","node_id":"-2041"}],"output_ports":[{"name":"data","node_id":"-2041"}],"cacheable":false,"seq_num":20,"comment":"","comment_collapsed":true},{"node_id":"-236","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\nin_csi500_0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-236"}],"output_ports":[{"name":"data","node_id":"-236"}],"cacheable":true,"seq_num":26,"comment":"","comment_collapsed":true},{"node_id":"-241","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":"5","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-241"},{"name":"features","node_id":"-241"}],"output_ports":[{"name":"data","node_id":"-241"}],"cacheable":true,"seq_num":27,"comment":"","comment_collapsed":true},{"node_id":"-248","module_id":"BigQuantSpace.filter.filter-v3","parameters":[{"name":"expr","value":"in_csi500_0 == 1","type":"Literal","bound_global_parameter":null},{"name":"output_left_data","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-248"}],"output_ports":[{"name":"data","node_id":"-248"},{"name":"left_data","node_id":"-248"}],"cacheable":true,"seq_num":28,"comment":"","comment_collapsed":true},{"node_id":"-257","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):\n #input_1是使用in_csi500_0过滤后的df数据。\n #input_2是来自与证卷代码列表,用于提取日期\n #输出作为新的证卷代码列表\n # 示例代码如下。在这里编写您的代码\n df=input_1.read_df()\n #df.head()\n code=df['instrument']\n \n code=pd.DataFrame(code)\n \n \n code=code.drop_duplicates()\n \n codeList=list(code.instrument)\n \n codedate=input_2.read_pickle()\n startdate=codedate[\"start_date\"]\n enddate=codedate[\"end_date\"]\n print(startdate)\n print(enddate) \n #df = DataSource(\"index_constituent_CN_STOCK_A\").read(start_date=\"2021-06-01\", end_date=\"2021-06-01\")\n #code=df.loc[df.in_csi800==1].instrument \n #codeList=list(code.drop_duplicates()) #获取上证50代码\n #dictList={\"instruments\":codeList,\"start_date\":\"2020-11-20\",\"end_date\":\"2021-06-20\"} # 将日期长度更改成一年,但是取得是2021年的漂亮50\n #trainingCodes=DataSource().write_pickle(dictList) #训练集股票代码\n \n dictList={\"instruments\":codeList,\"start_date\":startdate,\"end_date\":enddate} # 将日期长度更改成一年,但是取得是2021年的漂亮50\n Codes=DataSource().write_pickle(dictList) #测试集合股票代码\n \n return Outputs(data_1=Codes, 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":"input_1,input_2","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"data_1","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-257"},{"name":"input_2","node_id":"-257"},{"name":"input_3","node_id":"-257"}],"output_ports":[{"name":"data_1","node_id":"-257"},{"name":"data_2","node_id":"-257"},{"name":"data_3","node_id":"-257"}],"cacheable":true,"seq_num":29,"comment":"输出1是测试集股票代码","comment_collapsed":false},{"node_id":"-1523","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2021-01-20","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"2021-06-20","type":"Literal","bound_global_parameter":null},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":0,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"-1523"}],"output_ports":[{"name":"data","node_id":"-1523"}],"cacheable":true,"seq_num":21,"comment":"","comment_collapsed":true},{"node_id":"-1531","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"\n# #号开始的表示注释,注释需单独一行\n# 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征\nin_csi500_0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-1531"}],"output_ports":[{"name":"data","node_id":"-1531"}],"cacheable":true,"seq_num":22,"comment":"","comment_collapsed":true},{"node_id":"-1536","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":90,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-1536"},{"name":"features","node_id":"-1536"}],"output_ports":[{"name":"data","node_id":"-1536"}],"cacheable":true,"seq_num":23,"comment":"","comment_collapsed":true},{"node_id":"-1543","module_id":"BigQuantSpace.filter.filter-v3","parameters":[{"name":"expr","value":"in_csi500_0 == 1","type":"Literal","bound_global_parameter":null},{"name":"output_left_data","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_data","node_id":"-1543"}],"output_ports":[{"name":"data","node_id":"-1543"},{"name":"left_data","node_id":"-1543"}],"cacheable":true,"seq_num":24,"comment":"","comment_collapsed":true},{"node_id":"-1552","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):\n #input_1是使用in_csi500_0过滤后的df数据。\n #input_2是来自与证卷代码列表,用于提取日期\n #输出作为新的证卷代码列表\n # 示例代码如下。在这里编写您的代码\n df=input_1.read_df()\n #df.head()\n code=df['instrument']\n \n code=pd.DataFrame(code)\n \n \n code=code.drop_duplicates()\n \n codeList=list(code.instrument)\n \n codedate=input_2.read_pickle()\n startdate=codedate[\"start_date\"]\n enddate=codedate[\"end_date\"]\n print(startdate)\n print(enddate) \n #df = DataSource(\"index_constituent_CN_STOCK_A\").read(start_date=\"2021-06-01\", end_date=\"2021-06-01\")\n #code=df.loc[df.in_csi800==1].instrument \n #codeList=list(code.drop_duplicates()) #获取上证50代码\n #dictList={\"instruments\":codeList,\"start_date\":\"2020-11-20\",\"end_date\":\"2021-06-20\"} # 将日期长度更改成一年,但是取得是2021年的漂亮50\n #trainingCodes=DataSource().write_pickle(dictList) #训练集股票代码\n \n dictList={\"instruments\":codeList,\"start_date\":startdate,\"end_date\":enddate} # 将日期长度更改成一年,但是取得是2021年的漂亮50\n Codes=DataSource().write_pickle(dictList) #测试集合股票代码\n \n return Outputs(data_1=Codes, 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":"input_1,input_2","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"data_1","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-1552"},{"name":"input_2","node_id":"-1552"},{"name":"input_3","node_id":"-1552"}],"output_ports":[{"name":"data_1","node_id":"-1552"},{"name":"data_2","node_id":"-1552"},{"name":"data_3","node_id":"-1552"}],"cacheable":true,"seq_num":25,"comment":"输出1是训练集股票代码","comment_collapsed":false},{"node_id":"-223","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2021-06-22","type":"Literal","bound_global_parameter":"交易日期"},{"name":"end_date","value":"2021-10-22","type":"Literal","bound_global_parameter":"交易日期"},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":0,"type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"-223"}],"output_ports":[{"name":"data","node_id":"-223"}],"cacheable":true,"seq_num":15,"comment":"","comment_collapsed":true},{"node_id":"-2201","module_id":"BigQuantSpace.dropnan.dropnan-v2","parameters":[],"input_ports":[{"name":"input_data","node_id":"-2201"},{"name":"features","node_id":"-2201"}],"output_ports":[{"name":"data","node_id":"-2201"}],"cacheable":true,"seq_num":13,"comment":"","comment_collapsed":true}],"node_layout":"<node_postions><node_position Node='-1120' Position='203,260,200,200'/><node_position Node='-1131' Position='781,332,200,200'/><node_position Node='-1230' Position='471,88,200,200'/><node_position Node='-40' Position='-114,309,200,200'/><node_position Node='-51' Position='157,824,200,200'/><node_position Node='-55' Position='-86,467,200,200'/><node_position Node='-4158' Position='452,353,200,200'/><node_position Node='-315' Position='695,704,200,200'/><node_position Node='-322' Position='287,443,200,200'/><node_position Node='-329' Position='112,704,200,200'/><node_position Node='-336' Position='766,455,200,200'/><node_position Node='-690' Position='425,1028,200,200'/><node_position Node='-1061' Position='452,864,200,200'/><node_position Node='-141' Position='441,1119,200,200'/><node_position Node='-2032' Position='248,564,200,200'/><node_position Node='-2041' Position='749,573,200,200'/><node_position Node='-236' Position='809,-554,200,200'/><node_position Node='-241' Position='626,-459,200,200'/><node_position Node='-248' Position='615,-377,200,200'/><node_position Node='-257' Position='667,-178,200,200'/><node_position Node='-1523' Position='-134,-558,200,200'/><node_position Node='-1531' Position='175,-544,200,200'/><node_position Node='-1536' Position='-7,-449,200,200'/><node_position Node='-1543' Position='-18,-366,200,200'/><node_position Node='-1552' Position='11,156,200,200'/><node_position Node='-223' Position='594,-667,200,200'/><node_position Node='-2201' Position='752,810,200,200'/></node_postions>"},"nodes_readonly":false,"studio_version":"v2"}
    In [13]:
    # 本代码由可视化策略环境自动生成 2021年10月25日 10:42
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
    
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m25_run_bigquant_run(input_1, input_2):
        #input_1是使用in_csi500_0过滤后的df数据。
        #input_2是来自与证卷代码列表,用于提取日期
        #输出作为新的证卷代码列表
        # 示例代码如下。在这里编写您的代码
        df=input_1.read_df()
        #df.head()
        code=df['instrument']
        
        code=pd.DataFrame(code)
        
        
        code=code.drop_duplicates()
         
        codeList=list(code.instrument)
         
        codedate=input_2.read_pickle()
        startdate=codedate["start_date"]
        enddate=codedate["end_date"]
        print(startdate)
        print(enddate)    
        #df = DataSource("index_constituent_CN_STOCK_A").read(start_date="2021-06-01", end_date="2021-06-01")
        #code=df.loc[df.in_csi800==1].instrument 
        #codeList=list(code.drop_duplicates())  #获取上证50代码
        #dictList={"instruments":codeList,"start_date":"2020-11-20","end_date":"2021-06-20"}  # 将日期长度更改成一年,但是取得是2021年的漂亮50
        #trainingCodes=DataSource().write_pickle(dictList)  #训练集股票代码
        
        dictList={"instruments":codeList,"start_date":startdate,"end_date":enddate}  # 将日期长度更改成一年,但是取得是2021年的漂亮50
        Codes=DataSource().write_pickle(dictList) #测试集合股票代码
     
        return Outputs(data_1=Codes, data_2=None, data_3=None)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m25_post_run_bigquant_run(outputs):
        return outputs
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m29_run_bigquant_run(input_1, input_2):
        #input_1是使用in_csi500_0过滤后的df数据。
        #input_2是来自与证卷代码列表,用于提取日期
        #输出作为新的证卷代码列表
        # 示例代码如下。在这里编写您的代码
        df=input_1.read_df()
        #df.head()
        code=df['instrument']
        
        code=pd.DataFrame(code)
        
        
        code=code.drop_duplicates()
         
        codeList=list(code.instrument)
         
        codedate=input_2.read_pickle()
        startdate=codedate["start_date"]
        enddate=codedate["end_date"]
        print(startdate)
        print(enddate)    
        #df = DataSource("index_constituent_CN_STOCK_A").read(start_date="2021-06-01", end_date="2021-06-01")
        #code=df.loc[df.in_csi800==1].instrument 
        #codeList=list(code.drop_duplicates())  #获取上证50代码
        #dictList={"instruments":codeList,"start_date":"2020-11-20","end_date":"2021-06-20"}  # 将日期长度更改成一年,但是取得是2021年的漂亮50
        #trainingCodes=DataSource().write_pickle(dictList)  #训练集股票代码
        
        dictList={"instruments":codeList,"start_date":startdate,"end_date":enddate}  # 将日期长度更改成一年,但是取得是2021年的漂亮50
        Codes=DataSource().write_pickle(dictList) #测试集合股票代码
     
        return Outputs(data_1=Codes, data_2=None, data_3=None)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m29_post_run_bigquant_run(outputs):
        return outputs
    
    # 回测引擎:初始化函数,只执行一次
    def m17_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 =2
        # 每只的股票的权重,如下的权重分配会使得靠前的股票分配多一点的资金,[0.339160, 0.213986, 0.169580, ..]
        context.stock_weights = [1 / stock_count for i in range(0, stock_count)]
        # 设置每只股票占用的最大资金比例
        context.max_cash_per_instrument = 1
        context.options['hold_days'] = 2
    
    # 回测引擎:每日数据处理函数,每天执行一次
    def m17_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天之后才开始卖出;对持仓的股票,按机器学习算法预测的排序末位淘汰
        equities = {e.symbol: e for e, p in context.perf_tracker.position_tracker.positions.items()}
        tmp = list(reversed(list(ranker_prediction.instrument[ranker_prediction.instrument.apply(
                    lambda x: x in equities and not context.has_unfinished_sell_order(equities[x]))])))
        sell_instruments = equities #instruments为卖出订单  
            
        if not is_staging and cash_for_sell > 0:
    
    #         # print('rank order for sell %s' % instruments)
            for instrument in sell_instruments:
    #             if instrument in tmp:
    #                 print("涨停,不卖出",instrument)
    #                 continue
                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)])
        
        #自己加入的 防止同一天卖出后又买入'''
        '''buySet=set(buy_instruments)
        sellSet=[]
        for key in sell_instruments.keys():
            sellSet.append(key)
        sellSet=set(sellSet)
        buySet=buySet.difference(sellSet) #去除重复股票代码
        buy_instruments=list(buySet)
        print("buySet=")
        print(buy_instruments)
        print("sellSet")
        print(sellSet)    '''
         #自己加入的 防止同一天卖出后又买入**********
        
        
        
        max_cash_per_instrument = context.portfolio.portfolio_value * context.max_cash_per_instrument
        #个股风控模块################################### 
        '''
        if len(ranker_prediction)==0:
            return
         
        end_date =ranker_prediction.date.iloc[0]
        start_date = pd.to_datetime(end_date)-datetime.timedelta(days=4)
    
        
        print(end_date)
        
        #获取数据
        buy_df = DataSource("bar1d_CN_STOCK_A").read(instruments=buy_instruments,start_date=start_date.strftime("%Y-%m-%d"),end_date=end_date,feild=['date','instrument','close'])
        def riskCp(subdf):    
            subdf2=subdf.iloc[::-1] #颠倒顺序,最新的放在前面
            subdf2.set_index('date',inplace=True)
            subdf2.reset_index(inplace=True)
            #print(subdf2)
            try:
                close1=subdf2.loc[0,'close'] #前一日的收盘价
                close2=subdf2.loc[1,'close'] #前二日的开盘价 , 
            #print("close1=")
            #print(close1)
            #print("close2=")
            #print(close2)
            #print("abs=")
             
            
            except BaseException:
                return 2
            if abs((close1-close2)/close2)<0.09:
                return 0
            else:
                return 1   # 如果是1 说明有风险  
        #获得风险列表
        riskList=buy_df.groupby(by="instrument").apply(riskCp)
        for StockName in buy_instruments:
            if riskList[StockName]!=0:
                buy_instruments.remove(StockName)  #去除buy_instruments中的风险代码
                
        print('riskList=')
        print(riskList)
        print('buy_instruments=')
        print(buy_instruments)
        '''
        #################################################个股风控代码结束
        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&data.can_trade(context.symbol(instrument)):
               
                context.order_value(context.symbol(instrument), cash)
    
    # 回测引擎:准备数据,只执行一次
    def m17_prepare_bigquant_run(context):
        pass
    
    
    m4 = M.input_features.v1(
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    #支持np  pd  ta math库  支持pandas内置函数  支持自定义表达式
    #close_=close.loc[145700] #抽取14点57分收盘价
    #(close*volume).sum()/volume.sum() #等同于vwap
    #vwap(close,volume)  #vwap为自定义表达式
    #mean_4=close.loc[103000]+close.loc[113000]+close.loc[140000]+close.loc[145700]
    _ret=close.pct_change().fillna(close.iloc[0]/open.iloc[0])
    
    #分钟收益各阶局
    skew=_ret.skew()
    inday_ret=close.loc[145700]/close.loc[95900]-1   #日内涨跌幅累计
    low_volume_cov=low.cov(volume)                #日内成交量与最低价的协方差
    some_rsi=ta.RSI(close).loc[95900] #RSI技术指标
    sar=ta.SAR(high,low,0.02,0.2).loc[145700]            #SAR抛物线转向
    _pvt=(_ret*volume).cumsum()
    pvt=_pvt.iloc[-1]-_pvt.mean()   #PVT量价趋势因子
    
    #聪明钱指标
    _st=((close/close.shift(1)-1).abs()/volume.pow(0.5)).sort_values(ascending=False)
    _volume=volume[_st.index]
    _close=close[_st.index]
    _smart_money=(_volume.cumsum()/volume.sum())>=0.2
    smart_money=((_volume[_smart_money]*_close[_smart_money]).sum()/_volume[_smart_money].sum())/((volume*close).sum()/volume.sum())
    
    #成交量各阶矩
    mean_v=volume.mean()
    std_v=volume.std()
    skew_v=volume.skew()
    kurt_v=volume.kurt()
    #人气指标
    _mid=(high+low+close)/3
    _strong_sum=where(high>_mid.shift(1), high-_mid.shift(1), 0).sum()
    _weak_sum=where(low<_mid.shift(1),_mid.shift(1)-low,0).sum()
    cr=_strong_sum/_weak_sum
    #MFI资金流因子
    _mf=_mid*volume
    _mf_p=where(_mid>_mid.shift(1), _mf, 0)
    _mf_n=where(_mid<_mid.shift(1), -1*_mf, 0)
    _positive_mf=_mf_p.loc[100000:145700].sum()
    _negative_mf=_mf_n.loc[100000:145700].sum()
    _mr=_positive_mf/_negative_mf
    mfi=100-(100/(1+_mr))
    #MACD指数平滑异同平均
    _dif=ta.EMA(close,12)-ta.EMA(close,26)
    macd=_dif.loc[145700]
    
    #SRDM动向速度比率
    _dmz=where(high+low<high.shift(1)+low.shift(1), 0, max(abs(high-high.shift(1)),abs(low-low.shift(1))))
    _dmf=where(high+low>=high.shift(1)+low.shift(1), 0, max(abs(high-high.shift(1)),abs(low-low.shift(1))))
    _admz=mean(_dmz,10)
    _admf=mean(_dmf,10)
    _srdm=where(_admz>_admf, (_admz-_admf)/_admz, where(_admz==_admf, 0, (_admz-_admf)/_admf))
    asrdm=mean(_srdm,10).loc[145700]
    # 真正的强度指数TSI
    _mom=close-close.shift(1)
    _mom_real=np.array(_mom,dtype='f8')
    _tsi_series=(ta.EMA(ta.EMA(_mom_real,25),13)/ta.EMA(ta.EMA(abs(_mom_real),25),13))*100
    tsi=_tsi_series.loc[145700]
    
    #日内大单流入
    _up_volumes=volume[_ret>0]
    my_mf_net_amount_l=_up_volumes.nlargest(math.floor(0.1*len(_up_volumes))).sum()"""
    )
    
    m9 = M.input_features.v1(
        features="""#用在高频因子抽取的模块上
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    #支持np  pd  ta math库  支持pandas内置函数  支持自定义表达式
    return_5
    return_10
    return_20
    avg_amount_5/avg_amount_10
    return_5/return_10
    ta_cci_14_0
    turn_5/avg_turn_10
    avg_amount_0/avg_amount_5
    swing_volatility_5_0/swing_volatility_60_0
    amount_10/amount_30
    rank_volatility_10_0
    return_0
    ta_ema_5_0/close_0
    close_0/low_0
    ta_ema_20_0/close_0
    open_0/close_1
    high_1/close_0
    ta_ema_30_0/close_0
    ta_rsi(close_0, 6)
    amount_0/amount_1
    riskOK=where(abs((close_1-open_1)/open_1)<0.09, 1,0) #前一天是否有极端行情"""
    )
    
    m14 = M.input_features.v1(
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    #支持np  pd  ta math库  支持pandas内置函数  支持自定义表达式
    #close_=close.loc[145700] #抽取14点57分收盘价
    #(close*volume).sum()/volume.sum() #等同于vwap
    #vwap(close,volume)  #vwap为自定义表达式
    #mean_4=close.loc[103000]+close.loc[113000]+close.loc[140000]+close.loc[145700]
    
    skew
    inday_ret
    low_volume_cov
    some_rsi
    sar
    pvt
    smart_money
    #成交量各阶矩
    mean_v
    std_v
    skew_v
    kurt_v
    #MFI资金流因子
    mfi 
    #MACD指数平滑异同平均
    
    macd
    
    #SRDM动向速度比率
    
    asrdm
    # 真正的强度指数TSI
    
    tsi
    
    #日内大单流入
    
    #my_mf_net_amount_l
    
    #cr
    #以下为日频因子
    
    
    #avg_amount_5/avg_amount_10
    #return_5/return_10
    #ta_cci_14_0
    #turn_5/avg_turn_10
    #avg_amount_0/avg_amount_5
    #swing_volatility_5_0/swing_volatility_60_0
    #amount_10/amount_30
    #rank_volatility_10_0
    #return_0
    #ta_ema_5_0/close_0
    #close_0/low_0
    #ta_ema_20_0/close_0
    #open_0/close_1
    #high_1/close_0
    #ta_ema_30_0/close_0
    #ta_rsi(close_0, 6)
    #amount_0/amount_1
     """
    )
    
    m26 = M.input_features.v1(
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    in_csi500_0"""
    )
    
    m21 = M.instruments.v2(
        start_date='2021-01-20',
        end_date='2021-06-20',
        market='CN_STOCK_A',
        instrument_list='',
        max_count=0
    )
    
    m22 = M.input_features.v1(
        features="""
    # #号开始的表示注释,注释需单独一行
    # 多个特征,每行一个,可以包含基础特征和衍生特征,特征须为本平台特征
    in_csi500_0"""
    )
    
    m23 = M.general_feature_extractor.v7(
        instruments=m21.data,
        features=m22.data,
        start_date='',
        end_date='',
        before_start_days=90
    )
    
    m24 = M.filter.v3(
        input_data=m23.data,
        expr='in_csi500_0 == 1',
        output_left_data=False
    )
    
    m25 = M.cached.v3(
        input_1=m24.data,
        input_2=m21.data,
        run=m25_run_bigquant_run,
        post_run=m25_post_run_bigquant_run,
        input_ports='input_1,input_2',
        params='{}',
        output_ports='data_1'
    )
    
    m2 = M.feature_extractor_1m.v2(
        instruments=m25.data_1,
        features=m4.data,
        start_date='',
        end_date='',
        before_start_days=0,
        workers=10,
        parallel_mode='单机',
        table_1m='降频分钟数据(股票)'
    )
    
    m5 = M.advanced_auto_labeler.v2(
        instruments=m25.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, -2) / shift(open, -1)
    
    # 极值处理:用1%和99%分位的值做clip
    clip(label, all_quantile(label, 0.01), all_quantile(label, 0.99))
    
    # 将分数映射到分类,这里使用20个分类
    all_wbins(label, 8)
    
    # 过滤掉一字涨停的情况 (设置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,
        user_functions={}
    )
    
    m7 = M.join.v3(
        data1=m5.data,
        data2=m2.data,
        on='date,instrument',
        how='inner',
        sort=False
    )
    
    m11 = M.general_feature_extractor.v7(
        instruments=m25.data_1,
        features=m9.data,
        start_date='',
        end_date='',
        before_start_days=10
    )
    
    m19 = M.derived_feature_extractor.v3(
        input_data=m11.data,
        features=m9.data,
        date_col='date',
        instrument_col='instrument',
        drop_na=False,
        remove_extra_columns=False,
        user_functions={}
    )
    
    m8 = M.join.v3(
        data1=m7.data,
        data2=m19.data,
        on='date,instrument',
        how='inner',
        sort=False
    )
    
    m6 = M.dropnan.v2(
        input_data=m8.data
    )
    
    m15 = M.instruments.v2(
        start_date=T.live_run_param('trading_date', '2021-06-22'),
        end_date=T.live_run_param('trading_date', '2021-10-22'),
        market='CN_STOCK_A',
        instrument_list='',
        max_count=0
    )
    
    m27 = M.general_feature_extractor.v7(
        instruments=m15.data,
        features=m26.data,
        start_date='',
        end_date='',
        before_start_days=5
    )
    
    m28 = M.filter.v3(
        input_data=m27.data,
        expr='in_csi500_0 == 1',
        output_left_data=False
    )
    
    m29 = M.cached.v3(
        input_1=m28.data,
        input_2=m15.data,
        run=m29_run_bigquant_run,
        post_run=m29_post_run_bigquant_run,
        input_ports='input_1,input_2',
        params='{}',
        output_ports='data_1'
    )
    
    m3 = M.feature_extractor_1m.v2(
        instruments=m29.data_1,
        features=m4.data,
        start_date='',
        end_date='',
        before_start_days=0,
        workers=10,
        parallel_mode='单机',
        table_1m='降频分钟数据(股票)'
    )
    
    m12 = M.general_feature_extractor.v7(
        instruments=m29.data_1,
        features=m9.data,
        start_date='',
        end_date='',
        before_start_days=90
    )
    
    m20 = M.derived_feature_extractor.v3(
        input_data=m12.data,
        features=m9.data,
        date_col='date',
        instrument_col='instrument',
        drop_na=False,
        remove_extra_columns=False,
        user_functions={},
        m_cached=False
    )
    
    m10 = M.join.v3(
        data1=m3.data,
        data2=m20.data,
        on='date,instrument',
        how='inner',
        sort=False,
        m_cached=False
    )
    
    m13 = M.dropnan.v2(
        input_data=m10.data
    )
    
    m16 = M.lightgbm.v2(
        training_ds=m6.data,
        features=m14.data,
        predict_ds=m13.data,
        num_boost_round=79,
        objective='排序(ndcg)',
        num_class=1,
        num_leaves=60,
        learning_rate=0.1,
        min_data_in_leaf=900,
        max_bin=1023,
        key_cols='date,instrument',
        group_col='date',
        random_seed=101,
        other_train_parameters={'n_jobs':4,'label_gain':','.join([str(x) for x in range(20)]),"max_position":29,"eval_at":"1,3,5,10"}
    )
    
    m17 = M.trade.v4(
        instruments=m29.data_1,
        options_data=m16.predictions,
        start_date='',
        end_date='',
        initialize=m17_initialize_bigquant_run,
        handle_data=m17_handle_data_bigquant_run,
        prepare=m17_prepare_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='000300.SHA'
    )
    
    • 收益率0.0%
    • 年化收益率0.0%
    • 基准收益率0.64%
    • 阿尔法0
    • 贝塔0
    • 夏普比率0
    • 胜率0.0
    • 盈亏比0.0
    • 收益波动率0%
    • 信息比率0
    • 最大回撤0.0%
    bigcharts-data-start/{"__type":"tabs","__id":"bigchart-aeae573432924d3eb96b4982d201cd31"}/bigcharts-data-end
    In [ ]:
    test=m16.predictions.read_df()
    test