AlphaFeed Blog

如何用 Python 计算 PSY 心理线指标?(用上涨天数占比看市场情绪)

分析与指标 · 代码验证于 2026-09-19

如何用 Python 计算 PSY 心理线指标?(用上涨天数占比看市场情绪)

一句话回答: PSY(心理线)衡量一段时间内的”上涨天数占比”,公式是 PSY = 近 N 日上涨天数 / N × 100。用 AlphaFeed 取复权日线,几行就能算出 PSY,并用 75/25 判断情绪超买/超卖——它只数”涨了几天”,不看涨跌幅度。

为什么会有这个问题 / 传统做法的痛点

PSY 是最简单直观的情绪指标,反映多空双方的心理倾向,但要用对需注意:

数据用 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~10050 为多空平衡
超买线情绪过热> 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 上下)。

关键坑与注意事项

常见问题(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——把它当情绪参考、配合价格与趋势用,别单独当买卖信号。

相关链接:


免责声明:本文仅为技术与数据接口使用示例,代码与策略仅供学习研究,不构成投资建议。市场有风险,历史数据不代表未来表现。