diff --git a/deploy/profile-scripts/build_panel_hk.py b/deploy/profile-scripts/build_panel_hk.py index 0b027972..a14f8abe 100644 --- a/deploy/profile-scripts/build_panel_hk.py +++ b/deploy/profile-scripts/build_panel_hk.py @@ -100,6 +100,15 @@ def main(): flow = pd.DataFrame(columns=["code","date","flow1"]) print(f"资金流: {len(flow)} 条", flush=True) + # 市值(当前市值×价格比反推历史,总股本短期不变) + print("加载市值...", flush=True) + conn = sqlite3.connect(DB) + fund_mc = pd.read_sql( + "SELECT code, mcap_total FROM stock_fundamentals WHERE length(code)=5", conn) + conn.close() + fund_mc = fund_mc.dropna() + # 每只股票最近收盘价(面板尾部)作为反推基准——在面板构建后统一计算 + # 构建面板 rows = [] for idx, code in enumerate(codes): @@ -145,12 +154,21 @@ def main(): print(f" 面板 {idx+1}/{len(codes)}", flush=True) panel = pd.concat(rows, ignore_index=True) - for col in ["sec_above","news3","flow5","mcap_q","limit_up"]: + # 市值:当前市值×价格比反推历史(总股本短期不变)+ 每日市值分位 + fund_mc = fund_mc.dropna() + last_px = panel.sort_values("date").groupby("code")["close"].last().rename("last_close") + fm = fund_mc.merge(last_px, on="code", how="inner") + fm = fm[fm["last_close"] > 0] + panel = panel.merge(fm[["code", "mcap_total", "last_close"]], on="code", how="left") + panel = panel[panel["last_close"] > 0] + panel["mcap"] = panel["mcap_total"] * panel["close"] / panel["last_close"] + panel["mcap_q"] = panel.groupby("date")["mcap"].rank(pct=True) + for col in ["sec_above", "news3", "flow5", "limit_up"]: panel[col] = np.nan panel.to_pickle("/tmp/panel_12d_hk.pkl") print(f"\n港股面板v2: {len(panel)} 行 × {len(panel.columns)} 列", flush=True) - print("新增: sec_ret20(行业动量) + pe_q/pb_q(估值分位) + flow1(当日资金流)", flush=True) - print("仍缺: 资金流flow5(港股无历史)/新闻news3/mcap_q/行业above(后续补)", flush=True) + print("新增: sec_ret20(行业动量) + pe_q/pb_q(估值分位) + flow1(资金流) + mcap_q(市值分位)", flush=True) + print("仍缺: flow5(港股无历史)/news3/行业above(后续补)", flush=True) if __name__ == "__main__": main()