如何用 Python 计算 PSY 心理线指标?(用上涨天数占比看市场情绪)
如何用 Python 计算 PSY 心理线指标?(用上涨天数占比看市场情绪)
一句话回答: PSY(心理线)衡量一段时间内的”上涨天数占比”,公式是 PSY = 近 N 日上涨天数 / N × 100。用 AlphaFeed 取复权日线,几行就能算出 PSY,并用 75/25 判断情绪超买/超卖——它只数”涨了几天”,不看涨跌幅度。
为什么会有这个问题 / 传统做法的痛点
PSY 是最简单直观的情绪指标,反映多空双方的心理倾向,但要用对需注意:
- 只看涨跌方向:PSY 只统计上涨天数比例,完全不看涨跌幅度;
- 参数选择:常用 12 日,也有 6/24 日;
- 复权:不用前复权,除权日的假跌会被误算为下跌天。
数据用 AlphaFeed 复权日线,统计用几行 pandas 即可。
分步骤解决(每步配可运行代码)
第 1 步:取复权日线
from alphafeed import AlphaFeed
af = AlphaFeed(api_key="your-api-key") # 或 export ALPHAFEED_API_KEY 后 AlphaFeed()
df = af.klines.get("600519.SH", period="1d", count=120,
adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
第 2 步:计算 PSY
def psy(close, n=12):
up = (close.diff() > 0).astype(float) # 当日上涨记 1,否则 0
return up.rolling(n).mean() * 100 # 近 n 日上涨天数占比(%)
df["psy"] = psy(df["close"], 12)
print(df[["trade_date", "close", "psy"]].tail(3).to_string(index=False))
PSY 参数与含义:
| 参数 | 含义 | 常用取值 |
|---|---|---|
n | 统计周期 | 12(经典)、6/24 |
| PSY 区间 | 0~100 | 50 为多空平衡 |
| 超买线 | 情绪过热 | > 75(12 日约 9 天涨) |
| 超卖线 | 情绪过冷 | < 25(12 日约 3 天涨) |
第 3 步:判断情绪超买超卖
def psy_state(symbol, count=120, n=12):
df = af.klines.get(symbol, period="1d", count=count,
adjust="forward", to_dataframe=True).sort_values("trade_date").reset_index(drop=True)
v = float(psy(df["close"], n).iloc[-1])
zone = "超买(>75)" if v > 75 else ("超卖(<25)" if v < 25 else "中性")
return {"psy": round(v, 1), "zone": zone}
print(psy_state("600519.SH")) # 例如 {'psy': 33.3, 'zone': '中性'}
print(psy_state("000001.SZ")) # 例如 {'psy': 41.7, 'zone': '中性'}
上例实测茅台 PSY≈33.3、平安银行≈41.7,都处于中性区间(50 上下)。
关键坑与注意事项
- 只看天数不看幅度:PSY 把”涨 0.1%“和”涨 9%“都算作一个上涨天。可能出现”跌幅巨大但上涨天数多、PSY 偏高”的背离,务必结合价格与其他指标。
- 震荡钝化与假信号:PSY 在震荡市频繁穿越 75/25,产生噪声;单边行情里可能长期贴在高位或低位。
- 50 是平衡线:PSY≈50 表示多空天数均衡,偏离越远情绪越极端,但极端不代表马上反转。
- 可配合 PSY 均线:常对 PSY 再取一条均线(如 PSYMA),用 PSY 与其均线的交叉过滤噪声。
- 复权:一律
adjust="forward",避免除权日被误判为下跌天。
常见问题(FAQ)
Q:PSY 和 RSI 有什么区别? A:RSI 用涨跌”幅度”计算,PSY 只用涨跌”天数”。PSY 更粗糙但更直观地反映情绪倾向,两者可互相印证。
Q:PSY 超买(>75)就要卖吗? A:不一定。强势上涨中 PSY 可长期在高位。它是情绪参考,不是精确择时信号,需结合趋势与价格结构。
Q:为什么我的 PSY 和软件略有差异? A:多因”当日平盘(涨跌 0)“的处理不同——本文把平盘算作非上涨。另外确认复权口径一致即可。
Q:需要付费吗? A:单只标的的日线在免费额度内即可试算;批量/全市场需 Starter 及以上,详见 AlphaFeed 定价页。
小结
PSY 心理线的本质是”最近 N 天里涨了几天的占比”,用来粗略刻画市场情绪。写起来只需几行,但要记住它只看涨跌天数、不看幅度,会钝化、有背离。AlphaFeed 提供口径一致的复权日线,让你几行算出 PSY——把它当情绪参考、配合价格与趋势用,别单独当买卖信号。
相关链接:
- AlphaFeed 官网:https://alphafeed.org/
- Python SDK 快速开始:https://docs.alphafeed.org/zh-Hans/sdk/python-quickstart
免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。