首页 > 解决方案 > TTR:MACD 给出的结果与我在 Python 和图表中得到的结果不同

问题描述

我手头有以下股票价格数据:

2017-06-15 10:00:00  958.4334
2017-06-15 11:00:00  955.7800
2017-06-15 12:00:00  958.2800
2017-06-15 13:00:00  959.2200
2017-06-15 14:00:00  962.4900
2017-06-15 15:00:00  964.0000
2017-06-15 15:59:00  963.3500
2017-06-16 09:00:00  997.3500
2017-06-16 10:00:00  995.0000
2017-06-16 11:00:00  992.7600
2017-06-16 12:00:00  990.7200
2017-06-16 13:00:00  994.6800
2017-06-16 14:00:00  996.0500
2017-06-16 15:00:00  987.6100
2017-06-16 15:59:00  987.5000
2017-06-19 09:00:00  999.1700
2017-06-19 10:00:00 1001.2700
2017-06-19 11:00:00  995.5200
2017-06-19 12:00:00  994.3350
2017-06-19 13:00:00  995.2199
2017-06-19 14:00:00  990.9221
2017-06-19 15:00:00  995.1300
2017-06-19 15:59:00  994.3400
2017-06-20 09:00:00  995.5200
2017-06-20 10:00:00 1003.5100
2017-06-20 11:00:00  998.8129
2017-06-20 12:00:00  996.2800
2017-06-20 13:00:00  997.2100
2017-06-20 14:00:00  998.0000
2017-06-20 15:00:00  992.5800
2017-06-20 15:59:00  992.8000
2017-06-21 09:00:00  993.9500
2017-06-21 10:00:00  995.2700
2017-06-21 11:00:00  996.4000
2017-06-21 12:00:00  994.2800
2017-06-21 13:00:00  996.1000
2017-06-21 14:00:00  998.7450
2017-06-21 15:00:00 1001.7900
2017-06-21 15:59:00 1002.9800
2017-06-22 09:00:00 1001.4100
2017-06-22 10:00:00 1004.0700
2017-06-22 11:00:00 1003.1500
2017-06-22 12:00:00 1003.4800
2017-06-22 13:00:00 1003.1600
2017-06-22 14:00:00 1003.1800
2017-06-22 15:00:00 1001.3900
2017-06-22 15:59:00 1001.5600
2017-06-23 09:00:00  999.8699
2017-06-23 10:00:00 1001.5800
2017-06-23 11:00:00 1001.0700
2017-06-23 12:00:00 1002.9800
2017-06-23 13:00:00 1003.2400
2017-06-23 14:00:00 1002.4300
2017-06-23 15:00:00 1003.7400
2017-06-23 15:59:00 1003.0500
2017-06-26 09:00:00 1006.2000
2017-06-26 10:00:00  997.3500
2017-06-26 11:00:00  999.3300
2017-06-26 12:00:00  999.1000
2017-06-26 13:00:00  997.0600
2017-06-26 14:00:00  995.8336
2017-06-26 15:00:00  993.9900
2017-06-26 15:59:00  993.5500
2017-06-27 09:00:00  992.7550
2017-06-27 10:00:00  993.7600
2017-06-27 11:00:00  990.6700
2017-06-27 12:00:00  986.5500
2017-06-27 13:00:00  981.1099
2017-06-27 14:00:00  982.5499
2017-06-27 15:00:00  977.4100
2017-06-27 15:59:00  976.7800
2017-06-28 09:00:00  971.4600
2017-06-28 10:00:00  982.5200
2017-06-28 11:00:00  980.9100
2017-06-28 12:00:00  986.4372
2017-06-28 13:00:00  987.6710
2017-06-28 14:00:00  986.7977
2017-06-28 15:00:00  990.0300
2017-06-28 15:59:00  991.0000
2017-06-29 09:00:00  982.5200
2017-06-29 10:00:00  977.7710
2017-06-29 11:00:00  972.6600
2017-06-29 12:00:00  970.3100
2017-06-29 13:00:00  969.1600
2017-06-29 14:00:00  973.4720
2017-06-29 15:00:00  975.9100
2017-06-29 15:59:00  975.3100
2017-06-30 09:00:00  977.5800
2017-06-30 10:00:00  978.6400
2017-06-30 11:00:00  978.7299
2017-06-30 12:00:00  974.9700
2017-06-30 13:00:00  975.7700
2017-06-30 14:00:00  975.7000
2017-06-30 15:00:00  968.0000
2017-06-30 15:59:00  969.0000

我试图使用TTR::MACD以下方法计算 MACD(给定上面的数据框称为amz.xts):

macd -> MACD(amz.xts, nFast = 20, nSlow = 40, nSig = 10, maType = 'EMA')

结果是一系列十进制数,主要在 0.0 ~ 1.5 之间

而当我使用 python wrapper ofTalib做同样的事情时,结果在 0.0 ~ 25.0 之间,绝大多数在 10.0 ~ 20.0 之间,这也是我用于交易的图表软件中显示的相同数据。

蟒蛇代码:

import talib as ta

# m is macd
# s is signal
# h is histogram
m,s,h = ta.MACD(data, fastperiod=20, slowperiod=40, signalperiod=10)

我不会怀疑交易软件是错误的,鉴于 python 给出了相同的结果,我更愿意说TTR::MACD是在做不同的事情。我也认为 python 和交易软件的结果是有道理的,因为价格真的很高。(每股 900 美元以上)。

我做错了什么还是只是他们使用了不同的算法?(我非常怀疑。)

标签: pythonrtime-seriesmoving-averagetechnical-indicator

解决方案


我没有检查python函数,但TTR::MACD()绝对正确。也许是这个percent=FALSE论点?

library(TTR)

xx <- rep(c(1, rep(0, 49)), 4)

fast <- 20
slow <- 40
sig <- 10

macd <- MACD(xx, fast, slow, sig, maType="EMA", percent=FALSE)

macd2 <- EMA(xx, fast) - EMA(xx, slow)
macd2 <- cbind(macd2, EMA(macd2, sig))

par(mar=c(2, 2, 1, 1))

matplot(macd[-1:-40, ], type="l", lty=1, lwd=1.5)
matlines(macd2[-1:-40, ], type="l", lty=3, lwd=3, col=c("green", "blue"))

在此处输入图像描述


推荐阅读