问答交流

代码报错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"

\

标签

Python数据处理交易引擎
{link}