129 lines
7.3 KiB
Python
129 lines
7.3 KiB
Python
# 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")
|