|
|
一、什么是心理线(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 是否支持,降低噪声。
|
|