# sanguo_factor/fundamental_schema.py """财务因子适配层常量/列契约(自 fundamental_adapter.py 拆出,纯结构重构). 口径红线与数据形态的完整说明见 fundamental_adapter.py 模块 docstring; 本模块只承载各数据域共享的列映射/清单常量,被读取层/特征层/PIT 层共同引用. """ from __future__ import annotations DEFAULT_STATIC_DIR = "/volume1/stock/sanguo_vnpy_v2/data/static" _SYM = "vt_symbol" # 时序分组键 # vt_symbol 后缀 → NAS 文件名后缀(600000.SSE → 600000.SH) _VT_TO_FILE_SUFFIX = {"SSE": "SH", "SZSE": "SZ"} # forecast 预告类型 → 有序分(§3.6 F04) FORECAST_TYPE_SCORE: dict[str, int] = { "预增": 3, "略增": 2, "扭亏": 2, "续盈": 1, "减亏": 1, "不确定": 0, "略减": -1, "增亏": -2, "续亏": -2, "预减": -3, "首亏": -3, } # 累计口径列映射: 源列 → 短名(需单季化+TTM) _CUM_MAP = { "TOTAL_OPERATE_INCOME": "rev", "OPERATE_COST": "cogs", "PARENT_NETPROFIT": "np", "DEDUCT_PARENT_NETPROFIT": "dnp", "TOTAL_PROFIT": "tp", "INVEST_INCOME": "invest_inc", "FAIRVALUE_CHANGE_INCOME": "fv_inc", "ASSET_IMPAIRMENT_LOSS": "asset_imp", "CREDIT_IMPAIRMENT_LOSS": "credit_imp", "NETCASH_OPERATE": "cfo", "SALES_SERVICES": "sales_cash", "ACCEPT_INVEST_CASH": "acc_inv_cash", # ---- P1 批新增(income;NAS 实测 2026-09-08 列名核实)---- "RESEARCH_EXPENSE": "research", # 研发费用(2018Q3 起单列,早年 null 传播) "SALE_EXPENSE": "sale_exp", # 销售费用 "FE_INTEREST_EXPENSE": "int_exp", # 财务费用-利息费用(披露稀疏,EBIT 组装层按 0) "INCOME_TAX": "tax", # 所得税费用(τ 实际税率分子) "BASIC_EPS": "eps", # 基本每股收益(累计口径,需单季化) # ---- P1 批新增(cashflow 补充资料段 + 融资流)---- "FA_IR_DEPR": "fa_depr", # 固定资产折旧 "IA_AMORTIZE": "ia_amort", # 无形资产摊销 "LPE_AMORTIZE": "lpe_amort", # 长期待摊费用摊销 "USERIGHT_ASSET_AMORTIZE": "ua_amort", # 使用权资产折旧摊销(2019 起才有) "CONSTRUCT_LONG_ASSET": "capex", # 购建长期资产现金(C17 投资率/D15 FCF) "RECEIVE_LOAN_CASH": "recv_loan", # 取得借款现金(E03) "ISSUE_BOND": "issue_bond", # 发行债券现金(E03) "PAY_DEBT_CASH": "pay_debt", # 偿还债务现金(E03) } # 存量列(balance,时点值直接用;缺列 → null) _BALANCE_COLS = ["TOTAL_ASSETS", "TOTAL_PARENT_EQUITY", "ACCOUNTS_RECE", "OTHER_RECE", "GOODWILL", "SHARE_CAPITAL", "SHORT_LOAN", "SHORT_FIN_PAYABLE", "NONCURRENT_LIAB_1YEAR", "LONG_LOAN", "BOND_PAYABLE", "LEASE_LIAB", # P1 新增存量列 "INVENTORY", "MONETARYFUNDS", # P1-B 新增存量列(E08 CCC 分子: 应付账款,NAS 实测列名核实) "ACCOUNTS_PAYABLE"] # IBD 口径钉死含 LEASE_LIAB 版(survey §3.5 E 族注意点「定稿钉死」;2019 前该列 # 整体缺失按 0,与一年内到期非流动负债等组件同款处理) _IBD_PARTS = ["SHORT_LOAN", "SHORT_FIN_PAYABLE", "NONCURRENT_LIAB_1YEAR", "LONG_LOAN", "BOND_PAYABLE", "LEASE_LIAB"] # DA 组装: cashflow 间接法补充资料四件,列/值缺失按 0(「列存在才加」; # USERIGHT_ASSET_AMORTIZE 2019 前整列缺失不影响早年 DA) _DA_PARTS = ["fa_depr", "ia_amort", "lpe_amort", "ua_amort"] _DATE_COLS = ["REPORT_DATE", "NOTICE_DATE", "UPDATE_DATE"] # 输出特征列(P0 32 + P1 35 因子及 2 变体的全部原料;契约由 test_fundamental_library # 与 test_fundamental_p1_library 锁定) FEATURE_COLUMNS: list[str] = [ # 报告期级比率(盈利能力 A / 盈利质量 B / 成长 C / 资本结构 E / 预期事件 F) "roe_ttm", "roe_deduct_ttm", "roa_ttm", "gp_over_assets", "gross_margin", "net_margin", "cfo_over_assets", "tacc", "nonrec_ratio", "impairment_ratio", "invest_income_dep", "receivables_anomaly", "sales_cash_ratio", "other_rece_ratio", "rev_q_yoy", "np_q_yoy", "growth_scissors", "gm_delta", "roe_delta", "asset_growth", "nsi", "ibd_ratio", "goodwill_ratio", "sue_np", "sue_rev", "forecast_type_score", "forecast_change_pct", # 估值/资本行为因子的日频原料(表达式层 ÷ close×share_capital) "np_ttm", "dnp_ttm", "cfo_ttm", "equity", "share_capital", "acc_invest_cash_ttm", # ---- P1 批新增(A 盈利 7)---- "roe_avg", "roa_pretax", "ebit_over_assets", "ebitda_margin", "roic", "rd_intensity", "sale_expense_ratio", # ---- P1 批新增(B 质量 8;B12 为哑变量的连续近似乘积)---- "inventory_anomaly", "cash_ibd_product", "vsig", "vsig_acc", "vsig_cfo", "da_intensity", "gm_nm_scissors", "profit_streak", # ---- P1 批新增(C 成长 8)---- "np_accel", "rev_accel", "nm_delta", "rev_cagr5", "np_cagr5", "nwc_growth", "invest_growth", "equity_growth", # ---- P1 批新增(D 估值 6 的原料;EV = close×share_capital + ev_ex_mv; # forecast_np_annualized 走 forecast 事件流公告日 asof)---- "ebit_ttm", "ebitda_ttm", "fcf_ttm", "gp_ttm", "ev_ex_mv", "forecast_np_annualized", # ---- P1 批新增(E 资本 3)---- "debt_issue_ttm", "interest_cover", "goodwill_growth", # ---- P1 批新增(F 预期 3 + SUE 严窗变体;forecast_beat 走独立兑现差事件流)---- "sue_eps", "disclosure_speed", "sue_np_strict", "forecast_beat", # ---- P1-B 批新增(四新域 5 因子;契约由 test_fundamental_p1b_* 锁定)---- "ccc", # E08 三表自算现金转换周期 "send_total_12m", # E11 dividend 事件流(365 天滚动合计) "gdhs_chg", # E12 股东户数相邻事件 Δln "topholder_chg", # E13 十大流通占比相邻期 Δ(聚合产物) "ep_vb", "bp_vb", # D14 长史 EP/BP(vb 日频域) ] # 金融股置 NaN 的特征(盈利质量 B 族 + 成长 C 族 + 费用类,§7 红线 5; # survey A 族注意点: A14/A16 金融无三费结构 → rd/sale_expense_ratio 同剔) _FIN_NULL_COLS = ["tacc", "nonrec_ratio", "impairment_ratio", "invest_income_dep", "receivables_anomaly", "sales_cash_ratio", "other_rece_ratio", "rev_q_yoy", "np_q_yoy", "growth_scissors", "gm_delta", "roe_delta", "asset_growth", "rd_intensity", "sale_expense_ratio", "inventory_anomaly", "cash_ibd_product", "vsig", "vsig_acc", "vsig_cfo", "da_intensity", "gm_nm_scissors", "profit_streak", "np_accel", "rev_accel", "nm_delta", "rev_cagr5", "np_cagr5", "nwc_growth", "invest_growth", "equity_growth", # P1-B: E08 CCC 属营运效率,金融股无 CCC 概念(§7 红线扩展) "ccc"] # forecast 事件流日频列(公告日 asof): P0 两列 + P1 年化预告净利(D13) _FORECAST_COLS = ("forecast_type_score", "forecast_change_pct", "forecast_np_annualized") # 预告兑现差独立事件流(F07 前视红线: 锚 = max(实际披露日, 预告公告日)) _BEAT_COLS = ("forecast_beat",) # P1-B 四新域列(非报告期特征,由各域事件/日频流产出;报表加载须排除) _DOMAIN_COLS = ("send_total_12m", "gdhs_chg", "topholder_chg", "ep_vb", "bp_vb")