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'