This commit is contained in:
2026-09-21 12:38:13 +08:00
parent bcacbed427
commit ed6d4ee7a5
14 changed files with 2458 additions and 1073 deletions

View File

@@ -0,0 +1,43 @@
"""新白名单16 只板块 ETF的快速回测冒烟只打印不覆盖既有 results.json。
用法: py -3.14 -B labs/analysis/etf/smoke_sectors.py [起始资金]
"""
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
try:
sys.stdout.reconfigure(encoding="utf-8", errors="replace")
except Exception:
pass
from backtest import REPO_DEFAULTS, START_CASH, SYMBOLS, SYMBOL_PARAMS, analyze, fetch_daily, simulate # noqa: E402
CASH = float(sys.argv[1]) if len(sys.argv) > 1 else 600_000.0
data = {code: fetch_daily(code) for code in SYMBOLS}
print(f"标的 {len(SYMBOLS)} 只,账户 {CASH:,.0f} 元,参数取 py-client/etc/_etf.yaml")
print(f"{'成交模型':10} {'权益变动':>11} {'收益率':>8} {'最大回撤':>9} {'平均占用':>9} "
f"{'峰值占用':>9} {'底仓':>5} {'补仓':>5} {'主出口':>6} {'佣金':>8}")
for mode in ("touch", "bounce", "close"):
result = simulate(data, start_cash=CASH, fill_mode=mode)
stats = analyze(result)
fills = result["fills"]
print(f"{mode:10} {stats['final_equity'] - CASH:11,.2f} {stats['return_pct']:7.2f}% "
f"{stats['max_dd_pct']:8.2f}% {stats['avg_deployed'] / CASH * 100:8.2f}% "
f"{stats['max_deployed'] / CASH * 100:8.2f}% "
f"{sum(1 for f in fills if f.kind == 'base'):5} "
f"{sum(1 for f in fills if f.kind == 'add'):5} "
f"{sum(1 for f in fills if f.kind == 'exit'):6} {stats['fees']:8.2f}")
# 逐标的参与度:新白名单里谁真的被交易到
print()
print("逐标的成交touch 模型)")
result = simulate(data, start_cash=CASH, fill_mode="touch")
for code in SYMBOLS:
rows = [f for f in result["fills"] if f.code == code]
buys = sum(f.price * f.volume for f in rows if f.side == "BUY")
print(f" {code:11} 成交 {len(rows):3} 笔 买入名义 {buys:10,.0f} "
f"底仓 {sum(1 for f in rows if f.kind == 'base')} 补仓 {sum(1 for f in rows if f.kind == 'add')}")