2015-12-23 144 views
4

我正在嘗試使用PHP trader functions(可用作PECL擴展)來計算各種證券的移動平均收斂/發散(MACD)。但是,返回的值似乎不符合我的計算。MACD函數返回不正確的值

考慮收盤價以下陣列的股票:

$close = array (
    0 => 459.99, 
    1 => 448.85, 
    2 => 446.06, 
    3 => 450.81, 
    4 => 442.8, 
    5 => 448.97, 
    6 => 444.57, 
    7 => 441.4, 
    8 => 430.47, 
    9 => 420.05, 
    10 => 431.14, 
    11 => 425.66, 
    12 => 430.58, 
    13 => 431.72, 
    14 => 437.87, 
    15 => 428.43, 
    16 => 428.35, 
    17 => 432.5, 
    18 => 443.66, 
    19 => 455.72, 
    20 => 454.49, 
    21 => 452.08, 
    22 => 452.73, 
    23 => 461.91, 
    24 => 463.58, 
    25 => 461.14, 
    26 => 452.08, 
    27 => 442.66, 
    28 => 428.91, 
    29 => 429.79, 
    30 => 431.99, 
    31 => 427.72, 
    32 => 423.2, 
    33 => 426.21, 
    34 => 426.98, 
    35 => 435.69, 
    36 => 434.33, 
    37 => 429.8, 
    38 => 419.85, 
    39 => 426.24, 
    40 => 402.8, 
    41 => 392.05, 
    42 => 390.53, 
    43 => 398.67, 
    44 => 406.13, 
    45 => 405.46, 
    46 => 408.38, 
    47 => 417.2, 
    48 => 430.12, 
    49 => 442.78, 
    50 => 439.29, 
    51 => 445.52, 
    52 => 449.98, 
    53 => 460.71, 
    54 => 458.66, 
    55 => 463.84, 
    56 => 456.77, 
    57 => 452.97, 
    58 => 454.74, 
    59 => 443.86, 
    60 => 428.85, 
    61 => 434.58, 
    62 => 433.26, 
    63 => 442.93, 
    64 => 439.66, 
    65 => 441.35, 
); 

基於這些數字,MACD,信號線和MACD柱狀圖應該出來:

// MACD 
Array 
(
    [0] => 8.275269504 
    [1] => 7.703378381 
    [2] => 6.416074757 
    [3] => 4.237519783 
    [4] => 2.552583325 
    [5] => 1.37888572 
    [6] => 0.102981491 
    [7] => -1.258401953 
    [8] => -2.07055819 
    [9] => -2.621842328 
    [10] => -2.32906674 
    [11] => -2.181632115 
    [12] => -2.402626273 
    [13] => -3.342121681 
    [14] => -3.530363136 
    [15] => -5.507471249 
    [16] => -7.851274229 
    [17] => -9.719367455 
    [18] => -10.42286651 
    [19] => -10.26016216 
    [20] => -10.06920961 
    [21] => -9.571919612 
    [22] => -8.369633492 
    [23] => -6.301635724 
    [24] => -3.599681509 
    [25] => -1.720148361 
    [26] => 0.269003232 
    [27] => 2.180173247 
    [28] => 4.508637809 
    [29] => 6.118020154 
    [30] => 7.722430594 
    [31] => 8.327453809 
    [32] => 8.403441185 
    [33] => 8.508406323 
    [34] => 7.625761844 
    [35] => 5.649949083 
    [36] => 4.494654765 
    [37] => 3.432989362 
    [38] => 3.333473854 
    [39] => 2.956662856 
    [40] => 2.762561216 
) 

// Signal line 
Array 
(
    [0] => 3.037525869 
    [1] => 1.905652229 
    [2] => 1.058708435 
    [3] => 0.410640325 
    [4] => -0.152012994 
    [5] => -0.790034732 
    [6] => -1.338100413 
    [7] => -2.17197458 
    [8] => -3.30783451 
    [9] => -4.590141099 
    [10] => -5.756686181 
    [11] => -6.657381376 
    [12] => -7.339747023 
    [13] => -7.786181541 
    [14] => -7.902871931 
    [15] => -7.58262469 
    [16] => -6.786036054 
    [17] => -5.772858515 
    [18] => -4.564486166 
    [19] => -3.215554283 
    [20] => -1.670715865 
    [21] => -0.112968661 
    [22] => 1.45411119 
    [23] => 2.828779714 
    [24] => 3.943712008 
    [25] => 4.856650871 
    [26] => 5.410473066 
    [27] => 5.458368269 
    [28] => 5.265625568 
    [29] => 4.899098327 
    [30] => 4.585973432 
    [31] => 4.260111317 
    [32] => 3.960601297 
) 

// MACD histogram 
Array 
(
    [0] => -5.108084059 
    [1] => -4.527494558 
    [2] => -3.387775176 
    [3] => -2.59227244 
    [4] => -2.250613279 
    [5] => -2.55208695 
    [6] => -2.192262723 
    [7] => -3.335496669 
    [8] => -4.543439719 
    [9] => -5.129226357 
    [10] => -4.666180327 
    [11] => -3.602780783 
    [12] => -2.729462587 
    [13] => -1.785738071 
    [14] => -0.466761561 
    [15] => 1.280988966 
    [16] => 3.186354544 
    [17] => 4.052710154 
    [18] => 4.833489398 
    [19] => 5.39572753 
    [20] => 6.179353673 
    [21] => 6.230988815 
    [22] => 6.268319404 
    [23] => 5.498674095 
    [24] => 4.459729177 
    [25] => 3.651755452 
    [26] => 2.215288778 
    [27] => 0.191580814 
    [28] => -0.770970803 
    [29] => -1.466108965 
    [30] => -1.252499579 
    [31] => -1.303448461 
    [32] => -1.198040081 
) 

注MACD需要計算26日移動平均線,因此雖然收盤價有66個不同的數據點,但計算出的MACD值只有41個。此外,信號線(因此需要信號線的MACD柱狀圖)需要MACD的9天移動平均線,因此信號線/ MACD柱狀圖僅有31個計算。

上述數據是在excel上計算出來的,並且是正確的MACD。短腳本我必須計算在PHP中MACD是:

<?php 
// The array $close is the same as it is in the above example, omitted here for brevity. 
$macd = trader_macd($close, 12, 26); 
var_dump($macd); 
?> 

然而,var_dump($macd)打印:

array(3) { 
    [0]=> 
    array(40) { 
    [24]=> 
    float(0) 
    [25]=> 
    float(4.415) 
    [26]=> 
    float(4.437) 
    [27]=> 
    float(3.652) 
    [28]=> 
    float(1.899) 
    [29]=> 
    float(0.574) 
    [30]=> 
    float(-0.295) 
    [31]=> 
    float(-1.314) 
    [32]=> 
    float(-2.457) 
    [33]=> 
    float(-3.085) 
    [34]=> 
    float(-3.48) 
    [35]=> 
    float(-3.055) 
    [36]=> 
    float(-2.796) 
    [37]=> 
    float(-2.923) 
    [38]=> 
    float(-3.782) 
    [39]=> 
    float(-3.903) 
    [40]=> 
    float(-5.822) 
    [41]=> 
    float(-8.118) 
    [42]=> 
    float(-9.945) 
    [43]=> 
    float(-10.614) 
    [44]=> 
    float(-10.422) 
    [45]=> 
    float(-10.206) 
    [46]=> 
    float(-9.688) 
    [47]=> 
    float(-8.467) 
    [48]=> 
    float(-6.384) 
    [49]=> 
    float(-3.67) 
    [50]=> 
    float(-1.779) 
    [51]=> 
    float(0.219) 
    [52]=> 
    float(2.138) 
    [53]=> 
    float(4.473) 
    [54]=> 
    float(6.088) 
    [55]=> 
    float(7.697) 
    [56]=> 
    float(8.306) 
    [57]=> 
    float(8.385) 
    [58]=> 
    float(8.493) 
    [59]=> 
    float(7.613) 
    [60]=> 
    float(5.639) 
    [61]=> 
    float(4.485) 
    [62]=> 
    float(3.425) 
    [63]=> 
    float(3.327) 
    } 
    [1]=> 
    array(40) { 
    [24]=> 
    float(4.437) 
    [25]=> 
    float(3.652) 
    [26]=> 
    float(1.899) 
    [27]=> 
    float(0.574) 
    [28]=> 
    float(-0.295) 
    [29]=> 
    float(-1.314) 
    [30]=> 
    float(-2.457) 
    [31]=> 
    float(-3.085) 
    [32]=> 
    float(-3.48) 
    [33]=> 
    float(-3.055) 
    [34]=> 
    float(-2.796) 
    [35]=> 
    float(-2.923) 
    [36]=> 
    float(-3.782) 
    [37]=> 
    float(-3.903) 
    [38]=> 
    float(-5.822) 
    [39]=> 
    float(-8.118) 
    [40]=> 
    float(-9.945) 
    [41]=> 
    float(-10.614) 
    [42]=> 
    float(-10.422) 
    [43]=> 
    float(-10.206) 
    [44]=> 
    float(-9.688) 
    [45]=> 
    float(-8.467) 
    [46]=> 
    float(-6.384) 
    [47]=> 
    float(-3.67) 
    [48]=> 
    float(-1.779) 
    [49]=> 
    float(0.219) 
    [50]=> 
    float(2.138) 
    [51]=> 
    float(4.473) 
    [52]=> 
    float(6.088) 
    [53]=> 
    float(7.697) 
    [54]=> 
    float(8.306) 
    [55]=> 
    float(8.385) 
    [56]=> 
    float(8.493) 
    [57]=> 
    float(7.613) 
    [58]=> 
    float(5.639) 
    [59]=> 
    float(4.485) 
    [60]=> 
    float(3.425) 
    [61]=> 
    float(3.327) 
    [62]=> 
    float(2.951) 
    [63]=> 
    float(2.758) 
    } 
    [2]=> 
    array(40) { 
    [24]=> 
    float(-4.437) 
    [25]=> 
    float(0.763) 
    [26]=> 
    float(2.538) 
    [27]=> 
    float(3.079) 
    [28]=> 
    float(2.194) 
    [29]=> 
    float(1.888) 
    [30]=> 
    float(2.162) 
    [31]=> 
    float(1.771) 
    [32]=> 
    float(1.023) 
    [33]=> 
    float(-0.03) 
    [34]=> 
    float(-0.684) 
    [35]=> 
    float(-0.133) 
    [36]=> 
    float(0.986) 
    [37]=> 
    float(0.98) 
    [38]=> 
    float(2.04) 
    [39]=> 
    float(4.215) 
    [40]=> 
    float(4.122) 
    [41]=> 
    float(2.496) 
    [42]=> 
    float(0.477) 
    [43]=> 
    float(-0.408) 
    [44]=> 
    float(-0.734) 
    [45]=> 
    float(-1.738) 
    [46]=> 
    float(-3.303) 
    [47]=> 
    float(-4.798) 
    [48]=> 
    float(-4.605) 
    [49]=> 
    float(-3.889) 
    [50]=> 
    float(-3.917) 
    [51]=> 
    float(-4.254) 
    [52]=> 
    float(-3.95) 
    [53]=> 
    float(-3.224) 
    [54]=> 
    float(-2.218) 
    [55]=> 
    float(-0.688) 
    [56]=> 
    float(-0.187) 
    [57]=> 
    float(0.772) 
    [58]=> 
    float(2.854) 
    [59]=> 
    float(3.127) 
    [60]=> 
    float(2.214) 
    [61]=> 
    float(1.159) 
    [62]=> 
    float(0.474) 
    [63]=> 
    float(0.569) 
    } 
} 

如上是,PHP返回包含3個數組的數組。該documentation給小提示爲每個數組是什麼,僅指出了MACD功能

返回與計算出的數據,如果失敗錯誤的數組。

user contributed note(儘管一個具有得分爲-1)增加,所述第一陣列(索引0)是MACD值,所述第二陣列(索引1)是信號值,最後陣列(指數2)是發散值。

即使用戶註釋爲真,返回的數組也不符合我的計算(我知道這是正確的)。爲什麼trader_macd()返回不正確的值/我做錯了什麼?

交易者函數的PHP文檔僅包含每個函數的參數列表。作爲一個附註,是否有任何地方我可以得到更詳細的貿易商擴展文件?這不是我第一次遇到擴展功能問題。

+0

你可以分享你的Excel表格與MACD計算? – truf

+0

@truf,[這是一個下載鏈接](http://investexcel.net/wp-content/uploads/2013/08/MACD-Tutorial1.zip)到電子表格,它最初來自[本教程](http ://investexcel.net/how-to-calculate-macd-in-excel/)。 – Tim

+0

我會檢查教程,但是你的鏈接不工作。我得到錯誤403 – truf

回答

4

我不知道PHP,但我可以從C/C++的角度來解釋ta-lib行爲。我已經用你的數據集調試了它的MACD。如果您爲您的數據調用ta-lib的C函數ta_macd(),您將獲得以下信息。

macd  signal hist 
-3.08486 0.869685 -3.95455 
-3.4801 -0.000272319 -3.47983 
-3.05529 -0.611275 -2.44401 
-2.79613 -1.04825 -1.74788 
-2.92258 -1.42311 -1.49947 
-3.78208 -1.89491 -1.88718 
-3.90264 -2.29645 -1.60619 
-5.82247 -3.00166 -2.82082 
-8.11782 -4.02489 -4.09293 
-9.9449 -5.20889 -4.73601 
-10.6137 -6.28985 -4.32385 
-10.4216 -7.11621 -3.30543 
-10.2058 -7.73414 -2.47171 
-9.68753 -8.12482 -1.56272 
-8.46746 -8.19335 -0.274115 
-6.38441 -7.83156 1.44715 
-3.66972 -6.99919 3.32947 
-1.77941 -5.95524 4.17582 
0.218855 -4.72042 4.93927 
2.13774 -3.34879 5.48653 
4.47273 -1.78448 6.25722 
6.08764 -0.210058 6.2977 
7.69672 1.3713 6.32543 
8.3057 2.75818 5.54752 
8.38504 3.88355 4.50149 
8.49283 4.80541 3.68743 
7.61258 5.36684 2.24574 
5.6388 5.42123 0.217565 
4.48522 5.23403 -0.748811 
3.42501 4.87223 -1.44722 
3.32672 4.56312 -1.23641 
2.95095 4.24069 -1.28974 
2.75772 3.9441 -1.18637 

不匹配以下的Excel文件BCS:

  1. TA-Lib的計算26天EMA,其中第一EMA的結果是平均初始的26天期限。這是一個默認行爲(非Metastock)。
  2. TA-lib計算12天的EMA,其中第一個EMA結果是最初12天的平均值。但它調整到可以獲得第一個26天EMA的日子。因此它使用15-26天計算12天EMA的第一個價格的平均值。這與您的Excel主要區別。只需將公式=AVERAGE(B19:B30)放入單元格C30中,excel結果將與C函數結果匹配。
  3. 然後,TA-lib使用9天(默認信號週期)EMA計算在步驟2和3中獲得的值的信號\ hist值。並且它僅返回具有MACD,信號和hist兩天的結果。換句話說,它不返回前8個MACD值。如果您在Excel中的步驟2中提出了更改,則會看到C++函數結果將與範圍E38-G70匹配。

那麼,這就是TA-Lib的工作方式,據我所知。但是如果您將我的結果與您的PHP函數結果進行比較,您會發現它們不匹配。但是你可以看到,我MACDs是您的第一陣列等於值從

[33]=> 
    float(-3.085) 

開始如果你比較PHP結果用Excel(更新),你會發現第一個數組是第一要素是等於E30-E37。這些是前TA-Libs省略的前8個MACD,因爲它們沒有相應的信號\ hist值bcs信號以9天的EMA計算。這也意味着以下內容:

  1. 交易者函數作者不使用vanilla ta-lib。也許他們已經在PHP中重寫了TA_MACD函數邏輯,或者分叉ta-lib或者使用了我不知道的非常舊的版本。因爲ta-lib只是不返回它們返回的MACD值(儘管它計算它們)。
  2. 我不明白他們的結果數組格式或我不明白他們如何計算signal \ hist值(bcs第一個數組是相當可解釋的)。

我會推薦尋找裏面的PHP函數源代碼。我找不到它。 如果您想在ta-lib中重新檢查MACD的香草C實現,請參考以下頁面:macd,ema