feat: 港股基准改下跌市时段(分段算HSI收益再合并)——老莫确认口径,1y10.4%/2y8.7%/10y4.5%无失真

This commit is contained in:
xxm
2026-08-16 10:39:25 +08:00
parent 956dddc78e
commit 38e19fcc2c
+40 -1
View File
@@ -24,7 +24,11 @@ BENCH_DAYS = {"1y": 365, "2y": 730, "10y": 3650}
def get_benchmarks(market="a"):
"""大盘年化基准:1y/2y/10y"""
"""大盘年化基准:1y/2y/10y
A股:全年大盘年化(market_regime 指数 close,复利年化)
港股(2026-08-16 老莫确认):下跌市时段基准——trend_down 日期的 HSI 表现,
线性放大年化(trend_down 时段收益 × 365/td天数)。港股策略只在下跌市运行,与全年比不公平。
"""
out = {}
try:
conn = sqlite3.connect(str(DATA_DIR / "mofin.db"), timeout=5)
@@ -41,6 +45,41 @@ def get_benchmarks(market="a"):
yrs = days / 365.0
if pct > -100:
out[label] = round(((1 + pct / 100) ** (1 / yrs) - 1) * 100, 1)
# ── 港股:下跌市时段基准(trend_down 期间 HSI,按每次时段分段算再合并)──
if market == "hk":
out = {}
for label, days in BENCH_DAYS.items():
cutoff = (datetime.now() - timedelta(days=days)).strftime("%Y-%m-%d")
rows = conn.execute(
"SELECT date, regime, close FROM market_regime WHERE market='hk' AND date>=? "
"ORDER BY date", (cutoff,)).fetchall()
# 分段:连续 trend_down 日组成段,段内 HSI 末/首 -1
closes = {r[0]: r[2] for r in rows}
seg_ret = []
in_seg = False
seg_first = None
seg_last_close = None
for d, reg, c in rows:
if reg == "trend_down" and c:
if not in_seg:
in_seg = True
seg_first = c
seg_last_close = c
else:
if in_seg:
seg_ret.append((c / seg_first - 1) * 100 if c and seg_first else 0)
in_seg = False
seg_first = None
seg_last_close = None
if in_seg and seg_first:
# 最后一段未结束(窗口尾部仍下跌市),用段内最后 close
if seg_last_close:
seg_ret.append((seg_last_close / seg_first - 1) * 100)
if not seg_ret:
continue
# 合并:段收益加总(下跌市期间累计表现),线性年化 ×365/窗口天数
total_ret = sum(seg_ret)
out[label] = round(total_ret * (365.0 / max(days, 1)), 1)
conn.close()
except Exception:
pass