【问题标题】:How to use R packages MACD functions?如何使用 R 包 MACD 功能?
【发布时间】:2011-02-20 21:28:41
【问题描述】:

我正在学习使用 R。我对提取股票数据和计算股票数据的各种技术指标感兴趣。我的测试基准是谷歌财经。也就是说,我用GF的结果检查我的结果。

在尝试执行某种 MACD 分析时,我注意到了几件事。这些可能是我对文档的误解。我尝试了很多变化,但在某些情况下我无法与 Google 财经的数字达成一致。

library(quantmod) 给我MACD(),它返回列macdsignal

library(fTrading) 给我cdsTA()cdoTA(),它们分别返回cdsTAcdoTA

我的测试股票是 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

将 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

如果您参考上面的 google 金融图表,cdsTA 和 macd 列是相同的,并且与 Google 的 EMA 数据非常吻合。 MACD() 对 macd al 的价值也非常接近 GF。所以我得到了

macd - 信号 = 分歧。

但是,cdoTA 还很遥远。我做错了什么?

【问题讨论】:

    标签: r finance quantmod


    【解决方案1】:

    你没有做错任何事。 cdoTA 代码不会将 lag1lag2 传递给 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
    

    你可以定义自己的函数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
    }
    

    或者只是自己用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
    

    【讨论】:

    • 谢谢约书亚。这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-15
    • 2018-06-24
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多