复制链接
克隆策略

    {"description":"实验创建于2017/8/26","graph":{"edges":[{"to_node_id":"-202:features","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"to_node_id":"-209:features","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24:data"},{"to_node_id":"-202:instruments","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"to_node_id":"-370:instruments","from_node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62:data"},{"to_node_id":"-209:input_data","from_node_id":"-202:data"},{"to_node_id":"-2917:input_data","from_node_id":"-209:data"},{"to_node_id":"-370:options_data","from_node_id":"-1575:data"},{"to_node_id":"-1575:input_data","from_node_id":"-2917:data"}],"nodes":[{"node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"buy_condition =1\n\nsell_condition =1\n\n\n","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24"}],"output_ports":[{"name":"data","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-24"}],"cacheable":true,"seq_num":1,"comment":"","comment_collapsed":true},{"node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2022-01-01","type":"Literal","bound_global_parameter":"交易日期"},{"name":"end_date","value":"2022-03-11","type":"Literal","bound_global_parameter":"交易日期"},{"name":"market","value":"CN_STOCK_A","type":"Literal","bound_global_parameter":null},{"name":"instrument_list","value":"000001.SZA","type":"Literal","bound_global_parameter":null},{"name":"max_count","value":"0","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"rolling_conf","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62"}],"output_ports":[{"name":"data","node_id":"287d2cb0-f53c-4101-bdf8-104b137c8601-62"}],"cacheable":true,"seq_num":2,"comment":"预测数据,用于回测和模拟","comment_collapsed":true},{"node_id":"-202","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":"200","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-202"},{"name":"features","node_id":"-202"}],"output_ports":[{"name":"data","node_id":"-202"}],"cacheable":true,"seq_num":7,"comment":"","comment_collapsed":true},{"node_id":"-209","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":"-209"},{"name":"features","node_id":"-209"}],"output_ports":[{"name":"data","node_id":"-209"}],"cacheable":true,"seq_num":8,"comment":"","comment_collapsed":true},{"node_id":"-1575","module_id":"BigQuantSpace.dropnan.dropnan-v2","parameters":[],"input_ports":[{"name":"input_data","node_id":"-1575"},{"name":"features","node_id":"-1575"}],"output_ports":[{"name":"data","node_id":"-1575"}],"cacheable":true,"seq_num":4,"comment":"","comment_collapsed":true},{"node_id":"-2917","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%3Atrue%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%3Afalse%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%3Afalse%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%3Afalse%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%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%3Afalse%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%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%3Atrue%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%3Afalse%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%3Afalse%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%3Atrue%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%3Afalse%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":"-2917"}],"output_ports":[{"name":"data","node_id":"-2917"},{"name":"left_data","node_id":"-2917"}],"cacheable":true,"seq_num":5,"comment":"","comment_collapsed":true},{"node_id":"-370","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 from zipline.finance.slippage import SlippageModel\n\n # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数\n context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))\n #context.set_commission(PerOrder(buy_cost=0.00001, sell_cost=0.0001, min_cost=1))\n \n # 设置买入的股票数量,这里买入预测股票列表排名靠前的5只\n context.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.stock_weights = 1/context.stock_count\n context.options['hold_days'] = 15\n \n# class FixedPriceSlippage(SlippageModel):\n# def process_order(self, data, order, bar_volume=0, trigger_check_price=0):\n# if order.amount > 0:\n# open_price = data.current(order.asset, self._price_field_buy)\n# price = open_price \n# else:\n# price = data.current(order.asset, self._price_field_sell)\n# return (price, order.amount)\n# context.fix_slippage = FixedPriceSlippage(price_field_buy=\"open\", price_field_sell=\"close\")\n# context.set_slippage(us_equities=context.fix_slippage)\n \n\n","type":"Literal","bound_global_parameter":null},{"name":"handle_data","value":"# 回测引擎:每日数据处理函数,每天执行一次\ndef bigquant_run(context, data):\n today = data.current_dt.strftime('%Y-%m-%d')\n equities = {e.symbol: p for e, p in context.portfolio.positions.items() if p.amount>0}\n stock_now = len(equities); #获取当前持仓股票数量\n stock_count = context.stock_count\n \n print(data.current_dt)\n now_stock = []\n sell_stock = []\n try:\n sell_list = context.daily_sell_stock[today]\n except:\n sell_list = [] \n try:\n buy_list = context.daily_buy_stock[today]\n except:\n buy_list = []\n \n \n # 1. 资金分配\n #is_staging = context.trading_day_index < context.options['hold_days'] # 是否在建仓期间(前 hold_days 天) \n #stock_cash = context.portfolio.portfolio_value/stock_count\n #cash_avg = context.portfolio.portfolio_value\n #cash_for_buy = min(context.portfolio.cash, stock_cash)\n #cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy)\n #print('今日选股:',buy_list)\n positions = {e.symbol: p.cost_basis\n for e, p in context.perf_tracker.position_tracker.positions.items()}\n \n #if not is_staging :\n if 1==1 : \n if len(equities) > 0:\n for i in equities.keys():\n last_sale_date = equities[i].last_sale_date\t# 上次交易日期\n delta_days = data.current_dt - last_sale_date \n hold_days = delta_days.days # 持仓天数\n stock_cost = positions[i] \n stock_market_price = data.current(context.symbol(i), 'price') \n #在列表不卖,持仓小于1天不卖,\n if i not in buy_list and hold_days>0:\n if hold_days >= context.options['hold_days'] or i in sell_list:\n context.order_target(context.symbol(i), 0)\n sell_stock.append(i)\n stock_now = stock_now -1\n \n# 3. 生成买入订单\n buy_num = stock_count - stock_now\n #if is_staging :\n # buy_num = 1\n if len(buy_list)>0:\n print('日期:', today, '选出股票数量:', len(buy_list))\n if buy_num>0 and len(buy_list)>0 :\n # 不再买入已经轮仓卖出和移动止损的股票,以防止出现空头持仓\n buy_instruments = [i for i in buy_list if i not in now_stock][:buy_num]\n cash_for_buy = context.portfolio.cash\n if stock_now<1:\n cash_for_buy = context.portfolio.cash * context.stock_weights\n for i, instrument in enumerate(buy_instruments):\n current_price = data.current(context.symbol(instrument), 'price')\n price_history = data.history(context.symbol(instrument), fields=\"close\", bar_count=2, frequency=\"1d\")\n pre_close = price_history[0]\n #print('股票:',instrument,'开盘价格:', current_price, '昨日收盘:',pre_close)\n #高开不买\n if cash_for_buy>0 and data.can_trade(context.symbol(instrument)): \n amount = math.floor(cash_for_buy / current_price / 100) * 100\n context.order(context.symbol(instrument), amount)\n #if(instrument=='002735.SZA'):\n #print('日期:',today,'买入:',instrument)\n else :\n print('日期:',today,'无资金或不能交易未买入:',instrument)","type":"Literal","bound_global_parameter":null},{"name":"prepare","value":"# 回测引擎:准备数据,只执行一次\ndef bigquant_run(context):\n # 加载预测数据\n df = context.options['data'].read_df()\n # 函数:求满足开仓条件的股票列表\n def open_pos_con(df):\n return list(df[df['buy_condition']>0].instrument)\n # 函数:求满足平仓条件的股票列表\n def close_pos_con(df):\n return list(df[df['sell_condition']>0].instrument)\n \n # 每日卖出股票的数据框\n context.daily_sell_stock= df.groupby('date').apply(close_pos_con) \n # 每日买入股票的数据框\n context.daily_buy_stock= df.groupby('date').apply(open_pos_con) \n\n\n \n","type":"Literal","bound_global_parameter":null},{"name":"before_trading_start","value":"# 判断订单股票的最低价是否低于开盘价的98%\ndef bigquant_run(context,data):\n for orders in get_open_orders().values():\n for _order in orders:\n ins = _order.sid\n print(\"order:\",_order)\n re = context.cancel_order(_order)\n print(f\"{data.current_dt}取消订单{ins}\")\n \n# try:\n\n# except:\n# continue","type":"Literal","bound_global_parameter":null},{"name":"volume_limit","value":"0.025","type":"Literal","bound_global_parameter":null},{"name":"order_price_field_buy","value":"open","type":"Literal","bound_global_parameter":null},{"name":"order_price_field_sell","value":"open","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.HIX","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"instruments","node_id":"-370"},{"name":"options_data","node_id":"-370"},{"name":"history_ds","node_id":"-370"},{"name":"benchmark_ds","node_id":"-370"},{"name":"trading_calendar","node_id":"-370"}],"output_ports":[{"name":"raw_perf","node_id":"-370"}],"cacheable":false,"seq_num":10,"comment":"","comment_collapsed":true}],"node_layout":"<node_postions><node_position Node='287d2cb0-f53c-4101-bdf8-104b137c8601-24' Position='1285,87,200,200'/><node_position Node='287d2cb0-f53c-4101-bdf8-104b137c8601-62' Position='804,92,200,200'/><node_position Node='-202' Position='1079,228,200,200'/><node_position Node='-209' Position='1083,308.99176025390625,200,200'/><node_position Node='-1575' Position='1077,451,200,200'/><node_position Node='-2917' Position='1080,381,200,200'/><node_position Node='-370' Position='1030.123779296875,563.7215576171875,200,200'/></node_postions>"},"nodes_readonly":false,"studio_version":"v2"}
    In [8]:
    # 本代码由可视化策略环境自动生成 2022年3月15日 10:32
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
    
    
    # 回测引擎:初始化函数,只执行一次
    def m10_initialize_bigquant_run(context):
        from zipline.finance.slippage import SlippageModel
    
        # 系统已经设置了默认的交易手续费和滑点,要修改手续费可使用如下函数
        context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
        #context.set_commission(PerOrder(buy_cost=0.00001, sell_cost=0.0001, min_cost=1))
        
        # 设置买入的股票数量,这里买入预测股票列表排名靠前的5只
        context.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.stock_weights = 1/context.stock_count
        context.options['hold_days'] = 15
        
    #     class FixedPriceSlippage(SlippageModel):
    #         def process_order(self, data, order, bar_volume=0, trigger_check_price=0):
    #             if order.amount > 0:
    #                 open_price = data.current(order.asset, self._price_field_buy)
    #                 price = open_price 
    #             else:
    #                 price = data.current(order.asset, self._price_field_sell)
    #             return (price, order.amount)
    #     context.fix_slippage = FixedPriceSlippage(price_field_buy="open", price_field_sell="close")
    #     context.set_slippage(us_equities=context.fix_slippage)
        
    
    
    # 回测引擎:每日数据处理函数,每天执行一次
    def m10_handle_data_bigquant_run(context, data):
        today = data.current_dt.strftime('%Y-%m-%d')
        equities = {e.symbol: p for e, p in context.portfolio.positions.items() if p.amount>0}
        stock_now = len(equities); #获取当前持仓股票数量
        stock_count = context.stock_count
        
        print(data.current_dt)
        now_stock = []
        sell_stock = []
        try:
            sell_list = context.daily_sell_stock[today]
        except:
            sell_list = []   
        try:
            buy_list = context.daily_buy_stock[today]
        except:
            buy_list = []
        
        
        # 1. 资金分配
        #is_staging = context.trading_day_index < context.options['hold_days'] # 是否在建仓期间(前 hold_days 天) 
        #stock_cash = context.portfolio.portfolio_value/stock_count
        #cash_avg = context.portfolio.portfolio_value
        #cash_for_buy = min(context.portfolio.cash,  stock_cash)
        #cash_for_sell = cash_avg - (context.portfolio.cash - cash_for_buy)
        #print('今日选股:',buy_list)
        positions = {e.symbol: p.cost_basis
                     for e, p in context.perf_tracker.position_tracker.positions.items()}
            
        #if not is_staging :
        if 1==1 :    
            if len(equities) > 0:
                for i in equities.keys():
                    last_sale_date = equities[i].last_sale_date	# 上次交易日期
                    delta_days = data.current_dt - last_sale_date  
                    hold_days = delta_days.days # 持仓天数
                    stock_cost = positions[i] 
                    stock_market_price = data.current(context.symbol(i), 'price') 
                    #在列表不卖,持仓小于1天不卖,
                    if i not in buy_list and hold_days>0:
                        if hold_days >= context.options['hold_days'] or i in sell_list:
                            context.order_target(context.symbol(i), 0)
                            sell_stock.append(i)
                            stock_now = stock_now -1
                     
    # 3. 生成买入订单
        buy_num = stock_count - stock_now
        #if is_staging :
        #    buy_num = 1
        if len(buy_list)>0:
            print('日期:', today, '选出股票数量:', len(buy_list))
        if buy_num>0 and len(buy_list)>0 :
            # 不再买入已经轮仓卖出和移动止损的股票,以防止出现空头持仓
            buy_instruments = [i for i in buy_list if i not in now_stock][:buy_num]
            cash_for_buy = context.portfolio.cash
            if stock_now<1:
                cash_for_buy = context.portfolio.cash * context.stock_weights
            for i, instrument in enumerate(buy_instruments):
                current_price = data.current(context.symbol(instrument), 'price')
                price_history = data.history(context.symbol(instrument), fields="close", bar_count=2, frequency="1d")
                pre_close = price_history[0]
                #print('股票:',instrument,'开盘价格:', current_price, '昨日收盘:',pre_close)
                #高开不买
                if cash_for_buy>0 and data.can_trade(context.symbol(instrument)):           
                    amount = math.floor(cash_for_buy / current_price / 100) * 100
                    context.order(context.symbol(instrument), amount)
                    #if(instrument=='002735.SZA'):
                    #print('日期:',today,'买入:',instrument)
                else :
                    print('日期:',today,'无资金或不能交易未买入:',instrument)
    # 回测引擎:准备数据,只执行一次
    def m10_prepare_bigquant_run(context):
        # 加载预测数据
        df = context.options['data'].read_df()
        # 函数:求满足开仓条件的股票列表
        def open_pos_con(df):
            return list(df[df['buy_condition']>0].instrument)
        # 函数:求满足平仓条件的股票列表
        def close_pos_con(df):
            return list(df[df['sell_condition']>0].instrument)
        
         # 每日卖出股票的数据框
        context.daily_sell_stock= df.groupby('date').apply(close_pos_con)  
        # 每日买入股票的数据框
        context.daily_buy_stock= df.groupby('date').apply(open_pos_con)  
    
    
        
    
    # 判断订单股票的最低价是否低于开盘价的98%
    def m10_before_trading_start_bigquant_run(context,data):
        for orders in get_open_orders().values():
            for _order in orders:
                ins = _order.sid
                print("order:",_order)
                re = context.cancel_order(_order)
                print(f"{data.current_dt}取消订单{ins}")
                    
    #             try:
    
    #             except:
    #                 continue
    
    m1 = M.input_features.v1(
        features="""buy_condition =1
    
    sell_condition =1
    
    
    """
    )
    
    m2 = M.instruments.v2(
        start_date=T.live_run_param('trading_date', '2022-01-01'),
        end_date=T.live_run_param('trading_date', '2022-03-11'),
        market='CN_STOCK_A',
        instrument_list='000001.SZA',
        max_count=0
    )
    
    m7 = M.general_feature_extractor.v7(
        instruments=m2.data,
        features=m1.data,
        start_date='',
        end_date='',
        before_start_days=200
    )
    
    m8 = M.derived_feature_extractor.v3(
        input_data=m7.data,
        features=m1.data,
        date_col='date',
        instrument_col='instrument',
        drop_na=False,
        remove_extra_columns=False
    )
    
    m5 = M.chinaa_stock_filter.v1(
        input_data=m8.data,
        index_constituent_cond=['全部'],
        board_cond=['上证主板', '深证主板'],
        industry_cond=['全部'],
        st_cond=['正常'],
        delist_cond=['全部'],
        output_left_data=False
    )
    
    m4 = M.dropnan.v2(
        input_data=m5.data
    )
    
    m10 = M.trade.v4(
        instruments=m2.data,
        options_data=m4.data,
        start_date='',
        end_date='',
        initialize=m10_initialize_bigquant_run,
        handle_data=m10_handle_data_bigquant_run,
        prepare=m10_prepare_bigquant_run,
        before_trading_start=m10_before_trading_start_bigquant_run,
        volume_limit=0.025,
        order_price_field_buy='open',
        order_price_field_sell='open',
        capital_base=100000,
        auto_cancel_non_tradable_orders=True,
        data_frequency='daily',
        price_type='真实价格',
        product_type='股票',
        plot_charts=True,
        backtest_only=False,
        benchmark='000300.HIX'
    )
    
    2022-01-04 15:00:00+00:00
    日期: 2022-01-04 选出股票数量: 1
    order: Event({'id': 'ac3b548319b849cdb4b4a87de64c5d81', 'dt': Timestamp('2022-01-05 09:30:00+0000', tz='UTC'), 'reason': None, 'created': Timestamp('2022-01-05 09:30:00+0000', tz='UTC'), 'amount': 1200, 'last_filled': 0, 'filled': 0, 'commission': 0, 'stop': None, 'limit': None, 'stop_reached': False, 'price_field': 'open', 'limit_reached': False, 'position_effect': None, 'offset_flag_display': '', 'sid': Equity(12 [000001.SZA]), 'status': 0})
    2022-01-05 08:45:00+00:00取消订单Equity(12 [000001.SZA])
    2022-01-05 15:00:00+00:00
    日期: 2022-01-05 选出股票数量: 1
    order: Event({'id': '835b87538a144bc484fbe7d281ecab1c', 'dt': Timestamp('2022-01-06 09:30:00+0000', tz='UTC'), 'reason': None, 'created': Timestamp('2022-01-06 09:30:00+0000', tz='UTC'), 'amount': 4600, 'last_filled': 0, 'filled': 0, 'commission': 0, 'stop': None, 'limit': None, 'stop_reached': False, 'price_field': 'open', 'limit_reached': False, 'position_effect': None, 'offset_flag_display': '', 'sid': Equity(12 [000001.SZA]), 'status': 0})
    2022-01-06 08:45:00+00:00取消订单Equity(12 [000001.SZA])
    2022-01-06 15:00:00+00:00
    日期: 2022-01-06 选出股票数量: 1
    2022-01-07 15:00:00+00:00
    日期: 2022-01-07 选出股票数量: 1
    2022-01-10 15:00:00+00:00
    日期: 2022-01-10 选出股票数量: 1
    2022-01-11 15:00:00+00:00
    日期: 2022-01-11 选出股票数量: 1
    2022-01-12 15:00:00+00:00
    日期: 2022-01-12 选出股票数量: 1
    2022-01-13 15:00:00+00:00
    日期: 2022-01-13 选出股票数量: 1
    2022-01-14 15:00:00+00:00
    日期: 2022-01-14 选出股票数量: 1
    2022-01-17 15:00:00+00:00
    日期: 2022-01-17 选出股票数量: 1
    2022-01-18 15:00:00+00:00
    日期: 2022-01-18 选出股票数量: 1
    2022-01-19 15:00:00+00:00
    日期: 2022-01-19 选出股票数量: 1
    2022-01-20 15:00:00+00:00
    日期: 2022-01-20 选出股票数量: 1
    2022-01-21 15:00:00+00:00
    日期: 2022-01-21 选出股票数量: 1
    2022-01-24 15:00:00+00:00
    日期: 2022-01-24 选出股票数量: 1
    2022-01-25 15:00:00+00:00
    日期: 2022-01-25 选出股票数量: 1
    2022-01-26 15:00:00+00:00
    日期: 2022-01-26 选出股票数量: 1
    2022-01-27 15:00:00+00:00
    日期: 2022-01-27 选出股票数量: 1
    2022-01-28 15:00:00+00:00
    日期: 2022-01-28 选出股票数量: 1
    2022-02-07 15:00:00+00:00
    日期: 2022-02-07 选出股票数量: 1
    2022-02-08 15:00:00+00:00
    日期: 2022-02-08 选出股票数量: 1
    2022-02-09 15:00:00+00:00
    日期: 2022-02-09 选出股票数量: 1
    2022-02-10 15:00:00+00:00
    日期: 2022-02-10 选出股票数量: 1
    2022-02-11 15:00:00+00:00
    日期: 2022-02-11 选出股票数量: 1
    2022-02-14 15:00:00+00:00
    日期: 2022-02-14 选出股票数量: 1
    2022-02-15 15:00:00+00:00
    日期: 2022-02-15 选出股票数量: 1
    2022-02-16 15:00:00+00:00
    日期: 2022-02-16 选出股票数量: 1
    2022-02-17 15:00:00+00:00
    日期: 2022-02-17 选出股票数量: 1
    2022-02-18 15:00:00+00:00
    日期: 2022-02-18 选出股票数量: 1
    2022-02-21 15:00:00+00:00
    日期: 2022-02-21 选出股票数量: 1
    2022-02-22 15:00:00+00:00
    日期: 2022-02-22 选出股票数量: 1
    2022-02-23 15:00:00+00:00
    日期: 2022-02-23 选出股票数量: 1
    2022-02-24 15:00:00+00:00
    日期: 2022-02-24 选出股票数量: 1
    2022-02-25 15:00:00+00:00
    日期: 2022-02-25 选出股票数量: 1
    2022-02-28 15:00:00+00:00
    日期: 2022-02-28 选出股票数量: 1
    2022-03-01 15:00:00+00:00
    日期: 2022-03-01 选出股票数量: 1
    2022-03-02 15:00:00+00:00
    日期: 2022-03-02 选出股票数量: 1
    2022-03-03 15:00:00+00:00
    日期: 2022-03-03 选出股票数量: 1
    2022-03-04 15:00:00+00:00
    日期: 2022-03-04 选出股票数量: 1
    2022-03-07 15:00:00+00:00
    日期: 2022-03-07 选出股票数量: 1
    2022-03-08 15:00:00+00:00
    日期: 2022-03-08 选出股票数量: 1
    2022-03-09 15:00:00+00:00
    日期: 2022-03-09 选出股票数量: 1
    2022-03-10 15:00:00+00:00
    日期: 2022-03-10 选出股票数量: 1
    2022-03-11 15:00:00+00:00
    日期: 2022-03-11 选出股票数量: 1
    
    • 收益率-12.21%
    • 年化收益率-52.57%
    • 基准收益率-12.83%
    • 阿尔法0.15
    • 贝塔1.08
    • 夏普比率-2.18
    • 胜率0.0
    • 盈亏比0.0
    • 收益波动率33.02%
    • 信息比率0.02
    • 最大回撤20.23%
    bigcharts-data-start/{"__type":"tabs","__id":"bigchart-f5aa89ffcd584858927c87f1e95239d1"}/bigcharts-data-end