问答交流

KeyError: 'start_date'

由bql77fej创建,最终由bql77fej 被浏览 1 用户

from bigmodule import M

# <aistudiograph>

# @param(id="m5", name="initialize")
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))

# @param(id="m5", name="handle_data")
def m5_handle_data_bigquant_run(context, data):
    import pandas as pd

    # 当前日期
    current_date = data.current_dt.strftime("%Y-%m-%d")

    # 取当日截面信号(已在数据中完成“Top5 + 等权position”)
    day_df = context.data[context.data["date"] == current_date]
    if day_df is None or len(day_df) == 0:
        return

    target = day_df[["instrument", "position"]].dropna()
    target = target[target["position"] > 0]

    # 目标持仓集合
    target_instruments = set(target["instrument"].tolist())

    # 当前持仓集合
    current_hold_instruments = set(context.get_account_positions().keys())

    # 先卖出不在目标中的持仓
    for ins in list(current_hold_instruments - target_instruments):
        context.order_target_percent(ins, 0)

    # 再买入/调仓到目标权重
    for _, row in target.iterrows():
        ins = row["instrument"]
        w = float(row["position"])
        context.order_target_percent(ins, w)

# @module(comment="A股-基础选股:作为基础股票范围(不额外限制指数成分,后续用SQL做基金持仓过滤)")
m1 = M.cn_stock_basic_selector.v8(
    exchanges=["上交所", "深交所", "北交所"],
    list_sectors=["主板", "科创板", "创业板"],
    indexes=["中证500", "上证指数", "创业板指", "深证成指", "上证50", "科创50", "沪深300", "中证1000", "中证100", "深证100"],
    st_statuses=["正常", "ST", "*ST"],
    sw2021_industries=['农林牧渔','采掘','基础化工','钢铁','有色金属','建筑建材','机械设备','电子','汽车','交运设备','信息设备','家用电器','食品饮料','纺织服饰','轻工制造','医药生物','公用事业','交通运输','房地产','金融服务','商贸零售','社会服务','信息服务','银行','非银金融','综合','建筑材料','建筑装饰','电力设备','国防军工','计算机','传媒','通信','煤炭','石油石化','环保','美容护理'],
    drop_suspended=True,
    m_name="m1"
)

# @module(comment="DAI SQL:基金最新报告期重仓股 + 均线信号 + 市值排序打分(score=市值)")
m2 = M.input_features_dai.v30(
    input_2=m1.data,
    mode="SQL",
    sql="""
WITH latest_rpt AS (
    SELECT instrument, MAX(report_date) AS last_rpt
    FROM cn_fund_holding_detail
    WHERE report_date IS NOT NULL
    GROUP BY instrument
),
fund_stock AS (
    SELECT DISTINCT h.stock_instrument AS instrument
    FROM cn_fund_holding_detail h
    JOIN latest_rpt l ON h.instrument = l.instrument AND h.report_date = l.last_rpt
    WHERE h.holding_pct > 0.01
    AND h.stock_instrument NOT LIKE '689%'
    AND (h.stock_instrument LIKE '%.SH' OR h.stock_instrument LIKE '%.SZ')
),
feat AS (
    SELECT
        date,
        instrument,
        m_avg(close, 5) AS ma5,
        m_avg(close, 10) AS ma10,
        m_avg(close, 30) AS ma30,
        m_lag(m_avg(close, 5), 1) AS ma5_l1,
        m_lag(m_avg(close, 10), 1) AS ma10_l1,
        float_market_cap
    FROM cn_stock_prefactors
    WHERE instrument IN (SELECT instrument FROM fund_stock)
),
sig AS (
    SELECT
        date,
        instrument,
        ma5,
        ma10,
        ma30,
        float_market_cap,
        CASE
            WHEN ma5 > ma30
            AND ma10 > ma30
            AND (ma5 > ma10 OR (ma5 > ma10 AND ma5_l1 <= ma10_l1))
            THEN 1 ELSE 0
        END AS pick,
        float_market_cap AS score
    FROM feat
)
SELECT
    date,
    instrument,
    ma5,
    ma10,
    ma30,
    float_market_cap,
    pick,
    score
FROM sig
WHERE pick = 1
ORDER BY date, instrument
""",
    expr_tables="cn_stock_prefactors",
    expr_drop_na=True,
    extract_data=False,
    m_name="m2"
)

# @module(comment="数据抽取:为MA30预留历史窗口")
m3 = M.extract_data_dai.v20(
    sql=m2.data,
    start_date="""2022-01-01""",
    end_date="""2024-12-31""",
    start_date_bound_to_trading_date=True,
    end_date_bound_to_trading_date=True,
    before_start_days=60,
    m_name="m3"
)

# @module(comment="仓位分配:按市值倒序(score DESC)取前5等权")
m4 = M.score_to_position.v4(
    input_1=m3.data,
    score_field="score DESC",
    position_expr="1 AS position",
    hold_count=5,
    total_position=0.99,
    m_name="m4"
)

# @module(comment="回测:两周调仓(周度交易日,每2周一次)")
m5 = M.bigtrader.v43(
    data=m4.data,
    start_date="""""",
    end_date="""""",
    initialize=m5_initialize_bigquant_run,
    handle_data=m5_handle_data_bigquant_run,
    capital_base=1000000,
    frequency="daily",
    product_type="股票",
    rebalance_period_type="周度交易日",
    rebalance_period_days="2",
    order_price_field_buy="open",
    order_price_field_sell="open",
    benchmark="沪深300指数",
    plot_charts=True,
    debug=False,
    backtest_only=False,
    m_name="m5"
)

# </aistudiograph>

如上代码运行报错,求助大佬,KeyError Traceback (most recent call last) Cell In[8], line 142 132 m4 = M.score_to_position.v4( 133 input_1=m3.data, 134 score_field="score DESC", (...) 138 m_name="m4" 139 ) 141 # @module(comment="回测:两周调仓(周度交易日,每2周一次)") --> 142 m5 = M.bigtrader.v43( 143 data=m4.data, 144 start_date="""""", 145 end_date="""""", 146 initialize=m5_initialize_bigquant_run, 147 handle_data=m5_handle_data_bigquant_run, 148 capital_base=1000000, 149 frequency="daily", 150 product_type="股票", 151 rebalance_period_type="周度交易日", 152 rebalance_period_days="2", 153 order_price_field_buy="open", 154 order_price_field_sell="open", 155 benchmark="沪深300指数", 156 plot_charts=True, 157 debug=False, 158 backtest_only=False, 159 m_name="m5" 160 ) 162 # </aistudiograph> 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:218, in module_invoke(name, version, kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:181, in _module_invoke(name, version, kwargs) File /opt/pyenv/versions/3.11.8/lib/python3.11/site-packages/bigmodule/moduleinvoker.py:44, in _module_run(module, kwargs) File dist/build/bigtrader/v43/init.py:408, in v43.run() File dist/build/bigtrader/v43/init.py:193, in v43._run() File dist/build/bigtrader/v43/init.py:179, in v43._run_backtest() File dist/build/bigtrader/v43/core/pybacktest/init.py:150, in v43.core.pybacktest.BigQuantModule.init() KeyError: 'start_date'

{link}