{"description":"实验创建于2023/2/10","graph":{"edges":[{"to_node_id":"-129:features","from_node_id":"-24:data"},{"to_node_id":"-139:input_3","from_node_id":"-24:data"},{"to_node_id":"-151:input_3","from_node_id":"-24:data"},{"to_node_id":"-163:features","from_node_id":"-97:data"},{"to_node_id":"-129:instruments","from_node_id":"-120:data"},{"to_node_id":"-162:instruments","from_node_id":"-120:data"},{"to_node_id":"-163:instruments","from_node_id":"-120:data"},{"to_node_id":"-139:input_2","from_node_id":"-129:data"},{"to_node_id":"-151:input_2","from_node_id":"-139:data_1"},{"to_node_id":"-162:options_data","from_node_id":"-151:data_1"},{"to_node_id":"-170:input_data","from_node_id":"-163:data"},{"to_node_id":"-183:input_1","from_node_id":"-170:data"},{"to_node_id":"-139:input_1","from_node_id":"-183:data_1"}],"nodes":[{"node_id":"-24","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"close_0\nopen_0\nlow_0\nhigh_0\n\nclose_1\nopen_1\nlow_1\nhigh_1\n\nclose_2\nopen_2\nlow_2\nhigh_2\n\nclose_3\nopen_3\nlow_3\nhigh_3\n\nclose_4\nopen_4\nlow_4\nhigh_4\n\nclose_5\nopen_5\nlow_5\nhigh_5","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-24"}],"output_ports":[{"name":"data","node_id":"-24"}],"cacheable":true,"seq_num":3,"comment":"","comment_collapsed":true},{"node_id":"-97","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"market_cap_0\npe_ttm_0\nlist_days_0\nrank_turn_0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-97"}],"output_ports":[{"name":"data","node_id":"-97"}],"cacheable":true,"seq_num":10,"comment":"","comment_collapsed":true},{"node_id":"-120","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2023-01-01","type":"Literal","bound_global_parameter":"交易日期"},{"name":"end_date","value":"2023-08-24","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":"-120"}],"output_ports":[{"name":"data","node_id":"-120"}],"cacheable":true,"seq_num":13,"comment":"","comment_collapsed":true},{"node_id":"-129","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":"-129"},{"name":"features","node_id":"-129"}],"output_ports":[{"name":"data","node_id":"-129"}],"cacheable":true,"seq_num":14,"comment":"","comment_collapsed":true},{"node_id":"-139","module_id":"BigQuantSpace.cached.cached-v3","parameters":[{"name":"run","value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n # 示例代码如下。在这里编写您的代码\n data = input_1.read()\n df = input_2.read()\n columns = list(input_3.read())\n data = pd.merge(data, df, on=['date', 'instrument'], how='inner')\n data = data[['date', 'instrument', 'market_cap_0'] + columns]\n data_1 = DataSource.write_df(data)\n return Outputs(data_1=data_1, data_2=None, data_3=None)\n","type":"Literal","bound_global_parameter":null},{"name":"post_run","value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","type":"Literal","bound_global_parameter":null},{"name":"input_ports","value":"","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-139"},{"name":"input_2","node_id":"-139"},{"name":"input_3","node_id":"-139"}],"output_ports":[{"name":"data_1","node_id":"-139"},{"name":"data_2","node_id":"-139"},{"name":"data_3","node_id":"-139"}],"cacheable":true,"seq_num":15,"comment":"连接数据+特征提取","comment_collapsed":true},{"node_id":"-151","module_id":"BigQuantSpace.cached.cached-v3","parameters":[{"name":"run","value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n # 示例代码如下。在这里编写您的代码\n import torch\n import torch.nn.init as init\n import numpy as np\n import torch.nn as nn\n \n try:\n model_params = input_1.read()\n except:\n print('加载模型')\n model_params = torch.load(\"/home/aiuser/work/userlib/model.pth\")\n data = input_2.read()\n df = data[['date', 'instrument', 'market_cap_0']]\n columns = list(input_3.read())\n x = np.array(data[columns])\n x = torch.Tensor(x)\n \n # 模型建立\n class net(nn.Module):\n def __init__(self):\n super(net, self).__init__()\n self.fc1 = nn.Linear(x.shape[1], 256)\n self.sig = nn.Sigmoid()\n self.relu = nn.ReLU()\n self.fc2 = nn.Linear(256, 128)\n self.fc3 = nn.Linear(128, 2)\n self.softmax = nn.Softmax(dim=0)\n \n # 将参数初始化为较小的值\n init.xavier_uniform_(self.fc1.weight)\n init.xavier_uniform_(self.fc2.weight)\n init.xavier_uniform_(self.fc3.weight)\n \n def forward(self, data):\n out = self.fc1(data)\n out = self.sig(out)\n out = self.fc2(out)\n out = self.relu(out)\n out = self.fc3(out)\n out = self.softmax(out)\n return out\n \n model = net()\n model.load_state_dict(model_params)\n ypre = model(x).detach().numpy()\n df['pre'] = np.argmax(ypre, axis=1)\n data_1 = DataSource.write_df(df)\n return Outputs(data_1=data_1, data_2=None, data_3=None)\n","type":"Literal","bound_global_parameter":null},{"name":"post_run","value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","type":"Literal","bound_global_parameter":null},{"name":"input_ports","value":"","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-151"},{"name":"input_2","node_id":"-151"},{"name":"input_3","node_id":"-151"}],"output_ports":[{"name":"data_1","node_id":"-151"},{"name":"data_2","node_id":"-151"},{"name":"data_3","node_id":"-151"}],"cacheable":false,"seq_num":16,"comment":"预测","comment_collapsed":false},{"node_id":"-162","module_id":"BigQuantSpace.hftrade.hftrade-v2","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.df = context.options['data'].read_df()\n \n # 计时器\n context.index = -2\n \n # 调仓周期\n context.T = 3\n","type":"Literal","bound_global_parameter":null},{"name":"before_trading_start","value":"# 交易引擎:每个单位时间开盘前调用一次。\ndef bigquant_run(context, data):\n # 盘前处理,订阅行情等\n pass\n","type":"Literal","bound_global_parameter":null},{"name":"handle_tick","value":"# 交易引擎:tick数据处理函数,每个tick执行一次\ndef bigquant_run(context, tick):\n pass\n","type":"Literal","bound_global_parameter":null},{"name":"handle_data","value":"# 交易引擎:bar数据处理函数,每个时间单位执行一次\ndef bigquant_run(context, data):\n context.index += 1\n if context.index % context.T == 0:\n return\n \n dt = data.current_dt.strftime('%Y-%m-%d')\n\n df = context.df[context.df['date']==dt]\n df.sort_values('market_cap_0', ascending=True)\n \n in_df = df[df['pre']>0] # 获取预测值大于0的股票\n instrument = list(in_df.instrument)\n \n # 获取持仓列表\n account = context.get_account_positions()\n holding_account = list(account.keys())\n holding_num = len(holding_account)\n \n # 获取可用资金和总资金\n cash = context.get_trading_account()\n total_cash = cash.portfolio_value\n avail_cash = cash.available\n \n # 卖出\n sell_list = []\n out = 0\n for ins in holding_account:\n if ins not in instrument:\n context.order_target(ins, 0)\n sell_list.append(ins)\n out += 1\n \n # 买入\n buy_list = []\n for ins in instrument:\n if holding_num - out < 20 and avail_cash > total_cash/20 and ins not in holding_account: \n context.order_target_percent(ins, 1/20)\n buy_list.append(ins)\n avail_cash -= total_cash/20\n# print(dt, ' 买入', buy_list)\n# print(dt, ' 卖出', sell_list)\n \n","type":"Literal","bound_global_parameter":null},{"name":"handle_trade","value":"# 交易引擎:成交回报处理函数,每个成交发生时执行一次\ndef bigquant_run(context, trade):\n pass\n","type":"Literal","bound_global_parameter":null},{"name":"handle_order","value":"# 交易引擎:委托回报处理函数,每个委托变化时执行一次\ndef bigquant_run(context, order):\n pass\n","type":"Literal","bound_global_parameter":null},{"name":"after_trading","value":"# 交易引擎:盘后处理函数,每日盘后执行一次\ndef bigquant_run(context, data):\n pass\n","type":"Literal","bound_global_parameter":null},{"name":"capital_base","value":1000000,"type":"Literal","bound_global_parameter":null},{"name":"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":"before_start_days","value":"0","type":"Literal","bound_global_parameter":null},{"name":"volume_limit","value":1,"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":"benchmark","value":"000300.HIX","type":"Literal","bound_global_parameter":null},{"name":"plot_charts","value":"True","type":"Literal","bound_global_parameter":null},{"name":"disable_cache","value":"False","type":"Literal","bound_global_parameter":null},{"name":"replay_bdb","value":"False","type":"Literal","bound_global_parameter":null},{"name":"show_debug_info","value":"False","type":"Literal","bound_global_parameter":null},{"name":"backtest_only","value":"False","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-162"},{"name":"options_data","node_id":"-162"},{"name":"history_ds","node_id":"-162"},{"name":"benchmark_ds","node_id":"-162"}],"output_ports":[{"name":"raw_perf","node_id":"-162"}],"cacheable":false,"seq_num":17,"comment":"","comment_collapsed":true},{"node_id":"-163","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":"-163"},{"name":"features","node_id":"-163"}],"output_ports":[{"name":"data","node_id":"-163"}],"cacheable":true,"seq_num":18,"comment":"","comment_collapsed":true},{"node_id":"-170","module_id":"BigQuantSpace.chinaa_stock_filter.chinaa_stock_filter-v1","parameters":[{"name":"index_constituent_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%8A%E8%AF%8150%22%2C%22displayValue%22%3A%22%E4%B8%8A%E8%AF%8150%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%B2%AA%E6%B7%B1300%22%2C%22displayValue%22%3A%22%E6%B2%AA%E6%B7%B1300%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%81500%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%81500%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%81800%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%81800%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E4%B8%8A%E8%AF%81180%22%2C%22displayValue%22%3A%22%E4%B8%8A%E8%AF%81180%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%81100%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%81100%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E6%B7%B1%E8%AF%81100%22%2C%22displayValue%22%3A%22%E6%B7%B1%E8%AF%81100%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%AD%E8%AF%811000%22%2C%22displayValue%22%3A%22%E4%B8%AD%E8%AF%811000%22%2C%22selected%22%3Atrue%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"board_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%B8%8A%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22displayValue%22%3A%22%E4%B8%8A%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E6%B7%B1%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22displayValue%22%3A%22%E6%B7%B1%E8%AF%81%E4%B8%BB%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E5%88%9B%E4%B8%9A%E6%9D%BF%22%2C%22displayValue%22%3A%22%E5%88%9B%E4%B8%9A%E6%9D%BF%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E7%A7%91%E5%88%9B%E6%9D%BF%22%2C%22displayValue%22%3A%22%E7%A7%91%E5%88%9B%E6%9D%BF%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%8C%97%E4%BA%A4%E6%89%80%22%2C%22displayValue%22%3A%22%E5%8C%97%E4%BA%A4%E6%89%80%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"industry_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%BA%A4%E9%80%9A%E8%BF%90%E8%BE%93%22%2C%22displayValue%22%3A%22%E4%BA%A4%E9%80%9A%E8%BF%90%E8%BE%93%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%BC%91%E9%97%B2%E6%9C%8D%E5%8A%A1%22%2C%22displayValue%22%3A%22%E4%BC%91%E9%97%B2%E6%9C%8D%E5%8A%A1%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E4%BC%A0%E5%AA%92%2F%E4%BF%A1%E6%81%AF%E6%9C%8D%E5%8A%A1%22%2C%22displayValue%22%3A%22%E4%BC%A0%E5%AA%92%2F%E4%BF%A1%E6%81%AF%E6%9C%8D%E5%8A%A1%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%85%AC%E7%94%A8%E4%BA%8B%E4%B8%9A%22%2C%22displayValue%22%3A%22%E5%85%AC%E7%94%A8%E4%BA%8B%E4%B8%9A%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%86%9C%E6%9E%97%E7%89%A7%E6%B8%94%22%2C%22displayValue%22%3A%22%E5%86%9C%E6%9E%97%E7%89%A7%E6%B8%94%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%8C%96%E5%B7%A5%22%2C%22displayValue%22%3A%22%E5%8C%96%E5%B7%A5%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%8C%BB%E8%8D%AF%E7%94%9F%E7%89%A9%22%2C%22displayValue%22%3A%22%E5%8C%BB%E8%8D%AF%E7%94%9F%E7%89%A9%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%95%86%E4%B8%9A%E8%B4%B8%E6%98%93%22%2C%22displayValue%22%3A%22%E5%95%86%E4%B8%9A%E8%B4%B8%E6%98%93%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%9B%BD%E9%98%B2%E5%86%9B%E5%B7%A5%22%2C%22displayValue%22%3A%22%E5%9B%BD%E9%98%B2%E5%86%9B%E5%B7%A5%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%AE%B6%E7%94%A8%E7%94%B5%E5%99%A8%22%2C%22displayValue%22%3A%22%E5%AE%B6%E7%94%A8%E7%94%B5%E5%99%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%BB%BA%E7%AD%91%E6%9D%90%E6%96%99%2F%E5%BB%BA%E7%AD%91%E5%BB%BA%E6%9D%90%22%2C%22displayValue%22%3A%22%E5%BB%BA%E7%AD%91%E6%9D%90%E6%96%99%2F%E5%BB%BA%E7%AD%91%E5%BB%BA%E6%9D%90%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E5%BB%BA%E7%AD%91%E8%A3%85%E9%A5%B0%22%2C%22displayValue%22%3A%22%E5%BB%BA%E7%AD%91%E8%A3%85%E9%A5%B0%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%88%BF%E5%9C%B0%E4%BA%A7%22%2C%22displayValue%22%3A%22%E6%88%BF%E5%9C%B0%E4%BA%A7%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%9C%89%E8%89%B2%E9%87%91%E5%B1%9E%22%2C%22displayValue%22%3A%22%E6%9C%89%E8%89%B2%E9%87%91%E5%B1%9E%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%9C%BA%E6%A2%B0%E8%AE%BE%E5%A4%87%22%2C%22displayValue%22%3A%22%E6%9C%BA%E6%A2%B0%E8%AE%BE%E5%A4%87%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%B1%BD%E8%BD%A6%2F%E4%BA%A4%E8%BF%90%E8%AE%BE%E5%A4%87%22%2C%22displayValue%22%3A%22%E6%B1%BD%E8%BD%A6%2F%E4%BA%A4%E8%BF%90%E8%AE%BE%E5%A4%87%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%94%B5%E5%AD%90%22%2C%22displayValue%22%3A%22%E7%94%B5%E5%AD%90%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%94%B5%E6%B0%94%E8%AE%BE%E5%A4%87%22%2C%22displayValue%22%3A%22%E7%94%B5%E6%B0%94%E8%AE%BE%E5%A4%87%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%BA%BA%E7%BB%87%E6%9C%8D%E8%A3%85%22%2C%22displayValue%22%3A%22%E7%BA%BA%E7%BB%87%E6%9C%8D%E8%A3%85%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E7%BB%BC%E5%90%88%22%2C%22displayValue%22%3A%22%E7%BB%BC%E5%90%88%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E8%AE%A1%E7%AE%97%E6%9C%BA%22%2C%22displayValue%22%3A%22%E8%AE%A1%E7%AE%97%E6%9C%BA%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E8%BD%BB%E5%B7%A5%E5%88%B6%E9%80%A0%22%2C%22displayValue%22%3A%22%E8%BD%BB%E5%B7%A5%E5%88%B6%E9%80%A0%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%80%9A%E4%BF%A1%22%2C%22displayValue%22%3A%22%E9%80%9A%E4%BF%A1%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%87%87%E6%8E%98%22%2C%22displayValue%22%3A%22%E9%87%87%E6%8E%98%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%92%A2%E9%93%81%22%2C%22displayValue%22%3A%22%E9%92%A2%E9%93%81%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%93%B6%E8%A1%8C%22%2C%22displayValue%22%3A%22%E9%93%B6%E8%A1%8C%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E9%9D%9E%E9%93%B6%E9%87%91%E8%9E%8D%22%2C%22displayValue%22%3A%22%E9%9D%9E%E9%93%B6%E9%87%91%E8%9E%8D%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22%E9%A3%9F%E5%93%81%E9%A5%AE%E6%96%99%22%2C%22displayValue%22%3A%22%E9%A3%9F%E5%93%81%E9%A5%AE%E6%96%99%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"st_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%AD%A3%E5%B8%B8%22%2C%22displayValue%22%3A%22%E6%AD%A3%E5%B8%B8%22%2C%22selected%22%3Atrue%7D%2C%7B%22value%22%3A%22ST%22%2C%22displayValue%22%3A%22ST%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22*ST%22%2C%22displayValue%22%3A%22*ST%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E6%9A%82%E5%81%9C%E4%B8%8A%E5%B8%82%22%2C%22displayValue%22%3A%22%E6%9A%82%E5%81%9C%E4%B8%8A%E5%B8%82%22%2C%22selected%22%3Afalse%7D%5D%7D","type":"Literal","bound_global_parameter":null},{"name":"delist_cond","value":"%7B%22enumItems%22%3A%5B%7B%22value%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22displayValue%22%3A%22%E5%85%A8%E9%83%A8%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%80%80%E5%B8%82%22%2C%22displayValue%22%3A%22%E9%80%80%E5%B8%82%22%2C%22selected%22%3Afalse%7D%2C%7B%22value%22%3A%22%E9%9D%9E%E9%80%80%E5%B8%82%22%2C%22displayValue%22%3A%22%E9%9D%9E%E9%80%80%E5%B8%82%22%2C%22selected%22%3Atrue%7D%5D%7D","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":"-170"}],"output_ports":[{"name":"data","node_id":"-170"},{"name":"left_data","node_id":"-170"}],"cacheable":true,"seq_num":19,"comment":"","comment_collapsed":true},{"node_id":"-183","module_id":"BigQuantSpace.cached.cached-v3","parameters":[{"name":"run","value":"# Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端\ndef bigquant_run(input_1, input_2, input_3):\n # 示例代码如下。在这里编写您的代码\n df = input_1.read()\n df[df['list_days_0']>365]\n df[df['pe_ttm_0']>0]\n df[df['rank_turn_0']<0.5]\n \n # 缺失值处理\n df.replace([np.inf, -np.inf], np.nan, inplace=True)\n df.dropna(inplace=True)\n data_1 = DataSource.write_df(df)\n return Outputs(data_1=data_1, data_2=None, data_3=None)","type":"Literal","bound_global_parameter":null},{"name":"post_run","value":"# 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。\ndef bigquant_run(outputs):\n return outputs\n","type":"Literal","bound_global_parameter":null},{"name":"input_ports","value":"","type":"Literal","bound_global_parameter":null},{"name":"params","value":"{}","type":"Literal","bound_global_parameter":null},{"name":"output_ports","value":"","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"input_1","node_id":"-183"},{"name":"input_2","node_id":"-183"},{"name":"input_3","node_id":"-183"}],"output_ports":[{"name":"data_1","node_id":"-183"},{"name":"data_2","node_id":"-183"},{"name":"data_3","node_id":"-183"}],"cacheable":true,"seq_num":20,"comment":"财务指标筛选","comment_collapsed":true}],"node_layout":"<node_postions><node_position Node='-24' Position='549,-82,200,200'/><node_position Node='-97' Position='-339.560302734375,-18.56030035018921,200,200'/><node_position Node='-120' Position='912,-38,200,200'/><node_position Node='-129' Position='915,144,200,200'/><node_position Node='-139' Position='849,516,200,200'/><node_position Node='-151' Position='642,737,200,200'/><node_position Node='-162' Position='734,1011,200,200'/><node_position Node='-163' Position='1281,97,200,200'/><node_position Node='-170' Position='1209,217,200,200'/><node_position Node='-183' Position='1266,329,200,200'/></node_postions>"},"nodes_readonly":false,"studio_version":"v2"}
    In [3]:
    # 本代码由可视化策略环境自动生成 2023年8月29日 14:24
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
     
    # 显式导入 BigQuant 相关 SDK 模块
    from bigdatasource.api import DataSource
    from bigdata.api.datareader import D
    from biglearning.api import M
    from biglearning.api import tools as T
    from biglearning.module2.common.data import Outputs
     
    import pandas as pd
    import numpy as np
    import math
    import warnings
    import datetime
     
    from zipline.finance.commission import PerOrder
    from zipline.api import get_open_orders
    from zipline.api import symbol
     
    from bigtrader.sdk import *
    from bigtrader.utils.my_collections import NumPyDeque
    from bigtrader.constant import OrderType
    from bigtrader.constant import Direction
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m20_run_bigquant_run(input_1, input_2, input_3):
        # 示例代码如下。在这里编写您的代码
        df = input_1.read()
        df[df['list_days_0']>365]
        df[df['pe_ttm_0']>0]
        df[df['rank_turn_0']<0.5]
        
        # 缺失值处理
        df.replace([np.inf, -np.inf], np.nan, inplace=True)
        df.dropna(inplace=True)
        data_1 = DataSource.write_df(df)
        return Outputs(data_1=data_1, data_2=None, data_3=None)
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m20_post_run_bigquant_run(outputs):
        return outputs
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m15_run_bigquant_run(input_1, input_2, input_3):
        # 示例代码如下。在这里编写您的代码
        data = input_1.read()
        df = input_2.read()
        columns = list(input_3.read())
        data = pd.merge(data, df, on=['date', 'instrument'], how='inner')
        data = data[['date', 'instrument', 'market_cap_0'] + columns]
        data_1 = DataSource.write_df(data)
        return Outputs(data_1=data_1, data_2=None, data_3=None)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m15_post_run_bigquant_run(outputs):
        return outputs
    
    # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
    def m16_run_bigquant_run(input_1, input_2, input_3):
        # 示例代码如下。在这里编写您的代码
        import torch
        import torch.nn.init as init
        import numpy as np
        import torch.nn as nn
        
        try:
            model_params = input_1.read()
        except:
            print('加载模型')
            model_params = torch.load("/home/aiuser/work/userlib/model.pth")
        data = input_2.read()
        df = data[['date', 'instrument', 'market_cap_0']]
        columns = list(input_3.read())
        x = np.array(data[columns])
        x = torch.Tensor(x)
        
        # 模型建立
        class net(nn.Module):
            def __init__(self):
                super(net, self).__init__()
                self.fc1 = nn.Linear(x.shape[1], 256)
                self.sig = nn.Sigmoid()
                self.relu = nn.ReLU()
                self.fc2 = nn.Linear(256, 128)
                self.fc3 = nn.Linear(128, 2)
                self.softmax = nn.Softmax(dim=0)
           
                # 将参数初始化为较小的值
                init.xavier_uniform_(self.fc1.weight)
                init.xavier_uniform_(self.fc2.weight)
                init.xavier_uniform_(self.fc3.weight)
            
            def forward(self, data):
                out = self.fc1(data)
                out = self.sig(out)
                out = self.fc2(out)
                out = self.relu(out)
                out = self.fc3(out)
                out = self.softmax(out)
                return out
            
        model = net()
        model.load_state_dict(model_params)
        ypre = model(x).detach().numpy()
        df['pre'] = np.argmax(ypre, axis=1)
        data_1 = DataSource.write_df(df)
        return Outputs(data_1=data_1, data_2=None, data_3=None)
    
    # 后处理函数,可选。输入是主函数的输出,可以在这里对数据做处理,或者返回更友好的outputs数据格式。此函数输出不会被缓存。
    def m16_post_run_bigquant_run(outputs):
        return outputs
    
    # 交易引擎:初始化函数,只执行一次
    def m17_initialize_bigquant_run(context):
        # 加载预测数据
        context.df = context.options['data'].read_df()
        
        # 计时器
        context.index = -2
        
        # 调仓周期
        context.T = 3
    
    # 交易引擎:每个单位时间开盘前调用一次。
    def m17_before_trading_start_bigquant_run(context, data):
        # 盘前处理,订阅行情等
        pass
    
    # 交易引擎:tick数据处理函数,每个tick执行一次
    def m17_handle_tick_bigquant_run(context, tick):
        pass
    
    # 交易引擎:bar数据处理函数,每个时间单位执行一次
    def m17_handle_data_bigquant_run(context, data):
        context.index += 1
        if context.index % context.T == 0:
            return
        
        dt = data.current_dt.strftime('%Y-%m-%d')
    
        df = context.df[context.df['date']==dt]
        df.sort_values('market_cap_0', ascending=True)
        
        in_df = df[df['pre']>0]          # 获取预测值大于0的股票
        instrument = list(in_df.instrument)
        
        # 获取持仓列表
        account = context.get_account_positions()
        holding_account = list(account.keys())
        holding_num = len(holding_account)
        
        # 获取可用资金和总资金
        cash = context.get_trading_account()
        total_cash = cash.portfolio_value
        avail_cash = cash.available
        
        # 卖出
        sell_list = []
        out = 0
        for ins in holding_account:
            if ins not in instrument:
                context.order_target(ins, 0)
                sell_list.append(ins)
                out += 1
        
        # 买入
        buy_list = []
        for ins in instrument:
            if holding_num - out < 20 and avail_cash > total_cash/20 and ins not in holding_account: 
                context.order_target_percent(ins, 1/20)
                buy_list.append(ins)
                avail_cash -= total_cash/20
    #     print(dt, ' 买入', buy_list)
    #     print(dt, ' 卖出', sell_list)
        
    
    # 交易引擎:成交回报处理函数,每个成交发生时执行一次
    def m17_handle_trade_bigquant_run(context, trade):
        pass
    
    # 交易引擎:委托回报处理函数,每个委托变化时执行一次
    def m17_handle_order_bigquant_run(context, order):
        pass
    
    # 交易引擎:盘后处理函数,每日盘后执行一次
    def m17_after_trading_bigquant_run(context, data):
        pass
    
    
    m3 = M.input_features.v1(
        features="""close_0
    open_0
    low_0
    high_0
    
    close_1
    open_1
    low_1
    high_1
    
    close_2
    open_2
    low_2
    high_2
    
    close_3
    open_3
    low_3
    high_3
    
    close_4
    open_4
    low_4
    high_4
    
    close_5
    open_5
    low_5
    high_5"""
    )
    
    m10 = M.input_features.v1(
        features="""market_cap_0
    pe_ttm_0
    list_days_0
    rank_turn_0"""
    )
    
    m13 = M.instruments.v2(
        start_date=T.live_run_param('trading_date', '2023-01-01'),
        end_date=T.live_run_param('trading_date', '2023-08-24'),
        market='CN_STOCK_A',
        instrument_list='',
        max_count=0
    )
    
    m14 = M.general_feature_extractor.v7(
        instruments=m13.data,
        features=m3.data,
        start_date='',
        end_date='',
        before_start_days=90
    )
    
    m18 = M.general_feature_extractor.v7(
        instruments=m13.data,
        features=m10.data,
        start_date='',
        end_date='',
        before_start_days=90
    )
    
    m19 = M.chinaa_stock_filter.v1(
        input_data=m18.data,
        index_constituent_cond=['中证500', '中证800', '中证100', '中证1000'],
        board_cond=['上证主板', '深证主板', '创业板'],
        industry_cond=['银行', '非银金融'],
        st_cond=['正常'],
        delist_cond=['非退市'],
        output_left_data=False
    )
    
    m20 = M.cached.v3(
        input_1=m19.data,
        run=m20_run_bigquant_run,
        post_run=m20_post_run_bigquant_run,
        input_ports='',
        params='{}',
        output_ports=''
    )
    
    m15 = M.cached.v3(
        input_1=m20.data_1,
        input_2=m14.data,
        input_3=m3.data,
        run=m15_run_bigquant_run,
        post_run=m15_post_run_bigquant_run,
        input_ports='',
        params='{}',
        output_ports=''
    )
    
    m16 = M.cached.v3(
        input_2=m15.data_1,
        input_3=m3.data,
        run=m16_run_bigquant_run,
        post_run=m16_post_run_bigquant_run,
        input_ports='',
        params='{}',
        output_ports='',
        m_cached=False
    )
    
    m17 = M.hftrade.v2(
        instruments=m13.data,
        options_data=m16.data_1,
        start_date='',
        end_date='',
        initialize=m17_initialize_bigquant_run,
        before_trading_start=m17_before_trading_start_bigquant_run,
        handle_tick=m17_handle_tick_bigquant_run,
        handle_data=m17_handle_data_bigquant_run,
        handle_trade=m17_handle_trade_bigquant_run,
        handle_order=m17_handle_order_bigquant_run,
        after_trading=m17_after_trading_bigquant_run,
        capital_base=1000000,
        frequency='daily',
        price_type='真实价格',
        product_type='股票',
        before_start_days='0',
        volume_limit=1,
        order_price_field_buy='open',
        order_price_field_sell='close',
        benchmark='000300.HIX',
        plot_charts=True,
        disable_cache=False,
        replay_bdb=False,
        show_debug_info=False,
        backtest_only=False
    )
    
    • 收益率11.2%
    • 年化收益率17.78%
    • 基准收益率-4.23%
    • 阿尔法0.29
    • 贝塔1.08
    • 夏普比率0.85
    • 胜率1.0
    • 盈亏比0.0
    • 收益波动率18.56%
    • 信息比率0.14
    • 最大回撤9.43%
    日期 时间 股票代码 股票名称 买/卖 数量 成交价 总成本 交易佣金
    Loading... (need help?)
    日期 标的代码 标的名称 持仓均价 收盘价 数量 持仓价值 收益
    Loading... (need help?)
    时间 级别 内容
    Loading... (need help?)