主观多头行业/风格归因
把一只主观多头基金的净值收益,用申万风格指数(+可选的港股指数)的周度收益做带约束滚动回归,得到基金各板块"权重"随时间变化的曲线。用于理解一只基金实际暴露在哪些行业/风格上,以及持仓风格是否漂移。
一、第一步:先确认港股暴露(必做)
开始归因前,必须先用自然语言向用户确认该基金是否持有港股,再据此决定因子集:
-
问用户:"这只基金是否持有港股(可投港股通/沪港深)?"
- 有港股 → 继续问:"港股部分用什么风格代理——恒生科技 还是 恒生指数?"
- 选
恒生科技:因子集 = 6 个 A股申万风格 + 恒生科技(HSTECH.HI) - 选
恒生指数:因子集 = 6 个 A股申万风格 + 恒生指数(HSI.HI)
- 选
- 无港股 → 只用 6 个 A股申万风格指数,不加港股项。
- 有港股 → 继续问:"港股部分用什么风格代理——恒生科技 还是 恒生指数?"
-
根据回答调用
build_factor_set(hk_style)生成因子集:from sector_attribution import build_factor_set factor = build_factor_set(None) # 无港股 factor = build_factor_set("恒生科技") # 港股-恒生科技 factor = build_factor_set("恒生指数") # 港股-恒生指数CLI 对应
--hk-style:--hk-style 恒生科技/--hk-style 恒生指数,无港股则不传。
二、运行
准备基金净值数据
xls / xlsx / csv 均可,需含日期列和单位净值列,脚本自动识别。
CLI 运行
# 无港股
python sector_attribution.py "净值.csv" --start 2023-01-01 --end 2026-03-06 --window 12 --out ./out
# 有港股-恒生科技
python sector_attribution.py "净值.csv" --hk-style 恒生科技 --start 2023-01-01 --end 2026-03-06 --window 12 --out ./out
或 Python 直接调用:
from sector_attribution import run_attribution
run_attribution("净值.csv", hk_style="恒生科技", start_date="2023-01-01",
end_date="2026-03-06", window=12, out_dir="./out")
输出
<基金名>_归因权重.csv:各风格权重 + "其他"(未解释/现金)的时序<基金名>_归因权重.png:堆叠面积图
三、因子集说明
A股基础六类(恒有)
| 维度 | 代码 | 说明 | |------|------|------| | 周期 | 801271.SI | 申万大类风格-周期 | | 制造 | 801272.SI | 申万大类风格-先进制造 | | 消费 | 801273.SI | 申万大类风格-消费 | | 生物医药 | 801274.SI | 申万大类风格-医药医疗 | | 科技(TMT) | 801275.SI | 申万大类风格-TMT | | 金融地产 | 801276.SI | 申万大类风格-金融地产 |
可选港股(按用户确认二选一)
| 维度 | 代码 | 说明 | |------|------|------| | 恒生科技 | HSTECH.HI | 港股科技风格代理 | | 恒生指数 | HSI.HI | 港股整体风格代理 |
自定义指数:
from sector_attribution import run_attribution, build_factor_set
indexes = {**build_factor_set("恒生科技"), "农林牧渔": "801010.SI"}
run_attribution("nav.xlsx", indexes=indexes)
四、方法说明
回归约束
每个滚动窗口内,解带约束最小二乘:
min Σ (y_t − Σ w_i·x_{i,t})²
约束: w_i ≥ 0, Σ w_i ≤ 1
其他 = 1 − Σw_i 反映现金/未解释/指数外暴露。
参数
window:滚动窗口(默认 12 周)。越大越平滑,越小越敏感。hk_style:"恒生科技"/"恒生指数"/None(无港股)。- 数据点不足
window+1会报错,需要更长净值序列。
五、数据源
- 优先 WindPy(需登录 Wind 终端);否则自动回退 Wind AIFin CLI(token 模式),需设置
WIND_API_KEY。 - 若换成 tushare/akshare 等,仅需替换
get_wind_index_data与load_fund_nav的数据获取层。
六、注意事项
- 归因结果是"风格暴露"意义上的近似,不是真实持仓。
- 净值含分红/拆分时用"累计净值"或复权净值,避免收益失真。
- 不同窗口与指数组合结果不同,建议多组参数交叉验证风格是否稳定。
微信扫一扫