在前面的文章中讲了量化环境和MACD计算,本文讲KDJ。对于股票技术指数,个人认为KDJ、MACD、RSI足够了,这些技术指标的核心是均线的变种计算。
直接上KDJ代码,Python版本:
#n:KDJ指标的周期,通常设置为9
#m1:D值的平滑周期,通常设置为3
#m2:J值的平滑周期
def st_kdj(code,n = 9 ,m1 = 3 ,m2 = 3):
#将股票行情转换为DataFrame
data = clh2df(code)
# 计算 N 周期内的最低价 LLV 和最高价 HHV
Low_n = data['Low'].rolling(n, min_periods=1).min()
Hign_n = data['High'].rolling(n, min_periods=1).max()
RSV = (data['Close'] - Low_n) / (Hign_n - Low_n) * 100
#K值,使用指数加权移动平均 (EWMA)
K = RSV.ewm(alpha=1/m1, adjust=False).mean()
#D值,使用指数加权移动平均 (EWMA)
D = K.ewm(alpha=1/m2, adjust=False).mean()
J = 3 * K - 2 * D
# 将计算出的 K, D, 和 J 值添加到 DataFrame
data['K'] = K;data['D'] = D;data['J'] = J
print(data[['Turn','Close', 'K', 'D', 'J']])
return data[-100:]
量化计算的输入数据类型是DataFrame,在线接口的行情一般是DataFrame。因为我是调用本地行情,先将列表转换为DF。
#股票close,low,high转为DataFrame
#close_vol=3表示收盘价,6表示成交量
#体验链接:http://101.35.10.13/q
def clh2df(code,close_vol = 3):
#日期,股票代码,名称,收盘价,涨跌幅,换手率,成交量,成交金额,最低价,最高价,开盘价,前收盘
info = getOneStockInfo(code)
info.reverse()
high = [i[9] for i in info]
low = [i[8] for i in info]
close = [i[close_vol] for i in info]
turn = [i[5] for i in info]
dates = [i[0] for i in info]
data_dict = {
'High': high,
'Low': low,
'Close': close,
'Turn':turn
}
df = pd.DataFrame(data_dict)
df['Date'] = pd.to_datetime(dates) # 将日期列表转换为datetime类型,并添加为新列
df.set_index('Date', inplace=True) # 将日期列设置为DataFrame的索引
return df
结果,以下是中国联通的KDJ数据和股票软件上的对比:
每日KDJ数据跟股票软件上略有差异,但趋势一样,近期11月7日KDJ最大,11月12日最小。这是可接受的,不追求数值跟股票软件一样,最重要的是趋势。
下一篇讲RSI。