【代码报错】数据库查询报错
由bqhlrz48创建,最终由small_q 被浏览 3 用户
报错如下:
ParserException Traceback (most recent call last) Cell In[13], line 62 45 m1 = M.input_features_dai.v30( 46 expr="""-- 显式添加SELECT确保语句完整 47 SELECT (...) 56 expr_drop_na=True 57 ) 61 # @module(comment="数据抽取") ---> 62 m4 = M.extract_data_dai.v18( 63 sql=m1.data, 64 start_date="2024-12-20", # 为计算10日内变动预留更多数据 65 start_date_bound_to_trading_date=True, 66 end_date="2025-04-30", 67 end_date_bound_to_trading_date=True, 68 before_start_days=120 69 ) 71 # @module(comment="回测") 72 m2 = M.bigtrader.v35( 73 data=m4.data, 74 initialize=initialize, (...) 84 plot_charts=True 85 ) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/modules.py:28, in call(self, **kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:203, in module_invoke(name, version, kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:169, in _module_invoke(name, version, kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:41, in _module_run(module, kwargs) File dist/build/extract_data_dai/v18/init.py:78, in v18.run() File /var/app/enabled/dai/_telemetry.py:128, in wrapper(*args, **kwargs) File /var/app/enabled/dai/_functions.py:280, in query(sql, udf_list, full_db_scan, filters, bind_relations, params) ParserException: Parser Error: syntax error at or near "SELECT"
自动生成的代码是:
from bigmodule import M
# <aistudiograph>
# @param(id="initialize", name="initialize") def initialize(context): from bigtrader.finance.commission import PerOrder # 设置每笔订单的买卖成本及最低成本 context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
# @param(id="handle_data", name="handle_data") def handle_data(context, data): # 这里验证当前是否为调仓日 if not context.rebalance_period.is_signal_date(data.current_dt.date()): return
# 从数据集中获取当天数据
today_df = context.data\[context.data\["date"\] == data.current_dt.strftime("%Y-%m-%d")\]
# 如果当天没有数据,返回不处理任何操作
if len(today_df) == 0:
return
# 逻辑开仓和清仓条件
entry_signal = today_df.entry_condi.any()
exit_signal = today_df.exit_condi.any()
positions = context.get_account_positions()
# 检查是否需要清仓操作
if exit_signal:
for etf in positions.keys():
context.order_target_percent(etf, 0) # 全部清仓
return
# 检查是否需要进行开仓操作
if entry_signal:
# 选取前10日涨跌幅最高的两只ETF持仓
today_df = today_df.sort_values('pct_change_10d', ascending=False).head(2)
weight = 1.0 / len(today_df)
for etf in today_df\['instrument'\]:
context.order_target_percent(etf, weight)
# @module(comment="输入特征构建") m1 = M.input_features_dai.v30( expr="""-- 显式添加SELECT确保语句完整 SELECT m_ta_macd_dif(close, fastperiod:=12, slowperiod:=26, signalperiod:=9) AS dif, m_ta_sar(high, low, close, step=0.02, max=0.2) AS sar, (m_lag(dif, 1) > 0) AND (m_lag(close, 1) > m_lag(sar, 1)) AS entry_condi, (m_lag(dif, 1) < 0) OR (m_lag(close, 1) < m_lag(sar, 1)) AS exit_condi, (close / m_lag(close, 10)) - 1 AS pct_change_10d """, # 显式包含SELECT并验证括号 expr_filters="instrument IN ('513180.SZ', '159996.SZ', '159819.SZ')", expr_tables="cn_stock_prefactors", expr_drop_na=True )
# @module(comment="数据抽取") m4 = M.extract_data_dai.v18( sql=m1.data, start_date="2024-12-20", # 为计算10日内变动预留更多数据 start_date_bound_to_trading_date=True, end_date="2025-04-30", end_date_bound_to_trading_date=True, before_start_days=120 )
# @module(comment="回测") m2 = M.bigtrader.v35( data=m4.data, initialize=initialize, handle_data=handle_data, capital_base=1000000, frequency="daily", product_type="股票", # ETF属于股票分类 rebalance_period_type="交易日", rebalance_period_days="5", order_price_field_buy="open", order_price_field_sell="open", benchmark="沪深300指数", # 常用基准 plot_charts=True )
# </aistudiograph>