Files
sanguo_vnpy_v2/sanguo_factor/fundamental_schema.py
T
2026-09-10 07:18:28 +08:00

129 lines
7.3 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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")