feat: 仓位模型内生化(STRATEGY_SIZING)+次日开盘入场杜绝未来幻觉+列表仓位列——波段策略3仓/固定出场4-5仓,v11.0以3仓+115.4%居首

This commit is contained in:
hmo
2026-07-29 13:40:31 +08:00
parent ff54d37915
commit f69cab552b
2 changed files with 30 additions and 6 deletions
+28 -6
View File
@@ -323,6 +323,21 @@ def get_strategy(version):
return STRATEGIES[version]
# 各策略的最优仓位模型(仓位扫描实证,2026-07-29)
# 波段/结构出场适合大仓少股,固定出场适合小仓多股
STRATEGY_SIZING = {
'v7.1': 4, # 固定15%出场,4仓+74.6%最优(10仓+59.8%)
'v7.2': 3, # 分批止盈,3仓+60.7%
'v8.0': 3, # 结构持有,3仓+53.2%
'v8.1': 3, # 波段MA103仓+102.9%
'v8.3': 3, # 波段40天,3仓+62.1%
'v9.2': 5, # 周线破位,5仓+47.6%
'v6.1': 5, # 板块不追高,5仓+47.3%
'v11.0': 3, # 枢轴波段,3仓+116.4%
'v11.1': 3, # 枢轴强压/弱撑,3仓+55.8%
}
# ══════════════════════════════════════════════════════
# 大盘 / 行业上下文
# ══════════════════════════════════════════════════════
@@ -706,6 +721,11 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T
factors.update(weekly_ctx(code, date))
if pass_filters(factors, filters):
# ── 次日开盘价入场(杜绝"信号日收盘买"的未来幻觉)──
if i + 1 >= len(bars):
i += step
continue
ep = bars[i+1].get('open') or close
atr_val = last.get('atr') or 0
if exit_cfg.get('use_pivot_sr'):
# 实盘口径:强压止盈 + 弱支撑止损(枢轴点体系)
@@ -850,14 +870,14 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T
for l in legs:
total_ret *= (1 + l)
pnl = (total_ret - 1) * 100
exit_price = close * total_ret
exit_price = ep * total_ret
hold_days = len(future) if future else 0
elif exit_cfg.get('exit_mode') == 'swing_pivot':
# ── 波段·枢轴版:破弱支撑先出,收复弱压且创新高再进 ──
reentry_window = exit_cfg.get('reentry_days', 10)
legs = []
in_pos = True
entry_p = close
entry_p = ep
stop_cur = stop
wait = 0
exit_reason = 'keep'
@@ -891,7 +911,7 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T
for l in legs:
total_ret *= (1 + l)
pnl = (total_ret - 1) * 100
exit_price = close * total_ret
exit_price = ep * total_ret
hold_days = len(future) if future else 0
else:
exit_price = exit_reason = None
@@ -916,7 +936,7 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T
if exit_price is None:
exit_price = future[-1].get('close') if future else close
exit_reason, hold_days = 'keep', len(future)
pnl = (exit_price - close) / close * 100 if close > 0 else 0
pnl = (exit_price - ep) / ep * 100 if ep > 0 else 0
trades.append({
'code': code, 'name': name,
'entry_date': date,
@@ -936,9 +956,11 @@ def run_backtest(strategy_version, start_date, end_date, capital=1000000, save=T
i += step
summary = calc_summary(trades, capital)
# 组合级资产模拟(统一标准:等额仓位、最多10仓
# 组合级资产模拟:用该策略自己的最优仓位模型(波段策略大仓少股,固定出场小仓多股
if summary:
summary['portfolio'] = portfolio_sim(trades, capital, 10)
slots = STRATEGY_SIZING.get(strategy_version, 10)
summary['portfolio'] = portfolio_sim(trades, capital, slots)
summary['sizing_slots'] = slots
result = {
'strategy': strat['version'],
'strategy_name': strat['name'],