I am learning to use R. I have an interest in pulling stock data and calculating various technical indicators on the stock data. My test benchmark is Google Finance. That is, I check my results with GF's results.
我正在学习使用r。我对提取股票数据和计算股票数据上的各种技术指标很感兴趣。我的测试基准是谷歌金融。也就是说,我用GF的结果检查结果。
While trying to implement some sort of MACD analysis, I have noticed a couple of things. These are probably my misinterpretation of the documentation. I have tried many variations and I cannot get agreement with Google Finance's numbers in some cases.
在尝试实现某种MACD分析时,我注意到了一些事情。这些可能是我对文档的误解。我尝试过很多不同的方法,在某些情况下,我无法与谷歌金融公司的数据达成一致。
library(quantmod)
gives me MACD()
, which returns columns macd
and signal
.
库(quantmod)为我提供了MACD(),它返回列MACD和signal。
library(fTrading)
gives me cdsTA()
and cdoTA()
, which return cdsTA
and cdoTA
respectively.
library(fTrading)给我cdsTA()和cdoTA(),它们分别返回cdsTA和cdoTA。
My test stock is IBM, and hopefully this link will pull up a chart with prices, volume, slow stochastics and MACD with histogram.
我的测试股票是IBM,希望这个链接将拉出一个包含价格、交易量、慢随机变量和带有直方图的MACD的图表。
http://www.google.com//finance?chdnp=1&chdd=1&chds=1&chdv=1&chvs=Linear&chdeh=0&chfdeh=0&chdet=1298224745682&chddm=46920&chddi=86400&chls=CandleStick&q=NYSE IBM&ntsp = 0
Loading up IBM's price data into R and generating the values of the 3 functions above for the values 8, 17, 9 and for MACD()
I set percent=FALSE
gives me the following output.
将IBM的价格数据加载到R中,并为值8,17,9和MACD()生成上述3个函数的值,我将percent=FALSE设置为以下输出。
MACD(close, 8, 17, 9, maType="EMA", percent=FALSE)
cdsTA(close, lag1 = 8, lag2 = 17, lag3 = 9)
cdoTA(close, lag1 = 8, lag2 = 17, lag3 = 9)
date close macd signal cdsTA cdoTA
2011-02-07 164.17 3.187365 3.208984 3.208984 -0.7673435
2011-02-08 166.05 3.246812 3.216549 3.216549 -0.7996041
2011-02-09 164.65 3.052187 3.183677 3.183677 -1.0496306
2011-02-10 164.09 2.780047 3.102951 3.102951 -1.3332292
2011-02-11 163.85 2.496591 2.981679 2.981679 -1.5867962
2011-02-14 163.22 2.168977 2.819138 2.819138 -1.8408138
2011-02-15 162.84 1.846701 2.624651 2.624651 -2.0507546
2011-02-16 163.40 1.640518 2.427824 2.427824 -2.1262626
2011-02-17 164.24 1.550798 2.252419 2.252419 -2.0854783
2011-02-18 164.84 1.517145 2.105364 2.105364 -1.9968608
If you refer to the google finance chart above, the columns cdsTA and macd are identical and agree closely with Google's EMA figures. MACD()
's value for macd al also pretty close to GF's. And so I get
如果你参考上面的谷歌财务图表,cdsTA和macd列是相同的,并且与谷歌的EMA数据非常一致。MACD()的MACD al值也非常接近GF值。所以我得到
macd - signal = divergence.
macd -信号=散度。
However, cdoTA is way off. What am I doing wrong?
然而,cdoTA离我太远了,我做错了什么?
1 个解决方案
#1
3
You're not doing anything wrong. The cdoTA
code doesn't pass lag1
or lag2
to cdsTA
, so it just uses the default values of 12 and 26.
你没做错什么。cdoTA代码没有将lag1或lag2传递给cdsTA,所以它只使用默认值12和26。
> cdoTA
function (x, lag1 = 12, lag2 = 26, lag3 = 9)
{
cdo = macdTA(x, lag1 = lag1, lag2 = lag2) -
cdsTA(x, lag3 = lag3) # no lag1 or lag2, so...
if (is.timeSeries(x))
colnames(cdo) <- "CDO"
cdo
}
> args(cdsTA) # default arg values are used
function (x, lag1 = 12, lag2 = 26, lag3 = 9)
NULL
You can define your own function CDOTA
:
你可以定义你自己的函数CDOTA:
CDOTA <- function (x, lag1 = 12, lag2 = 26, lag3 = 9) {
cdo = macdTA(x, lag1 = lag1, lag2 = lag2) -
cdsTA(x, lag1 = lag1, lag2 = lag2, lag3 = lag3)
if (is.timeSeries(x))
colnames(cdo) <- "CDO"
cdo
}
Or just do the subtraction yourself with the results from TTR::MACD
.
或者用TTR::MACD的结果来做减法。
require(quantmod)
getSymbols("IBM", source="google")
ibm <- merge(Cl(IBM), MACD(Cl(IBM), 8, 17, 9, "EMA", FALSE))
ibm$macdOsc <- ibm$macd - ibm$signal
tail(ibm)
# IBM.Close macd signal macdOsc
# 2011-02-15 162.84 1.8361263 2.643950 -0.8078238
# 2011-02-16 163.40 1.6248017 2.440120 -0.8153187
# 2011-02-17 164.24 1.5319154 2.258479 -0.7265640
# 2011-02-18 164.84 1.4965394 2.106091 -0.6095520
# 2011-02-22 161.95 1.1140192 1.907677 -0.7936578
# 2011-02-23 160.18 0.6253874 1.651219 -1.0258316
#1
3
You're not doing anything wrong. The cdoTA
code doesn't pass lag1
or lag2
to cdsTA
, so it just uses the default values of 12 and 26.
你没做错什么。cdoTA代码没有将lag1或lag2传递给cdsTA,所以它只使用默认值12和26。
> cdoTA
function (x, lag1 = 12, lag2 = 26, lag3 = 9)
{
cdo = macdTA(x, lag1 = lag1, lag2 = lag2) -
cdsTA(x, lag3 = lag3) # no lag1 or lag2, so...
if (is.timeSeries(x))
colnames(cdo) <- "CDO"
cdo
}
> args(cdsTA) # default arg values are used
function (x, lag1 = 12, lag2 = 26, lag3 = 9)
NULL
You can define your own function CDOTA
:
你可以定义你自己的函数CDOTA:
CDOTA <- function (x, lag1 = 12, lag2 = 26, lag3 = 9) {
cdo = macdTA(x, lag1 = lag1, lag2 = lag2) -
cdsTA(x, lag1 = lag1, lag2 = lag2, lag3 = lag3)
if (is.timeSeries(x))
colnames(cdo) <- "CDO"
cdo
}
Or just do the subtraction yourself with the results from TTR::MACD
.
或者用TTR::MACD的结果来做减法。
require(quantmod)
getSymbols("IBM", source="google")
ibm <- merge(Cl(IBM), MACD(Cl(IBM), 8, 17, 9, "EMA", FALSE))
ibm$macdOsc <- ibm$macd - ibm$signal
tail(ibm)
# IBM.Close macd signal macdOsc
# 2011-02-15 162.84 1.8361263 2.643950 -0.8078238
# 2011-02-16 163.40 1.6248017 2.440120 -0.8153187
# 2011-02-17 164.24 1.5319154 2.258479 -0.7265640
# 2011-02-18 164.84 1.4965394 2.106091 -0.6095520
# 2011-02-22 161.95 1.1140192 1.907677 -0.7936578
# 2011-02-23 160.18 0.6253874 1.651219 -1.0258316