复盘汇总加样本加权三列(ret_w/excess_w/beat_w),与方案第一节手工读数同口径对账;主口径仍按计划日等权

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
zlt 2026-09-02 17:03:33 +08:00
parent cb819198ea
commit ff2a201aff
1 changed files with 11 additions and 3 deletions

View File

@ -262,10 +262,17 @@ def run(since: str, until: str | None, horizons: tuple, start: str, out_dir: str
# 汇总:按名单 × 期限(全部);按分组 × 期限;按事后环境 × 名单(只作解释) # 汇总:按名单 × 期限(全部);按分组 × 期限;按事后环境 × 名单(只作解释)
def agg(g: pd.DataFrame) -> pd.Series: def agg(g: pd.DataFrame) -> pd.Series:
return pd.Series({"days": g["date"].nunique(), "n": int(g["n"].sum()), # 主口径按日等权:每个计划日先算名单均值,再跨日平均——一份名单一天一票;
# 带 _w 的三列按样本加权(大名单的日子权重大),与方案 1.8b/1.8c 手工读数同口径,只作对账。
n = g["n"].astype(float)
w = n / n.sum() if n.sum() else n
return pd.Series({"days": g["date"].nunique(), "n": int(n.sum()),
"ret": round(g["ret"].mean(), 2), "ret": round(g["ret"].mean(), 2),
"excess_all": round(g["excess_all"].mean(), 2), "excess_all": round(g["excess_all"].mean(), 2),
"beat": round(g["beat"].mean(), 1)}) "beat": round(g["beat"].mean(), 1),
"ret_w": round(float((g["ret"] * w).sum()), 2),
"excess_w": round(float((g["excess_all"] * w).sum()), 2),
"beat_w": round(float((g["beat"] * w).sum()), 1)})
lists_tbl = df[df["group"] == "全部"].groupby(["list", "h"]).apply(agg).reset_index() lists_tbl = df[df["group"] == "全部"].groupby(["list", "h"]).apply(agg).reset_index()
groups_tbl = df[df["group"] != "全部"].groupby(["list", "group", "h"]).apply(agg).reset_index() groups_tbl = df[df["group"] != "全部"].groupby(["list", "group", "h"]).apply(agg).reset_index()
regime_tbl = df[df["group"] == "全部"].groupby(["regime_post", "list", "h"]).apply(agg).reset_index() regime_tbl = df[df["group"] == "全部"].groupby(["regime_post", "list", "h"]).apply(agg).reset_index()
@ -275,7 +282,8 @@ def run(since: str, until: str | None, horizons: tuple, start: str, out_dir: str
md = [f"# 候选单复盘 · {days_plan[0]}{stamp}(起点价 {start}", "", md = [f"# 候选单复盘 · {days_plan[0]}{stamp}(起点价 {start}", "",
f"计划日 {len(days_plan)} 期;样本纪律:分组样本少于一百只或覆盖计划日少于二十个只看方向;" f"计划日 {len(days_plan)} 期;样本纪律:分组样本少于一百只或覆盖计划日少于二十个只看方向;"
f"口径切换的总样本少于六十个计划日只写方向。", "", f"口径切换的总样本少于六十个计划日只写方向。", "",
"## 一、六份名单 × 期限(超额=相对全池等权,命中=跑赢全池比例)", "", "## 一、六份名单 × 期限(超额=相对全池等权,命中=跑赢全池比例;"
"不带后缀的列按计划日等权,带 _w 的列按样本加权,后者只用于与方案第一节手工读数对账)", "",
_md(lists_tbl), "", _md(lists_tbl), "",
"## 二、分组读数", "", _md(groups_tbl), "", "## 二、分组读数", "", _md(groups_tbl), "",
"## 三、按事后环境分组(未来 h 日全池涨跌,只作解释,不作交易前置)", "", "## 三、按事后环境分组(未来 h 日全池涨跌,只作解释,不作交易前置)", "",