找回密码
 立即注册
搜索
查看: 115|回复: 0

心理线指标PSY

[复制链接]

85

主题

0

回帖

487

积分

管理员

积分
487
发表于 2025-10-12 11:16:09 | 显示全部楼层 |阅读模式
一、什么是心理线(PSY)指标
PSY指标的核心思想根植于群体心理学。它假设当市场上绝大多数投资者都对后市看涨时,市场可能接近顶部(超买);反之,当绝大多数投资者都看跌时,市场可能接近底部(超卖)。该指标将这种市场情绪量化,其数值反映了在过去一个特定周期内,多方力量(即股价上涨)的强度 。
PSY指标的数值范围在0到100之间 。通常认为,当PSY值高于75时,市场可能进入超买区域,表示近期上涨天数过多,投资者情绪高涨,后续可能出现回调。当PSY值低于25时,市场可能进入超卖区域,表示近期下跌天数过多,投资者情绪悲观,后续可能出现反弹。

二、PSY标准计算公式
心理线指标的计算方法特别直观:
1.设定一个周期 N(常见取值是 12 或 20)。
2.统计这段时间内 上涨天数。
3.用上涨天数除以周期天数,乘以 100,就是 PSY。
公式如下:PSY(N)=N日内上涨天数*100/N
比如:
如果 12 天里有 9 天是上涨的,那么 PSY = 9/12 × 100 = 75。
如果只有 3 天上涨,那 PSY = 25。

周期 N 的选择
参数 N 的设定,直接决定了 PSY 指标的灵敏度与稳定性。关于 N 的取值,其实并没有一个放之四海而皆准的“标准答案”。
1.常见取值: 12 日是最常见的默认周期;此外,13 日、24 日、26 日等也经常被使用。
2.参数的可变性: N 的大小可以根据不同的股票特性、市场环境以及交易策略(短线、中线或长线)灵活调整:
较小的 N(如 5 或 7):对近期价格波动更敏感,能产生更多的交易信号,但也更容易受到噪音干扰。
较大的 N(如 24 或 30):曲线更平滑,能更好地反映长期市场情绪,信号更稳定,但可能存在一定滞后。

三、用Python实现PSY 指标计算
使用xtquant获取特定股票(例如,贵州茅台)在一段时期内的历史前复权行情数据。返回值为一个pandas DataFrame对象。
from xtquant import xtdata
import pandas as pd

def get_hq(code,start_time,end_time):
    '''
    基于xtquant下载股票的历史行情
    '''
    xtdata.enable_hello = False
    xtdata.download_history_data2(stock_list=[code],
                                  period='1d',
                                  start_time=start_time,
                                  end_time=end_time)
    history_data =xtdata.get_market_data_ex(['open','high','low','close','volume','amount','preClose'],
                                            stock_list= [code],
                                             period='1d',
                                             start_time= start_time,
                                             end_time=end_time,
                                             dividend_type='front_ratio',
                                             fill_data=False)
    df = history_data[code]
    df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
    return df

df = get_hq('600519.SH','20250101','20250923')
print(df)

计算PSY
我们直接用 pandas 来实现,传入Dataframe格式数据,返回值增加PSY列,逻辑非常简洁:
def calculate_psy(data, N=12):
    """
    计算心理线(PSY)指标。
   
    参数:
    data (pandas.DataFrame): 必须包含 'close' 列的DataFrame
    N (int): 计算PSY的周期N,默认为12
   
    返回:
    Dataframe格式,在原有数据增加SPY列
    """
    data = data.copy()
    # 计算每天涨跌情况(上涨记为1,否则0)
    data['up'] = (data['close'] > data['close'].shift(1)).astype(int)
    # 计算PSY指标
    data['PSY'] = data['up'].rolling(N).sum() / N * 100
    return data

# 调用示例代码
df = get_hq('600519.SH','20250101','20250923')
calculate_psy(df,12)

代码解释:
up 列:判断今天是否上涨。
rolling(N).sum():统计过去 N 天的上涨天数。
除以 N 再乘以 100,就是心理线指标。

可视化看看效果
我们画个图直观感受一下:
def draw_PSY(df):
    import matplotlib.pyplot as plt
    import mplfinance as mpf
    # 这里定义PSY指标作为附图
    apds = [
        mpf.make_addplot(df['PSY'], panel=1, color='orange', ylabel='PSY'),
        mpf.make_addplot([75]*len(df), panel=1, color='red', linestyle='--'),   # 上限线
        mpf.make_addplot([25]*len(df), panel=1, color='green', linestyle='--')  # 下限线
    ]
    # ====== 主图:蜡烛+均线 ======
    plt.rcParams['font.sans-serif'] = ['SimHei']   # 黑体,支持中文
    plt.rcParams['axes.unicode_minus'] = False     # 解决负号显示问题
    mc = mpf.make_marketcolors(
        up='red',       # 上涨 K线红色
        down='green',   # 下跌 K线绿色
        edge='inherit',
        wick='inherit',
        volume='inherit',
    )
    s = mpf.make_mpf_style(
        base_mpf_style='yahoo',
        marketcolors=mc,
        rc={'font.family': 'SimHei'}  # 确保 mplfinance 内部也能用中文
    )
    mpf.plot(df,
            type='candle',
            mav=(5, 10, 20),
            volume=False,
            addplot=apds,
            style=s,
            title="股票心理线",
            figsize=(12, 8),
            panel_ratios=(3,1))  # 主图与子图比例

df = get_hq('600519.SH','20250101','20250923')
df = calculate_psy(df,12)
draw_PSY(df)

四、实战应用
1.不要把 PSY 单独当作入场唯一条件:推荐把 PSY 当作 “市场情绪过滤器” —— 例如当 PSY 很高(>65)时优先考虑顺势、当很低(<35)时谨慎或偏向做空/择机接盘。
2.结合价量结构:在 PSY 给出买入倾向时,同时检查:突破前高、成交量放大(用量价背离过滤虚假信号)。
3.多周期确认:短期 PSY 给信号时,看中期(例如 24、48)PSY 是否支持,降低噪声。


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

SKYPIEA

GMT+8, 2026-1-9 16:49 , Processed in 0.040295 second(s), 19 queries .

快速回复 返回顶部 返回列表