代码报错ParserException: Parser Error: syntax error at or near "AND"
由bqrctkw8创建,最终由bqrctkw8 被浏览 1 用户
from bigmodule import M
import numpy as np
import pandas as pd
# 交易引擎:初始化函数,只执行一次
def m5_initialize_bigquant_run(context):
from bigtrader.finance.commission import PerOrder
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
context.hot_stocks = [] # 持仓股票池
# 交易引擎:每个单位时间开盘前调用一次
def m5_before_trading_start_bigquant_run(context, data):
pass
# 交易引擎:tick数据处理函数,每个tick执行一次
def m5_handle_tick_bigquant_run(context, tick):
pass
# 交易引擎:日线数据处理函数,每日执行一次
def m5_handle_data_bigquant_run(context, data):
import pandas as pd
# 下一个交易日不是调仓日,则不生成信号
if not context.rebalance_period.is_signal_date(data.current_dt.date()):
return
# 从传入的数据 context.data 中读取今天的信号数据
today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
target_instruments = set(today_df["instrument"])
# 获取当前已持有股票
holding_instruments = set(context.get_account_positions().keys())
# 卖出不在目标持有列表中的股票
for instrument in holding_instruments - target_instruments:
context.order_target_percent(instrument, 0)
# 买入目标持有列表中的股票
for i, x in today_df.iterrows():
position = 0.0 if pd.isnull(x.position) else float(x.position)
context.order_target_percent(x.instrument, position)
# 交易引擎:成交回报处理函数,每个成交发生时执行一次
def m5_handle_trade_bigquant_run(context, trade):
pass
# 交易引擎:委托回报处理函数,每个委托变化时执行一次
def m5_handle_order_bigquant_run(context, order):
pass
# 交易引擎:盘后处理函数,每日盘后执行一次
def m5_after_trading_bigquant_run(context, data):
pass
# 模块1: 股票池过滤(中小市值、高换手、非ST)
m1 = M.cn_stock_basic_selector.v8(
exchanges=["上交所", "深交所"],
list_sectors=["主板", "创业板"],
st_statuses=["正常"],
margin_tradings=["两融标的", "非两融标的"],
sw2021_industries=[
"农林牧渔", "采掘", "基础化工", "钢铁", "有色金属", "建筑建材", "机械设备",
"电子", "汽车", "交运设备", "信息设备", "家用电器", "食品饮料", "纺织服饰",
"轻工制造", "医药生物", "公用事业", "交通运输", "房地产", "金融服务", "商贸零售",
"社会服务", "信息服务", "银行", "非银金融", "综合", "建筑材料", "建筑装饰",
"电力设备", "国防军工", "计算机", "传媒", "通信", "煤炭", "石油石化", "环保",
"美容护理"
],
drop_suspended=True,
m_name="m1"
)
# 模块2: 因子特征(中小市值、高换手、技术面筛选)
m2 = M.input_features_dai.v30(
input_1=m1.data,
mode="表达式",
expr="""
-- 综合评分:成交量评分 + 动量评分
(volume / m_lag(volume, 20)) * 0.5 + daily_return * 0.5 AS score
""",
expr_filters="""
-- 流通市值后80%(中小市值)
circulating_market_cap < (SELECT PERCENTILE_CONT(0.8) WITHIN GROUP (ORDER BY circulating_market_cap) FROM cn_stock_factors)
AND turnover_rate > 0.05 -- 换手率 > 5%
AND rsi_14 < 70 -- RSI < 70(非超买)
AND volume_ratio > 1.5 -- 量比 > 1.5
AND daily_return > 0.03 -- 近3日涨幅 > 3%
""",
expr_tables="cn_stock_factors",
extra_fields="date, instrument",
order_by="date, instrument",
expr_drop_na=True,
sql="""
SELECT
volume,
m_lag(volume, 20) AS volume_20d_avg,
daily_return,
rsi_14,
volume_ratio,
turnover_rate,
circulating_market_cap,
date, instrument
FROM
cn_stock_factors
WHERE
st_status = 0
AND is_paused = 0
""",
extract_data=False,
m_cached=False,
m_name="m2"
)
# 模块3: 打分到仓位(按评分排序分配)
m3 = M.score_to_position.v4(
input_1=m2.data,
score_field="score DESC",
hold_count=5,
position_expr="""
-- 按评分倒数分配仓位(评分越高,仓位越大)
1 / c_rank(score) AS position
""",
total_position=1,
extract_data=False,
m_name="m3"
)
# 模块4: 抽取预测数据(指定回测时间范围)
m4 = M.extract_data_dai.v19(
sql=m3.data,
start_date="2020-01-01",
start_date_bound_to_trading_date=True,
end_date="2025-05-17",
end_date_bound_to_trading_date=True,
before_start_days=90,
keep_before=False,
debug=False,
m_name="m4"
)
# 模块5: 交易引擎(集成策略逻辑)
m5 = M.bigtrader.v38(
data=m4.data,
start_date="",
end_date="",
initialize=m5_initialize_bigquant_run,
before_trading_start=m5_before_trading_start_bigquant_run,
handle_tick=m5_handle_tick_bigquant_run,
handle_data=m5_handle_data_bigquant_run,
handle_trade=m5_handle_trade_bigquant_run,
handle_order=m5_handle_order_bigquant_run,
after_trading=m5_after_trading_bigquant_run,
capital_base=1000000,
frequency="daily",
product_type="股票",
rebalance_period_type="交易日",
rebalance_period_days="5",
rebalance_period_roll_forward=True,
backtest_engine_mode="标准模式",
before_start_days=0,
volume_limit=1,
order_price_field_buy="open",
order_price_field_sell="open",
benchmark="沪深300指数",
plot_charts=True,
debug=False,
backtest_only=False,
m_name="m5"
)
报错内容:[2025-05-17 23:20:11] INFO: cn_stock_basic_selector.v8 开始运行 ..[2025-05-17 23:20:11] INFO: cn_stock_basic_selector.v8 命中缓存[2025-05-17 23:20:11] INFO: cn_stock_basic_selector.v8 运行完成 [0.080s].[2025-05-17 23:20:11] INFO: input_features_dai.v30 开始运行 ..[2025-05-17 23:20:11] INFO: expr mode[2025-05-17 23:20:11] INFO: input_features_dai.v30 运行完成 [0.194s].[2025-05-17 23:20:11] INFO: score_to_position.v4 开始运行 ..
您可以去社区论坛问答交流板块反馈咨询 去发帖>>
---------------------------------------------------------------------------
ParserException Traceback (most recent call last)
Cell In[8], line 115
74 m2 = M.input_features_dai.v30(
75 input_1=m1.data,
76 mode="表达式",
(...)
111 m_name="m2"
112 )
114 # 模块3: 打分到仓位(按评分排序分配)
--> 115 m3 = M.score_to_position.v4(
116 input_1=m2.data,
117 score_field="score DESC",
118 hold_count=5,
119 position_expr="""
120 -- 按评分倒数分配仓位(评分越高,仓位越大)
121 1 / c_rank(score) AS position
122 """,
123 total_position=1,
124 extract_data=False,
125 m_name="m3"
126 )
128 # 模块4: 抽取预测数据(指定回测时间范围)
129 m4 = M.extract_data_dai.v19(
130 sql=m3.data,
131 start_date="2020-01-01",
(...)
138 m_name="m4"
139 )
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/score_to_position/v4/__init__.py:227, in v4.run()
File dist/build/score_to_position/v4/__init__.py:105, in v4._ds_to_tables()
File dist/build/score_to_position/v4/__init__.py:86, in v4._ds_to_table()
ParserException: Parser Error: syntax error at or near "AND"
\