一句话回答: PSY(心理线)衡量一段时间内的"上涨天数占比",公式是 PSY = 近 N 日上涨天数 / N × 100。用 AlphaFeed 取复权日线,几行就能算出 PSY,并用 75/25 判断情绪超买/超卖——它只数"涨了几天",不看涨跌幅度。
PSY 是最简单直观的情绪指标,反映多空双方的心理倾向,但要用对需注意:
数据用 AlphaFeed 复权日线,统计用几行 pandas 即可。
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)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 参数与含义:
参数 | 含义 | 常用取值 |
|---|---|---|
| 统计周期 | 12(经典)、6/24 |
PSY 区间 | 0~100 | 50 为多空平衡 |
超买线 | 情绪过热 |
|
超卖线 | 情绪过冷 | < 25(12 日约 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 上下)。
adjust="forward",避免除权日被误判为下跌天。Q:PSY 和 RSI 有什么区别?
A:RSI 用涨跌"幅度"计算,PSY 只用涨跌"天数"。PSY 更粗糙但更直观地反映情绪倾向,两者可互相印证。
Q:PSY 超买(>75)就要卖吗?
A:不一定。强势上涨中 PSY 可长期在高位。它是情绪参考,不是精确择时信号,需结合趋势与价格结构。
Q:为什么我的 PSY 和软件略有差异?
A:多因"当日平盘(涨跌 0)"的处理不同——本文把平盘算作非上涨。另外确认复权口径一致即可。
Q:需要付费吗?
A:单只标的的日线在免费额度内即可试算;批量/全市场需 Starter 及以上,详见 AlphaFeed 定价页。
PSY 心理线的本质是"最近 N 天里涨了几天的占比",用来粗略刻画市场情绪。写起来只需几行,但要记住它只看涨跌天数、不看幅度,会钝化、有背离。AlphaFeed 提供口径一致的复权日线,让你几行算出 PSY——把它当情绪参考、配合价格与趋势用,别单独当买卖信号。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。