策略名称

小市值策略,在所有组合下

策略思路

每天选取市值最小的前十名股票买入, 日频调仓.

股票池筛选

在A股股票过滤模块中,注意模块插入位置

  1. 剔除st股和退市股票;
  2. 中证1000指数

在输入特征列表模块中

  1. 30日涨幅小于10% volatility_30_0
  2. 剔除次新股(上市时间>365天); list_days_0>360
  3. 换手排名<=0.5 rank_turn_0<=0.5
  4. 剔除涨跌停股票 price_limit_status_0==2
  5. 从市盈率大于0的股票池中作筛选 pe_ttm_0>0
  6. 30日简单平均线上移 ta_sma_30_0>0;ta_sma(close_0,30)>ta_sma(close_2,30)

    {"description":"实验创建于2023/2/10","graph":{"edges":[{"to_node_id":"-28:instruments","from_node_id":"-6:data"},{"to_node_id":"-19:instruments","from_node_id":"-6:data"},{"to_node_id":"-65:input_data","from_node_id":"-55:data"},{"to_node_id":"-28:options_data","from_node_id":"-65:data"},{"to_node_id":"-55:input_data","from_node_id":"-19:data"},{"to_node_id":"-19:features","from_node_id":"-14:data"}],"nodes":[{"node_id":"-6","module_id":"BigQuantSpace.instruments.instruments-v2","parameters":[{"name":"start_date","value":"2020-01-01","type":"Literal","bound_global_parameter":null},{"name":"end_date","value":"2022-01-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":"-6"}],"output_ports":[{"name":"data","node_id":"-6"}],"cacheable":true,"seq_num":1,"comment":"","comment_collapsed":true,"x":50,"y":-118},{"node_id":"-28","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","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 # 获取日期\n dt = data.current_dt.strftime('%Y-%m-%d')\n \n # 获取当前日期的所有股票市值\n df = context.df[context.df['date']==dt].sort_values('market_cap_0', ascending=True)\n instruments = list(df['instrument'])[:10]\n \n # 排名前30的股票池集合\n instruments = set(instruments)\n \n # 获取持仓信息\n holding = context.get_account_positions()\n holding_list = list(holding.keys())\n holding_num = len(holding_list)\n holding_list = set(holding_list)\n \n # 需要买入的股票 = 排名前30的股票池集合 - 已持有的股票集合\n buy_list = instruments - holding_list\n \n # 需要卖出的股票 = 已持有的股票集合 - 排名前30的股票池集合\n sell_list = holding_list - instruments\n \n # 卖出不在股票池的股票\n for ins in sell_list:\n context.order_target_percent(ins, 0)\n holding_num -= 1\n \n # 买入最新的股票\n for ins in buy_list:\n if holding_num <= 10:\n context.order_target_percent(ins, 1/10)\n holding_num += 1\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":"-28"},{"name":"options_data","node_id":"-28"},{"name":"history_ds","node_id":"-28"},{"name":"benchmark_ds","node_id":"-28"}],"output_ports":[{"name":"raw_perf","node_id":"-28"}],"cacheable":false,"seq_num":4,"comment":"","comment_collapsed":true,"x":100,"y":515},{"node_id":"-55","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%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%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%3Atrue%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%3Afalse%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%3Afalse%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%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%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%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":"-55"}],"output_ports":[{"name":"data","node_id":"-55"},{"name":"left_data","node_id":"-55"}],"cacheable":true,"seq_num":5,"comment":"","comment_collapsed":true,"x":196,"y":286},{"node_id":"-65","module_id":"BigQuantSpace.filter.filter-v3","parameters":[{"name":"expr","value":"pe_ttm_0>0 & list_days_0>360 & ta_sma(close_0,30)>ta_sma(close_2,30) & price_limit_status_0==2 & volatility_30_0<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":"-65"}],"output_ports":[{"name":"data","node_id":"-65"},{"name":"left_data","node_id":"-65"}],"cacheable":true,"seq_num":6,"comment":"","comment_collapsed":true,"x":314,"y":381.989013671875},{"node_id":"-19","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":"-19"},{"name":"features","node_id":"-19"}],"output_ports":[{"name":"data","node_id":"-19"}],"cacheable":true,"seq_num":3,"comment":"","comment_collapsed":true,"x":363,"y":186},{"node_id":"-14","module_id":"BigQuantSpace.input_features.input_features-v1","parameters":[{"name":"features","value":"market_cap_0\npe_ttm_0\nlist_days_0\nrank_turn_0\nprice_limit_status_0\nta_sma_30_0\nvolatility_30_0\nta_sma(close_0,30)\nta_sma(close_2,30)","type":"Literal","bound_global_parameter":null}],"input_ports":[{"name":"features_ds","node_id":"-14"}],"output_ports":[{"name":"data","node_id":"-14"}],"cacheable":true,"seq_num":2,"comment":"","comment_collapsed":true,"x":445,"y":-67}],"node_layout":"<node_postions><node_position Node='-6' Position='50,-118,200,200'/><node_position Node='-28' Position='100,515,200,200'/><node_position Node='-55' Position='196,286,200,200'/><node_position Node='-65' Position='314,381.989013671875,200,200'/><node_position Node='-19' Position='363,186,200,200'/><node_position Node='-14' Position='445,-67,200,200'/></node_postions>"},"nodes_readonly":false,"studio_version":"v2"}
    In [4]:
    # 本代码由可视化策略环境自动生成 2024年1月5日 14:34
    # 本代码单元只能在可视化模式下编辑。您也可以拷贝代码,粘贴到新建的代码单元或者策略,然后修改。
     
    # 显式导入 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
    
    # <aistudiograph>
    
    # @param(id="m4", name="initialize")
    # 交易引擎:初始化函数,只执行一次
    def m4_initialize_bigquant_run(context):
        # 加载预测数据
        context.df = context.options['data'].read_df()
    
    # @param(id="m4", name="before_trading_start")
    # 交易引擎:每个单位时间开盘前调用一次。
    def m4_before_trading_start_bigquant_run(context, data):
        # 盘前处理,订阅行情等
        pass
    
    # @param(id="m4", name="handle_tick")
    # 交易引擎:tick数据处理函数,每个tick执行一次
    def m4_handle_tick_bigquant_run(context, tick):
        pass
    
    # @param(id="m4", name="handle_data")
    # 交易引擎:bar数据处理函数,每个时间单位执行一次
    def m4_handle_data_bigquant_run(context, data):
        # 获取日期
        dt = data.current_dt.strftime('%Y-%m-%d')
        
        # 获取当前日期的所有股票市值
        df = context.df[context.df['date']==dt].sort_values('market_cap_0', ascending=True)
        instruments = list(df['instrument'])[:10]
        
        # 排名前30的股票池集合
        instruments = set(instruments)
        
        # 获取持仓信息
        holding = context.get_account_positions()
        holding_list = list(holding.keys())
        holding_num = len(holding_list)
        holding_list = set(holding_list)
        
        # 需要买入的股票 = 排名前30的股票池集合 - 已持有的股票集合
        buy_list = instruments - holding_list
        
        # 需要卖出的股票 = 已持有的股票集合 - 排名前30的股票池集合
        sell_list = holding_list - instruments
        
        # 卖出不在股票池的股票
        for ins in sell_list:
            context.order_target_percent(ins, 0)
            holding_num -= 1
                
        # 买入最新的股票
        for ins in buy_list:
            if holding_num <= 10:
                context.order_target_percent(ins, 1/10)
                holding_num += 1
    
    # @param(id="m4", name="handle_trade")
    # 交易引擎:成交回报处理函数,每个成交发生时执行一次
    def m4_handle_trade_bigquant_run(context, trade):
        pass
    
    # @param(id="m4", name="handle_order")
    # 交易引擎:委托回报处理函数,每个委托变化时执行一次
    def m4_handle_order_bigquant_run(context, order):
        pass
    
    # @param(id="m4", name="after_trading")
    # 交易引擎:盘后处理函数,每日盘后执行一次
    def m4_after_trading_bigquant_run(context, data):
        pass
    
    
    # @module(position="50,-118", comment='', comment_collapsed=True)
    m1 = M.instruments.v2(
        start_date='2020-01-01',
        end_date='2022-01-20',
        market='CN_STOCK_A',
        instrument_list='',
        max_count=0
    )
    
    # @module(position="445,-67", comment='', comment_collapsed=True)
    m2 = M.input_features.v1(
        features="""market_cap_0
    pe_ttm_0
    list_days_0
    rank_turn_0
    price_limit_status_0
    ta_sma_30_0
    volatility_30_0
    ta_sma(close_0,30)
    ta_sma(close_2,30)"""
    )
    
    # @module(position="363,186", comment='', comment_collapsed=True)
    m3 = M.general_feature_extractor.v7(
        instruments=m1.data,
        features=m2.data,
        start_date='',
        end_date='',
        before_start_days=90
    )
    
    # @module(position="196,286", comment='', comment_collapsed=True)
    m5 = M.chinaa_stock_filter.v1(
        input_data=m3.data,
        index_constituent_cond=['中证1000'],
        board_cond=['全部'],
        industry_cond=['全部'],
        st_cond=['正常'],
        delist_cond=['非退市'],
        output_left_data=False
    )
    
    # @module(position="314,381.989013671875", comment='', comment_collapsed=True)
    m6 = M.filter.v3(
        input_data=m5.data,
        expr='pe_ttm_0>0 & list_days_0>360 & ta_sma(close_0,30)>ta_sma(close_2,30) & price_limit_status_0==2 & volatility_30_0<0.1',
        output_left_data=False
    )
    
    # @module(position="100,515", comment='', comment_collapsed=True)
    m4 = M.hftrade.v2(
        instruments=m1.data,
        options_data=m6.data,
        start_date='',
        end_date='',
        initialize=m4_initialize_bigquant_run,
        before_trading_start=m4_before_trading_start_bigquant_run,
        handle_tick=m4_handle_tick_bigquant_run,
        handle_data=m4_handle_data_bigquant_run,
        handle_trade=m4_handle_trade_bigquant_run,
        handle_order=m4_handle_order_bigquant_run,
        after_trading=m4_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
    )
    # </aistudiograph>
    
    ---------------------------------------------------------------------------
    TypeError                                 Traceback (most recent call last)
    File /var/app/enabled/bigshared/common/dataframe.py:72, in evalex(df, expr, **kwargs)
    
    File /var/app/enabled/bigexpr/impl/expression.py:462, in evaluate(df, expr, user_functions, user_variables)
    
    File /var/app/enabled/bigexpr/impl/expression.py:57, in ne_evaluate(root, local_vars)
    
    File /usr/local/python3/lib/python3.8/site-packages/numexpr/necompiler.py:809, in evaluate(ex, local_dict, global_dict, out, order, casting, **kwargs)
        808 if expr_key not in _names_cache:
    --> 809     _names_cache[expr_key] = getExprNames(ex, context)
        810 names, ex_uses_vml = _names_cache[expr_key]
    
    File /usr/local/python3/lib/python3.8/site-packages/numexpr/necompiler.py:696, in getExprNames(text, context)
        695 def getExprNames(text, context):
    --> 696     ex = stringToExpression(text, {}, context)
        697     ast = expressionToAST(ex)
    
    File /usr/local/python3/lib/python3.8/site-packages/numexpr/necompiler.py:289, in stringToExpression(s, types, context)
        288 # now build the expression
    --> 289 ex = eval(c, names)
        290 if expressions.isConstant(ex):
    
    File <expr>:1
    
    TypeError: unsupported operand type(s) for &: 'int' and 'VariableNode'
    
    During handling of the above exception, another exception occurred:
    
    KeyError                                  Traceback (most recent call last)
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/scope.py:201, in Scope.resolve(self, key, is_local)
        200 if self.has_resolvers:
    --> 201     return self.resolvers[key]
        203 # if we're here that means that we have no locals and we also have
        204 # no resolvers
    
    File /usr/local/python3/lib/python3.8/collections/__init__.py:898, in ChainMap.__getitem__(self, key)
        897         pass
    --> 898 return self.__missing__(key)
    
    File /usr/local/python3/lib/python3.8/collections/__init__.py:890, in ChainMap.__missing__(self, key)
        889 def __missing__(self, key):
    --> 890     raise KeyError(key)
    
    KeyError: 'ta_sma'
    
    During handling of the above exception, another exception occurred:
    
    KeyError                                  Traceback (most recent call last)
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/scope.py:212, in Scope.resolve(self, key, is_local)
        208 try:
        209     # last ditch effort we look in temporaries
        210     # these are created when parsing indexing expressions
        211     # e.g., df[df > 0]
    --> 212     return self.temps[key]
        213 except KeyError as err:
        214     # runtime import because ops imports from scope
    
    KeyError: 'ta_sma'
    
    The above exception was the direct cause of the following exception:
    
    UndefinedVariableError                    Traceback (most recent call last)
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:652, in BaseExprVisitor.visit_Call(self, node, side, **kwargs)
        651 try:
    --> 652     res = self.visit(node.func)
        653 except UndefinedVariableError:
        654     # Check if this is a supported function name
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:535, in BaseExprVisitor.visit_Name(self, node, **kwargs)
        534 def visit_Name(self, node, **kwargs):
    --> 535     return self.term_type(node.id, self.env, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/ops.py:86, in Term.__init__(self, name, env, side, encoding)
         85 self.is_local = tname.startswith(LOCAL_TAG) or tname in DEFAULT_GLOBALS
    ---> 86 self._value = self._resolve_name()
         87 self.encoding = encoding
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/ops.py:103, in Term._resolve_name(self)
        102 def _resolve_name(self):
    --> 103     res = self.env.resolve(self.local_name, is_local=self.is_local)
        104     self.update(res)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/scope.py:217, in Scope.resolve(self, key, is_local)
        215 from pandas.core.computation.ops import UndefinedVariableError
    --> 217 raise UndefinedVariableError(key, is_local) from err
    
    UndefinedVariableError: name 'ta_sma' is not defined
    
    During handling of the above exception, another exception occurred:
    
    ValueError                                Traceback (most recent call last)
    File module2/modules/filter/v3/__init__.py:48, in biglearning.module2.modules.filter.v3.__init__.BigQuantModule.run()
    
    File /var/app/enabled/bigshared/common/dataframe.py:74, in evalex(df, expr, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/frame.py:3596, in DataFrame.eval(self, expr, inplace, **kwargs)
       3594 kwargs["resolvers"] = kwargs.get("resolvers", ()) + tuple(resolvers)
    -> 3596 return _eval(expr, inplace=inplace, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/eval.py:342, in eval(expr, parser, engine, truediv, local_dict, global_dict, resolvers, level, target, inplace)
        334 env = ensure_scope(
        335     level + 1,
        336     global_dict=global_dict,
       (...)
        339     target=target,
        340 )
    --> 342 parsed_expr = Expr(expr, engine=engine, parser=parser, env=env)
        344 # construct the engine and evaluate the parsed expression
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:798, in Expr.__init__(self, expr, engine, parser, env, level)
        797 self._visitor = PARSERS[parser](self.env, self.engine, self.parser)
    --> 798 self.terms = self.parse()
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:817, in Expr.parse(self)
        814 """
        815 Parse an expression.
        816 """
    --> 817 return self._visitor.visit(self.expr)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:407, in BaseExprVisitor.visit_Module(self, node, **kwargs)
        406 expr = node.body[0]
    --> 407 return self.visit(expr, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:410, in BaseExprVisitor.visit_Expr(self, node, **kwargs)
        409 def visit_Expr(self, node, **kwargs):
    --> 410     return self.visit(node.value, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:737, in BaseExprVisitor.visit_BoolOp(self, node, **kwargs)
        736 operands = node.values
    --> 737 return reduce(visitor, operands)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:731, in BaseExprVisitor.visit_BoolOp.<locals>.visitor(x, y)
        730 lhs = self._try_visit_binop(x)
    --> 731 rhs = self._try_visit_binop(y)
        733 op, op_class, lhs, rhs = self._maybe_transform_eq_ne(node, lhs, rhs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:726, in BaseExprVisitor._try_visit_binop(self, bop)
        725     return bop
    --> 726 return self.visit(bop)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:710, in BaseExprVisitor.visit_Compare(self, node, **kwargs)
        709     binop = ast.BinOp(op=op, left=node.left, right=comps[0])
    --> 710     return self.visit(binop)
        712 # recursive case: we have a chained comparison, a CMP b CMP c, etc.
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:522, in BaseExprVisitor.visit_BinOp(self, node, **kwargs)
        521 def visit_BinOp(self, node, **kwargs):
    --> 522     op, op_class, left, right = self._maybe_transform_eq_ne(node)
        523     left, right = self._maybe_downcast_constants(left, right)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:442, in BaseExprVisitor._maybe_transform_eq_ne(self, node, left, right)
        441 if left is None:
    --> 442     left = self.visit(node.left, side="left")
        443 if right is None:
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:656, in BaseExprVisitor.visit_Call(self, node, side, **kwargs)
        655 try:
    --> 656     res = FuncNode(node.func.id)
        657 except ValueError:
        658     # Raise original error
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/ops.py:613, in FuncNode.__init__(self, name)
        608 if name not in MATHOPS or (
        609     NUMEXPR_INSTALLED
        610     and NUMEXPR_VERSION < LooseVersion("2.6.9")
        611     and name in ("floor", "ceil")
        612 ):
    --> 613     raise ValueError(f'"{name}" is not a supported function')
        615 self.name = name
    
    ValueError: "ta_sma" is not a supported function
    
    During handling of the above exception, another exception occurred:
    
    KeyError                                  Traceback (most recent call last)
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/scope.py:201, in Scope.resolve(self, key, is_local)
        200 if self.has_resolvers:
    --> 201     return self.resolvers[key]
        203 # if we're here that means that we have no locals and we also have
        204 # no resolvers
    
    File /usr/local/python3/lib/python3.8/collections/__init__.py:898, in ChainMap.__getitem__(self, key)
        897         pass
    --> 898 return self.__missing__(key)
    
    File /usr/local/python3/lib/python3.8/collections/__init__.py:890, in ChainMap.__missing__(self, key)
        889 def __missing__(self, key):
    --> 890     raise KeyError(key)
    
    KeyError: 'ta_sma'
    
    During handling of the above exception, another exception occurred:
    
    KeyError                                  Traceback (most recent call last)
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/scope.py:212, in Scope.resolve(self, key, is_local)
        208 try:
        209     # last ditch effort we look in temporaries
        210     # these are created when parsing indexing expressions
        211     # e.g., df[df > 0]
    --> 212     return self.temps[key]
        213 except KeyError as err:
        214     # runtime import because ops imports from scope
    
    KeyError: 'ta_sma'
    
    The above exception was the direct cause of the following exception:
    
    UndefinedVariableError                    Traceback (most recent call last)
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:652, in BaseExprVisitor.visit_Call(self, node, side, **kwargs)
        651 try:
    --> 652     res = self.visit(node.func)
        653 except UndefinedVariableError:
        654     # Check if this is a supported function name
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:535, in BaseExprVisitor.visit_Name(self, node, **kwargs)
        534 def visit_Name(self, node, **kwargs):
    --> 535     return self.term_type(node.id, self.env, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/ops.py:86, in Term.__init__(self, name, env, side, encoding)
         85 self.is_local = tname.startswith(LOCAL_TAG) or tname in DEFAULT_GLOBALS
    ---> 86 self._value = self._resolve_name()
         87 self.encoding = encoding
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/ops.py:103, in Term._resolve_name(self)
        102 def _resolve_name(self):
    --> 103     res = self.env.resolve(self.local_name, is_local=self.is_local)
        104     self.update(res)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/scope.py:217, in Scope.resolve(self, key, is_local)
        215 from pandas.core.computation.ops import UndefinedVariableError
    --> 217 raise UndefinedVariableError(key, is_local) from err
    
    UndefinedVariableError: name 'ta_sma' is not defined
    
    During handling of the above exception, another exception occurred:
    
    ValueError                                Traceback (most recent call last)
    Cell In[4], line 140
        129 m5 = M.chinaa_stock_filter.v1(
        130     input_data=m3.data,
        131     index_constituent_cond=['中证1000'],
       (...)
        136     output_left_data=False
        137 )
        139 # @module(position="314,381.989013671875", comment='', comment_collapsed=True)
    --> 140 m6 = M.filter.v3(
        141     input_data=m5.data,
        142     expr='pe_ttm_0>0 & list_days_0>360 & ta_sma(close_0,30)>ta_sma(close_2,30) & price_limit_status_0==2 & volatility_30_0<0.1',
        143     output_left_data=False
        144 )
        146 # @module(position="100,515", comment='', comment_collapsed=True)
        147 m4 = M.hftrade.v2(
        148     instruments=m1.data,
        149     options_data=m6.data,
       (...)
        172     backtest_only=False
        173 )
    
    File module2/common/modulemanagerv2.py:88, in biglearning.module2.common.modulemanagerv2.BigQuantModuleVersion.__call__()
    
    File module2/common/moduleinvoker.py:370, in biglearning.module2.common.moduleinvoker.module_invoke()
    
    File module2/common/moduleinvoker.py:292, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
    
    File module2/common/moduleinvoker.py:253, in biglearning.module2.common.moduleinvoker._invoke_with_cache()
    
    File module2/common/moduleinvoker.py:212, in biglearning.module2.common.moduleinvoker._module_run()
    
    File module2/modules/filter/v3/__init__.py:69, in biglearning.module2.modules.filter.v3.__init__.BigQuantModule.run()
    
    File /var/app/enabled/bigshared/common/dataframe.py:74, in evalex(df, expr, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/frame.py:3596, in DataFrame.eval(self, expr, inplace, **kwargs)
       3593     kwargs["target"] = self
       3594 kwargs["resolvers"] = kwargs.get("resolvers", ()) + tuple(resolvers)
    -> 3596 return _eval(expr, inplace=inplace, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/eval.py:342, in eval(expr, parser, engine, truediv, local_dict, global_dict, resolvers, level, target, inplace)
        333 # get our (possibly passed-in) scope
        334 env = ensure_scope(
        335     level + 1,
        336     global_dict=global_dict,
       (...)
        339     target=target,
        340 )
    --> 342 parsed_expr = Expr(expr, engine=engine, parser=parser, env=env)
        344 # construct the engine and evaluate the parsed expression
        345 eng = ENGINES[engine]
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:798, in Expr.__init__(self, expr, engine, parser, env, level)
        796 self.parser = parser
        797 self._visitor = PARSERS[parser](self.env, self.engine, self.parser)
    --> 798 self.terms = self.parse()
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:817, in Expr.parse(self)
        813 def parse(self):
        814     """
        815     Parse an expression.
        816     """
    --> 817     return self._visitor.visit(self.expr)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        399 method = "visit_" + type(node).__name__
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:407, in BaseExprVisitor.visit_Module(self, node, **kwargs)
        405     raise SyntaxError("only a single expression is allowed")
        406 expr = node.body[0]
    --> 407 return self.visit(expr, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        399 method = "visit_" + type(node).__name__
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:410, in BaseExprVisitor.visit_Expr(self, node, **kwargs)
        409 def visit_Expr(self, node, **kwargs):
    --> 410     return self.visit(node.value, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        399 method = "visit_" + type(node).__name__
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:737, in BaseExprVisitor.visit_BoolOp(self, node, **kwargs)
        734     return self._maybe_evaluate_binop(op, node.op, lhs, rhs)
        736 operands = node.values
    --> 737 return reduce(visitor, operands)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:731, in BaseExprVisitor.visit_BoolOp.<locals>.visitor(x, y)
        729 def visitor(x, y):
        730     lhs = self._try_visit_binop(x)
    --> 731     rhs = self._try_visit_binop(y)
        733     op, op_class, lhs, rhs = self._maybe_transform_eq_ne(node, lhs, rhs)
        734     return self._maybe_evaluate_binop(op, node.op, lhs, rhs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:726, in BaseExprVisitor._try_visit_binop(self, bop)
        724 if isinstance(bop, (Op, Term)):
        725     return bop
    --> 726 return self.visit(bop)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        399 method = "visit_" + type(node).__name__
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:710, in BaseExprVisitor.visit_Compare(self, node, **kwargs)
        708     op = self.translate_In(ops[0])
        709     binop = ast.BinOp(op=op, left=node.left, right=comps[0])
    --> 710     return self.visit(binop)
        712 # recursive case: we have a chained comparison, a CMP b CMP c, etc.
        713 left = node.left
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        399 method = "visit_" + type(node).__name__
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:522, in BaseExprVisitor.visit_BinOp(self, node, **kwargs)
        521 def visit_BinOp(self, node, **kwargs):
    --> 522     op, op_class, left, right = self._maybe_transform_eq_ne(node)
        523     left, right = self._maybe_downcast_constants(left, right)
        524     return self._maybe_evaluate_binop(op, op_class, left, right)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:442, in BaseExprVisitor._maybe_transform_eq_ne(self, node, left, right)
        440 def _maybe_transform_eq_ne(self, node, left=None, right=None):
        441     if left is None:
    --> 442         left = self.visit(node.left, side="left")
        443     if right is None:
        444         right = self.visit(node.right, side="right")
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:401, in BaseExprVisitor.visit(self, node, **kwargs)
        399 method = "visit_" + type(node).__name__
        400 visitor = getattr(self, method)
    --> 401 return visitor(node, **kwargs)
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/expr.py:656, in BaseExprVisitor.visit_Call(self, node, side, **kwargs)
        653 except UndefinedVariableError:
        654     # Check if this is a supported function name
        655     try:
    --> 656         res = FuncNode(node.func.id)
        657     except ValueError:
        658         # Raise original error
        659         raise
    
    File /usr/local/python3/lib/python3.8/site-packages/pandas/core/computation/ops.py:613, in FuncNode.__init__(self, name)
        606 from pandas.core.computation.check import NUMEXPR_INSTALLED, NUMEXPR_VERSION
        608 if name not in MATHOPS or (
        609     NUMEXPR_INSTALLED
        610     and NUMEXPR_VERSION < LooseVersion("2.6.9")
        611     and name in ("floor", "ceil")
        612 ):
    --> 613     raise ValueError(f'"{name}" is not a supported function')
        615 self.name = name
        616 self.func = getattr(np, name)
    
    ValueError: "ta_sma" is not a supported function