情绪指标构建方法
情绪指标构建方法(投资者情绪 / 行为金融特征)在机器学习(ML)股票选择模型中,情绪指标(Investor Sentiment Indicators) 是行为金融特征的核心,用于量化投资者心理偏差(如乐观/悲观、羊群效应),作为非线性输入特征(e.g., 与EV/EBITDA、ROIC交互),提升价值+质量+动量框架的预测力。构建方法分为间接法(市场代理变量+主成分分析)、文本法(NLP情感分析,最适合个股高频特征)和直接法(调查,低频补充)。以下是系统化、可操作的方法,优先适用于A股(东方财富股吧+CSMAR数据),直接对接您的ML管道(XGBoost/LightGBM特征池)。1. 间接法(市场代理变量 + PCA/PLS,主成分合成)基于Baker & Wurgler(2006)经典框架:选取多个市场交易/估值代理变量(反映“贪婪/恐慌”),剔除宏观理性成分后,用主成分分析(PCA)提取共同情绪因子。优点:理论稳健、无需文本处理;缺点:低频(月度)、滞后。核心步骤(Python/Stata实现):
选择代理变量(A股适应版,参考浦银国际/中信建投等实务):
常用14个成分(浦银国际2024):A股成交量、换手率、RSI指数、两融余额、陆股通成交总额、IPO募资总额、再融资规模、限售股解禁市值、产业资本增减持、封闭式基金折价率、股债收益差、开放式基金股票持仓比率、涨停股票数量、盈利预期上调占比。
Baker-Wurgler经典6个(全球/中美对比):封闭式基金折价率(CEFD)、换手率(TURN,滞后1期)、IPO数量(NIPO)、IPO首日收益率(RIPO,滞后1期)、股权发行比例(S)、股利溢价(PD-ND)。
剔除宏观影响(正交化):对每个代理变量回归宏观因子(工业生产增长、消费增长、就业增长、NBER衰退哑变量),取残差作为纯情绪代理。
公式:代理_t = α + β·Macro_t + ε_t(ε_t即正交化代理)。
合成指数:
PCA提取第一主成分(解释方差最大),标准化为单位方差。
公式示例(Baker-Wurgler):
SENT_t = -0.241·CEFD_t + 0.242·TURN_{t-1} + 0.253·NIPO_t + 0.257·RIPO_{t-1} + 0.112·S_t - 0.283·PD-ND_{t-1}
(系数来自PCA载荷,各变量先标准化)。A股变体:中信建投/浦银国际用7-14个指标加权平均或PCA,标准化为0-100分(历史百分位法)。
数据来源:CSMAR/Wind(直接有CICSI、ISI预构建指数)或Bloomberg/Wind手动计算。
ML集成:每月更新作为全局特征,与个股价值因子交互(e.g., 低EV/EBITDA × 高情绪)。实际效果:浦银国际指数与上证指数相关性0.75,高/低情绪区间风格轮动显著(低迷期大盘股强)。2. 文本法(NLP + 加权情绪得分,最推荐个股特征)最适合ML高频(日/周)个股情绪,捕捉“原始”心理偏差(东方财富股吧散户主导)。参考Antweiler & Frank(2004)及国内论文(Bi-LSTM/FinBERT)。核心步骤(Python全流程):
数据采集:爬取东方财富股吧评论(标题+正文、阅读量、点赞、评论量、时间)。
工具:requests + BeautifulSoup(每日抓取,避免高频封禁)。
清洗:剔除水贴、重复、官方公告;分词(jieba);停用词过滤。
情感分类(核心:BERT/Bi-LSTM/FinBERT):
模型选择:FinBERT(金融预训练)或BERT-base-Chinese + Bi-LSTM(精度最高,F1>0.80)。
标注训练集:人工标注2000-5000条(正面/负面/中性),8:2划分。
训练:Hugging Face Transformers,epoch=5,lr=2e-5,max_length=128。
输出:每条评论情绪标签(pos=1, neg=-1, neu=0)。
构建情绪指数(常见公式):
简单Bullish指数(Antweiler & Frank):
Sentiment_t = ln( (1 + Pos_t) / (1 + Neg_t) )
(Pos_t = 正面帖数,Neg_t = 负面帖数;>0为看涨)。影响力加权(更优,参考李华&朱荔):
S_t = ln(1 + Σ (w_i · P_i) / Σ (w_i · N_i) )
其中 w_i = ln(Reading_i + 1) / ln(max_Reading + 1)(阅读量加权);P_i/N_i为正面/负面情感值。标准化:Z-score或0-100分,与个股价格/收益率匹配(t-1日情绪预测t日)。
代码示例(简化,接您XGBoost):
python
import pandas as pd
from transformers import pipeline # 或FinBERT
sentiment_pipeline = pipeline("sentiment-analysis", model="ProsusAI/finbert") # 或自定义BERT-BiLSTM
# 假设df_guba有['comment', 'reading', 'pos', 'neg']
df_guba['sentiment_score'] = df_guba.apply(lambda x:
(1 + x['pos'] * x['reading_weight']) / (1 + x['neg'] * x['reading_weight']), axis=1)
df_guba['sentiment_composite'] = np.log(df_guba['sentiment_score']) # 最终特征
# 加入ML: X = df[['ev_ebitda', 'roic', 'mom_12m', 'sentiment_composite']]数据频率:日度(个股/指数吧),样本外验证用walk-forward。实际效果:国盛证券IISI指数(2015-2022)择时年化11.7%,回撤-15.6%;影响力加权优于简单版。3. 直接法(调查,低频补充)
来源:央视看盘指数、好淡指数、投资者信心指数(Wind/CSMAR)。
构建:直接标准化为0-100分,作为市场层面特征验证文本指标。
缺点:月度/季度,主观偏差大,仅辅助。
4. 混合与ML集成最佳实践
推荐组合:间接法(全局,CSMAR预构建)+ 文本法(个股,高频)→ 20-50个特征。
验证:SHAP确认贡献(e.g., 高情绪放大动量效应);walk-forward CV;控制Fama-French因子后alpha显著。
注意事项:
爬虫合规:遵守robots.txt,用API优先。
稳健性:情绪regime敏感(牛市羊群强),定期重训模型。
过拟合防范:理论驱动(行为偏差映射)+ 统计辅助。
工具:Python(pandas, jieba, transformers);平台(QuantConnect/Portfolio123)。
此方法直接将行为金融偏差转化为ML可量化特征,实现“广义价值视角 → 具体股票映射”。东方财富股吧+CSMAR是最性价比组合(间接+文本)。若需具体代码模板(e.g., 完整爬虫+FinBERT+PCA)、某个指数的Excel/Stata构建,或针对美股/全球扩展,我可进一步定制!