R语言量化:KDJ指标的计算

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40628687/article/details/79426751

  KDJ指标,中文名随机指标,由乔治·莱恩(GeorgeLane)创立,是目前期货和股票市场上常用的技术分析指标。KDJ指标在设计过程中主要是研究最高价、最低价和收盘价之间的关系,体现市场情绪,可以用来测度超买或超卖现象,被广泛应用于中短期趋势分析中。

  一般说来,K线超过90意味着超买,K线低于10意味着超卖;D线超过80意味着超买,D线低于20意味着超卖;K线在低位上穿D线为“金叉”是买入信号,K线在高位下穿D线为“死叉”是卖出信号。由此可见KDJ是非常简单实用的技术指标。但是在R语言常用的几个量化包(如quantmod包、PerformanceAnalytics包和TTR包)中都没有用于计算KDJ指标的函数。本文根据KDJ的定义总结了一下KDJ的计算方法。

  计算KDJ首先要计算周期的RSV值,即未成熟随机指标值,然后再依次计算K值、D值及J值。以KDJ日线数据的计算为例,其计算公式为:


  

  以下附上R语言代码:

library(rvest)
library(TTR)
library(xts)
library(WindR)
## 启动WindR
w.start()

## 下载数据
code <- '600030.SH' #代码
fields <- 'open,high,low,close,volume,adjfactor' # 数据变量名
datestart <- '2003-01-06' # 起始时间
w_wsd_data <- w.wsd(codes = code, fields = fields, startdate = datestart)

## 去掉股票停牌期间的数据
data_temp <- w_wsd_data$Data[which(w_wsd_data$Data$VOLUME > 0), ]

## 股票价格向后复权
data_temp$OPEN  <- data_temp$OPEN  * data_temp$ADJFACTOR  # 开盘价
data_temp$HIGH  <- data_temp$HIGH  * data_temp$ADJFACTOR  # 最高价
data_temp$LOW   <- data_temp$LOW   * data_temp$ADJFACTOR  # 最低价
data_temp$CLOSE <- data_temp$CLOSE * data_temp$ADJFACTOR  # 收盘价

## 将数据转化为xts格式
stock_use <- xts(data_temp[, 2:7], order.by = as.Date(data_temp[, 1]))

## 数据表KDJ用来存放最终的数据
l_temp <- nrow(stock_use)         # 数据长度
KDJ <- matrix(NA, l_temp, 3)      # 构建存放数据的矩阵
KDJ <- as.data.frame(KDJ)         # 转换为data.frame
colnames(KDJ) <- c('K', 'D', 'J') # 1-3列的名称分别命名为K、D、J
KDJ[1:8, ]  <- 50                 # 前8天的K、D、J均设为50

## 计算rvs
# 计算9日内最高价
high_9 <- lag.xts(stock_use$HIGH, k = c(0:8))
high_max <- apply(high_9, MARGIN = 1, FUN = max)
# 计算9日内最低价
low_9 <- lag.xts(stock_use$LOW, k = c(0:8))
low_min <- apply(low_9, MARGIN = 1, FUN = min)
# rsv
rsv <- (stock_use$CLOSE - low_min) / (high_max - low_min) * 100

## 计算KDJ
for (i in 9:l_temp) {
  # 计算K值
  KDJ[i, 1] <- 2/3 * KDJ[(i - 1), 1] + 1/3 * rsv[i, ]
  # 计算D值
  KDJ[i, 2] <- 2/3 * KDJ[(i - 1), 2] + 1/3 * KDJ[i, 1]
  # 计算J值
  KDJ[i, 3] <- 3 * KDJ[i, 1] - 2 * KDJ[i, 2]
}

## 将KDJ转化为xts格式
KDJ <- as.xts(KDJ, order.by = index(rsv))

  最近几天的KDJ值如下所示:

> tail(KDJ) %>% round(digits = 2)
               K     D     J
2018-02-23 16.39 14.12 20.93
2018-02-26 24.00 17.41 37.19
2018-02-27 30.32 21.72 47.54
2018-02-28 38.97 27.47 61.97
2018-03-01 45.11 33.35 68.63
2018-03-02 40.82 35.84 50.79

  下面是Wind中给出的结果,可以看到我们计算的结果与之一致,3月2日的KDJ值分别是40.82、35.84和50.79。


猜你喜欢

转载自blog.csdn.net/weixin_40628687/article/details/79426751