我正在尝试使用 TA-Lib 进行技术分析。我下载了 .NET 的 TA-Lib-Core Nuget 包。不幸的是,我找不到任何 API 文档,所以一些方法参数有点神秘。
我在 4/12/2016 和 4/12/2017 之间下载了 AMD 的历史数据 here 。
这是我用于 RSI 和 MACD 计算的内容:
int outBegIdx1, outNBElement1;
double[] outReal = new double[data.Count];
int outBegIdx2, outNBElement2;
double[] outMACD = new double[data.Count];
double[] outMACDSignal = new double[data.Count];
double[] outMACDHist = new double[data.Count];
TicTacTec.TA.Library.Core.Rsi(0, data.Count - 1, data.Select(x => x.Close).ToArray(), 14, out outBegIdx1, out outNBElement1, outReal);
TicTacTec.TA.Library.Core.Macd(0, data.Count - 1, data.Select(x => (float)x.Close).ToArray(), 12, 26, 9, out outBegIdx2, out outNBElement2, outMACD, outMACDSignal, outMACDHist);
我将结果与 TradingView 的 AMD 页面 here 进行比较。要查看 RSI 和 MACD 值,请单击顶部的“指标”并选择它们。此外,您应该查看 1 年日线图。
问题是 TA-Lib 输出的结果大不相同,我不确定我是否正确使用了这些 API。我看到的是 RSI 的 65.34 和 MACD 直方图的 0.0431,而不是 TradingView 的 39.42 和 -0.2165。
请注意,
data[0]
的收盘价为 2016 年 4 月 12 日,而最后一个元素是 2017 年 4 月 12 日的收盘价。我也不知道 outBegIdx
和 outNBElement
参数代表什么。如何返回正确的值?
最佳答案
Here is 解释了 * 变量含义的文档。简而言之,您的数组对应于这样的原始数据:
for (int i = 0; i < outNbElement; i++){
qDebug() << "Result for day #" << outBegIdx+i << ": outMACD: " << outMACD[i]
<< " outMACDSignal: " << outMACDSignal[i]
<< "outMACDHist: " << outMACDHist[i];
}
例如,MACD (12,26,9) 将返回
data.Count - 33
(如果我没记错的话,它将是 -33)数组中的输出值,因为输入数据的前 33 个值将用于初始化 MACD 使用的 EMA。例如,如果您正在寻找 10 天 MA(移动平均线)并将 10 天数据传递给 TA-Lib,您应该期望输出数组中只有 1 天结果值(最后一天),因为前 9 天被用来初始化,此时 10 天 MA 还没有准备好。我不确定 MACD(12,26,9) 的确切值是 33 - 您可能会在指标的 Lookback
函数的帮助下找到确切值。在 C++ API 中有这样的东西,它们也必须在 C# API 中的某个地方。考虑回溯值,您甚至可以为结果数组分配更少的空间。无论如何,当您传递 * 数组时,您是安全的,这些数组分配与原始数据相同的大小,并依靠 out*
索引对其进行迭代。如果 TA-Libs 移动平均线的结果与某些网站的结果显着不同,这通常是您开始计算时的影响。例如,在您引用的网站上,我看到 MACD 指标是针对一年中的第 1 个月计算的。如果他们像 TA-Lib 那样只使用去年的数据来计算它,他们就无法得到这个 MACD 数据。必须浪费一些数据的 Bcs 来初始化移动平均线。这意味着他们更早开始了 MACD 计算。例如 3 年前(或他们拥有的所有数据)并仅显示过去 12 个月的结果。例如,如果您切换到 ALL 周期而不是 1y,您会看到在一开始的一小段图表中缺少指标值。这就是他们实际开始计算这种规模的 MACD 的地方。
我会尝试提供 TA-Lib 3 年的数据期,并将其去年与网站进行比较。他们的结果应该足够收敛了。
当您 100% 确定 TA-Lib 的指标和网站的指标是根据相同的数据计算的,那么您应该期望您的结果相同或略有不同。这个小的差异可能是由于指标的不同实现。例如 MACD(12,26,9) 在其公式中使用因子 2/(12+1), 2/(26+1), 2/(9+1)。值 2/27 可以实时计算并与所有可用的进动一起使用。或者它可以四舍五入到 0.074。或者你可以引用你的实现中的一些书,发现他们推荐 0.075 就像 Technical Analysis of Stock Trends, Tenth Edition by Robert D. Edwards,W.H.C. 。 TA-Lib 会即时计算这些值,但 could be forced 会通过一些 C++ API 技巧使用硬编码 (0.075, 0.15, 0.2)。
关于.NET:无法从 TA-Lib 获得正确的 RSI 和 MACD 值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43382767/