← Back to skills
extension
Category: Data & AnalyticsAPI key required

「逆反因子」——行为偏差驱动的量化择时引擎

逆反因子 —— 行为金融学驱动的 A 股量化择时工具。基于前景理论(损失厌恶)、处置效应、过度自信、市场注意力与行为资产定价模型(BAPM)构建 5 类行为因子,当多因子同时触及历史极端阈值时生成带强度评分与置信度的反向交易信号;内置 walk-forward 样本外验证、过拟合诊断(PSR/DSR/WFE)、SHAP 因子贡献拆解与 PDF 归因报告。当用户提到"逆反因子""行为金融择时""情绪极致""处置效应""过度自信""注意力集中度""行为因子回测"或要求做情绪驱动的择时/择股分析时使用。

personAuthor: user_cb663282hubcommunity

逆反因子 · Contrarian Factor

⚠️ 免责声明:本工具输出的所有信号、评分、回测与归因结果仅供参考,不构成任何投资建议、要约或承诺。市场有风险,投资须谨慎。历史回测结果不代表未来收益,任何策略均存在失效与亏损的可能。 该声明必须在每一次输出的开头或结尾原样呈现,PDF 报告首页亦须完整印出。

这是什么

一套行为金融学驱动的量化择时系统。核心假设是:当投资者的行为偏差被推到历史极端时,资产价格已偏离基本面,均值回归的力量占优 —— 因此逆着人群的极端行为下注。

工具链完整覆盖:数据采集 → 行为因子计算 → 信号生成 → walk-forward 回测 → SHAP 可解释性 → PDF 归因报告。


一、理论内核(执行任务前必须内化的数学表达)

以下公式是全部模块的设计依据。写代码、调参数、解释结果时都要能对应回这里。

1. 前景理论价值函数(Kahneman & Tversky 1979;Tversky & Kahneman 1992)

$$v(x)=\begin{cases} x^{\alpha}, & x \ge 0 \ -\lambda(-x)^{\beta}, & x < 0 \end{cases}$$

标定参数: $\alpha=\beta=0.88,\ \lambda=2.25$(损失厌恶系数)。 $\lambda>1$ 即损失厌恶:等额损失带来的负效用是等额收益正效用的 2.25 倍。 函数在原点处斜率不连续($\lambda>1$ 导致左导数更陡),这正是处置效应的数学根源。

2. 概率权重函数(Tversky & Kahneman 1992)

$$w^{+}(p)=\frac{p^{\gamma}}{\left(p^{\gamma}+(1-p)^{\gamma}\right)^{1/\gamma}},\quad \gamma=0.61$$ $$w^{-}(p)=\frac{p^{\delta}}{\left(p^{\delta}+(1-p)^{\delta}\right)^{1/\delta}},\quad \delta=0.69$$

投资者高估小概率、低估中大概率,形成"彩票偏好"与"尾部恐慌"。

3. 前景理论加权情绪(PT-Sentiment,本工具第 4 因子)

$$U_t=\sum_{k} w^{+}!\left(p_k\right)v(x_k)\cdot\mathbb{1}{x_k\ge0};+;\sum{k} w^{-}!\left(p_k\right)v(x_k)\cdot\mathbb{1}_{x_k<0}$$

$x_k$ 为滚动窗口 $W$ 内的日收益分桶取值,$p_k$ 为经验频率。$U_t$ 极高 = 主观估值被推高 = 逆反看空。

4. 处置效应(Shefrin & Statman 1985;Odean 1998)

账户级(有持仓明细时): $$PGR=\frac{RG}{RG+PG},\qquad PLR=\frac{RL}{RL+PL},\qquad DE=PGR-PLR$$ $RG/RL$ = 已实现的盈利/亏损次数,$PG/PL$ = 账面浮盈/浮亏持仓次数。$DE>0$ 即处置效应。

市场级代理(默认路径,仅需行情数据):处置效应导致上涨日成交量系统性放大: $$DEC_t = z_{W_q}!\left[\ \ln\frac{\overline{Vol}\mid_{r>0}}{\overline{Vol}\mid_{r<0}}\ \right]_{W_s}$$

5. 过度自信(Odean 1998;Gervais & Odean 2001;Daniel et al. 1998)

过度自信 → 过度交易 + 自归因偏差(把盈利归功于自己)→ 换手率与波动率同步异常放大: $$Turnover_t = a + b\cdot CumRet_{t-k,,t-1} + \varepsilon_t$$ $$OCI_t = z_{W_q}!\Big[,0.4,z!\big(\ln\frac{T_t}{MA_k(T_t)}\big) + 0.3,z!\left(\hat b_t\right) + 0.3,z!\big(\ln\frac{RV_t}{MA_k(RV_t)}\big)\Big]$$

6. 注意力驱动的价格压力(Barber & Odean 2008;Da, Engelberg & Gao 2011)

横截面赫芬达尔指数(HHI)衡量资金注意力的聚焦程度: $$s_{i,t}=\frac{Amount_{i,t}}{\sum_j Amount_{j,t}},\qquad HHI_t=\sum_i s_{i,t}^{2},\qquad ACO_t=z_{W_q}!\left(\ln HHI_t\right)$$ 时序代理(单标的):$ACO_t=z_{W_q}\big[0.5,z(\ln AT)+0.3,z(|r_t|/\sigma_t)+0.2,z(Search_t)\big]$

注意力是稀缺资源:被高度关注 → 短期价格上冲 → 后续收益更低("All That Glitters"效应)。

7. 行为资产定价模型 BAPM(Shefrin & Statman 1994)

噪声交易者(NT)与信息交易者(IT)共存,均衡价格由行为市场组合决定: $$E(R_i)-R_f=\beta_i^{C}\big[E(R_M^{C})-R_f\big]+\varepsilon_i$$ 投资者情绪(Baker & Wurgler 2006 思路)构成系统性定价因子,本工具以第一主成分构造: $$Sent_t = PC_1!\left[\ \ln AT_t,\ DEC_t,\ OCI_t,\ ACO_t,\ NHNL_t,\ LmtUp_t\ \right]$$

8. 信号合成(逆反逻辑)

各因子取滚动分位数 $\rho_{f,t}\in[0,100]$,极端度 $e_{f,t}=(\rho_{f,t}-50)/50\in[-1,1]$,逆反方向化 $d_{f,t}=-e_{f,t}$:

$$S_t=\frac{\sum_f w_f, d_{f,t}}{\sum_f w_f}\in[-1,1],\qquad n^{ext}t=#{f:\rho{f,t}\ge\theta_{hi}\ \text{或}\ \rho_{f,t}\le\theta_{lo}}$$

$$Strength_t=|S_t|\cdot\big(0.5+0.5,A_t\big)\cdot\mathbb{1}[n^{ext}t\ge 2],\quad A_t=\frac{|\sum_f w_f,\mathrm{sign}(d{f,t})|}{\sum_f w_f}$$

$$\text{Signal}_t=\begin{cases} 买入, & S_t\ge\kappa\ \wedge\ n^{ext}t\ge2 \ 卖出, & S_t\le-\kappa\ \wedge\ n^{ext}t\ge2 \ 持有, & \text{其它} \end{cases}\qquad \kappa=0.35,\ \theta{hi}=90,\ \theta{lo}=10$$

$$Confidence_t=\sigma!\Big(0.5,\hat A_t+0.3,\widehat{Str}_t+0.2,\widehat{HR}_t^{oos}\Big)$$

$\widehat{HR}^{oos}$ 为样本外滚动命中率 —— 绝不允许用全样本信息回填。


二、目录结构

~/.workbuddy/skills/contrarian-factor/
├── SKILL.md                      # 本文件(理论内核 + 工作流)
├── requirements.txt
├── references/
│   ├── theory-framework.md       # 理论详解、参数标定依据、文献索引
│   ├── factor-formulas.md        # 因子计算规格书(字段 / 公式 / 边界处理)
│   ├── backtest-guide.md         # walk-forward 协议 + 过拟合诊断口径
│   ├── data-sources.md           # akshare / tushare / CSV / 情绪 API 接入
│   └── output-spec.md            # 输出模板(终端版 + JSON + PDF)
├── scripts/
│   ├── cf_common.py              # 常量、免责声明、IO、日志、工具函数
│   ├── cf_data.py                # 数据采集与标准化
│   ├── cf_factors.py             # 5 类行为因子计算
│   ├── cf_signal.py              # 信号生成 + 强度/置信度
│   ├── cf_backtest.py            # walk-forward 回测 + 过拟合诊断
│   ├── cf_explain.py             # SHAP / LOCO 因子贡献拆解
│   ├── cf_report.py              # PDF 归因报告(reportlab)
│   └── run_analysis.py           # 一键流水线入口
├── templates/
│   └── report_template.html      # 可选 HTML 报告模板
└── examples/
    └── make_sample_data.py       # 生成合成行情样本(自测 / 演示)

三、工作流

Step 0 · 环境与免责

PY="C:/Users/admin/.workbuddy/binaries/python/envs/default/Scripts/python.exe"
"$PY" -m pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r \
  "C:/Users/admin/.workbuddy/skills/contrarian-factor/requirements.txt"

首次回复用户时先输出免责声明,再进入分析。

Step 1 · 数据采集(cf_data.py)

三条数据通路,任选其一或组合:

| 通路 | 说明 | 命令范式 | |---|---|---| | akshare | 免费,A 股指数/个股/行业资金流 | --source akshare --symbol 000300 --start 2010-01-01 | | tushare | 需 TUSHARE_TOKEN,数据更全 | --source tushare --symbol 000300.SH --token xxxx | | CSV | 用户自定义数据,需含 date/open/high/low/close/volume | --source csv --csv path/to/data.csv | | 情绪 API | 第三方搜索指数/社交热度,作为注意力代理外挂 | --sentiment-csv path.csv |

标准字段:date, open, high, low, close, volume, amount, turnover_rate, pct_chg 可选外挂:search_index(搜索指数)、news_count(新闻量)、sentiment(情绪得分)

数据卫生:自动剔除停牌(volume=0)、复权缺失、极端跳空(|r|>50% 且无分红送股标记)记录;缺失率 >5% 的字段直接停用对应因子而不是填 0。

Step 2 · 因子计算(cf_factors.py)

输出 5 个因子,默认参数:

| 因子 | 代号 | 短窗口 $W_s$ | 分位窗口 $W_q$ | 逆反方向 | |---|---|---|---|---| | 处置效应系数 | DEC | 60 | 750 | 高→看空 | | 过度自信指数 | OCI | 20/120 | 750 | 高→看空 | | 注意力集中度 | ACO | 20 | 750 | 高→看空 | | 前景理论情绪 | PTU | 60 | 750 | 高→看空 | | BAPM 情绪溢价 | SENT | 60 | 750 | 高→看空 |

无 turnover_rate 时用 volume/流通股本 代理;无横截面数据时 ACO 自动降级为时序代理。降级必须在输出中显式标注。

Step 3 · 信号生成(cf_signal.py)

输出每因子:当前值 / 历史分位数 / z-score / 方向 / 是否极端 + 合成信号 + 强度 + 置信度 + 一致度。

Step 4 · Walk-Forward 回测(cf_backtest.py)

"$PY" scripts/run_analysis.py --source csv --csv examples/sample_index.csv \
  --mode single --walk-forward --train-window 750 --test-window 60 --horizon 20
  • 滚动训练/测试切分,测试集永远在训练集之后(无前视偏差)
  • 每折在训练集上网格寻优,参数锁定后用于测试集
  • 指标:CAGR / Sharpe / Sortino / MaxDD / Calmar / 胜率 / 盈亏比 / 换手 / IC / IR
  • 过拟合诊断:PSR、DSR(含试验次数修正)、WFE(样本外/样本内 Sharpe 比)、参数高原敏感性
  • 输出必须标注:数据区间、样本容量、训练/测试折数、过拟合风险等级(低/中/高/极高)

Step 5 · SHAP 可解释性(cf_explain.py)

  • 代理模型预测 $r_{t\to t+H}$,TreeExplainer(lightgbm / sklearn GBDT)优先;无 SHAP 时回退 LOCO 置换贡献
  • SHAP 值只在样本外折上计算
  • 输出:全局 mean|SHAP| 排名 + 单期贡献分解(正向/负向)+ 依赖方向

Step 6 · 报告(cf_report.py)

生成 PDF:封面免责 → 因子快照表 → 信号卡 → 贡献分解图 → 净值曲线/回撤 → 回测指标表 → 过拟合诊断 → 风险提示。 同时输出 analysis_result.json 供下游复用。


四、标准输出规范(每次分析必答五件事)

  1. 行为因子当前值 + 历史分位数
| 因子 | 当前值 | z-score | 历史分位 | 方向 | 极端? |
|------|--------|---------|----------|------|-------|
| DEC  处置效应 | 0.42 | +2.13 | 96.8% | 看空 | ⚠️ 极端 |
| OCI  过度自信 | -0.15 | -0.31 | 38.2% | 中性 | — |
| ACO  注意力   | 1.08 | +1.94 | 93.5% | 看空 | ⚠️ 极端 |
| PTU  前景情绪 | 0.21 | +0.88 | 71.4% | 偏空 | — |
| SENT BAPM情绪 | 0.66 | +1.52 | 88.0% | 偏空 | — |
  1. 信号 + 强度 + 置信度:卖出 | 强度 0.72 | 置信度 0.68 | 共振因子数 2/5
  2. 因子贡献拆解:SHAP 值排序表 + 方向说明
  3. 回测摘要:数据区间 + 样本外指标 + 过拟合风险等级
  4. 免责声明(原样)

五、硬性约束

  1. 免责声明不可省略、不可弱化、不可改写。任何回测/信号输出都必须携带。
  2. 回测必须标注数据区间与过拟合风险。缺一不可。
  3. 禁止前视偏差:分位数、z-score、参数寻优、SHAP 一律只用时点之前的信息。所有滚动统计默认 min_periods ≥ 0.6×window。
  4. 禁止承诺收益。不用"必然""保证""稳赚"等措辞。
  5. 数据不足时拒绝出信号:有效样本 < 250 个交易日时,只输出因子观测,不输出信号,并提示"样本不足,结论不稳健"。
  6. 因子降级必须声明:任何用代理变量替代理想变量的情况都要在输出中标注 [降级]。
  7. 不代客理财:不提供具体仓位金额、杠杆建议、买卖点位报价。

六、常见故障

| 现象 | 原因 | 处理 | |---|---|---| | ModuleNotFoundError: akshare | 未装可选依赖 | 换 --source csv,或 pip install akshare | | tushare 报 抱歉,您没有访问该接口的权限 | token 积分不足 | 改用 akshare 或 CSV | | PDF 中文乱码 | 未注册 CID 字体 | 脚本已内置 STSong-Light 注册,勿删 | | 回测 Sharpe > 4 | 大概率过拟合或换手成本未计 | 检查 --cost-bp,看 DSR/WFE 指标 | | SHAP 报 Additivity check failed | 模型/数据不匹配 | 脚本自动回退 LOCO,属正常降级 |

七、参考文献

[1] Kahneman D., Tversky A. (1979) Prospect Theory. Econometrica 47(2). [2] Tversky A., Kahneman D. (1992) Advances in Prospect Theory. JRU 5(4). [3] Shefrin H., Statman M. (1985) The Disposition to Sell Winners Too Early. JF 40(3). [4] Odean T. (1998) Are Investors Reluctant to Realize Their Losses? JF 53(5). [5] Odean T. (1998) Volume, Volatility, Price, and Profit. JF 53(6). [6] Gervais S., Odean T. (2001) Learning to Be Overconfident. REFE 14(1). [7] Daniel K., Hirshleifer D., Subrahmanyam A. (1998) Investor Psychology. JF 53(6). [8] Barber B., Odean T. (2008) All That Glitters. RFS 21(4). [9] Da Z., Engelberg J., Gao P. (2011) In Search of Attention. JF 66(5). [10] Shefrin H., Statman M. (1994) Behavioral Capital Asset Pricing Theory. JFE 35(3). [11] Baker M., Wurgler J. (2006) Investor Sentiment and the Cross-Section. JF 61(4). [12] Bailey D., López de Prado M. (2012) The Sharpe Ratio Efficient Frontier. JRI 5(3). [13] Lundberg S., Lee S.I. (2017) A Unified Approach to Interpreting Model Predictions. NeurIPS. [14] Pardo R. (2008) The Evaluation and Optimization of Trading Strategies. Wiley.

详细推导与参数标定见 references/theory-framework.md。