TA-Lib: библиотека технического анализа, ретроспективный анализ и нестабильный период

TA-Lib - это библиотека финансового / рыночного / OHLC технического анализа для Java, C ++, .Net и т. Д. В ней ~ 158 технических функций (EMA, MAMA, MACD, SMA и т. Д.), Каждая из которых имеет ассоциированную функцию ретроспективного обзора.

public static int EmaLookback(int optInTimePeriod) 

Lookback для каждой функции, кажется, возвращает минимальную длину обработки, необходимую для точного вычисления каждой функции. От startIdx до endIdx, равного Lookback.

Core.RetCode retcode = Core.Ema(startIdx, endIdx, double inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, double outReal)

Некоторые из этих функций используют массив с именем

Globals.unstablePeriod[0x17]

Если что-то не так, пожалуйста, поправьте меня. Теперь вопросы ...

  1. Массив unstablePeriod [] инициализируется значением 0 для всех записей. Это то, что должно произойти, если не где в TA-Lib я могу найти код или данные, которыми он инициализируется?

  2. Для кода, который мы пишем, требуется только один самый последний элемент в массиве outReal [0] (или любой другой «outArray []»). Есть ли способ вернуть один элемент (a), или разница между startIdx и endIdx должна равняться Lookback (b)?

a)

int startIdx = this.ohlcArray.IdxCurrent;
int endIdx = startIdx; 
// call to TA Routine goes here

b)

int lookBack = Core.EmaLookback(optInTimePeriod) - 1;
int startIdx = this.ohlcArray.IdxCurrent;
int endIdx = startIdx + lookBack;
// call to TA Routine goes here
retcode = Core.Ema(startIdx, endIdx, inReal, optInTimePeriod, ref outBegIdx, ref outNBElement, outReal);
  1. Почему эти подпрограммы возвращают 0 для первого элемента outArray [0], когда startIdx равен 0?

  2. Поскольку я получаю такие странные результаты. Должен быть startIdx на самую старую дату или самую новую дату? Что означает, следует ли выполнять обработку от прошлого (startIdx) к настоящему (endIdx) или с настоящего момента (startIdx) к самой старой дате (endIdx) во времени? Я предполагаю, что вычисляю в обратном направлении (б)

    а) 2000 (startIdx) - 2003 (endIdx),
    или
    б) 2003 (startIdx) - 2000 (endIdx)


person David C Fuchs    schedule 15.05.2018    source источник


Ответы (1)


Я уже забыл C #, так что могу ошибаться, но:

Lookback для каждой функции, кажется, возвращает минимальную длину обработки, необходимую для точного вычисления каждой функции. От startIdx до endIdx, равного Lookback.

Нет, он возвращает количество входных элементов, необходимых для вычисления первого выходного элемента. Что обычно равно или больше значения timePeriod. Это все. Итак, если вы введете 1000 элементов (StartIdx == 0 и endIdx == 9999), а функция Lookback даст вам 25, вы получите обратно 1000-25 = 9975 == outNBElement результирующих элементов. И outBegIdx будет 24. Примечание: никто не гарантирует точность функции. Lookback просто позволяет вам заранее рассчитать размер результирующего массива, что критично для C / C ++, где могут быть выделены массивы фиксированного размера.

Массив unstablePeriod [] инициализируется значением 0 для всех записей. Это то, что должно произойти, если не где в TA-Lib я могу найти код или данные, которыми он инициализируется?

Похоже на это. Это происходит в конструкторе Core :: GlobalsType в TA-Lib-Core.h

Globals.unstablePeriod - это массив, в котором хранятся настройки нестабильности для некоторых функций TA. Значения адресованы через enum class FuncUnstId, который объявлен в ta_defs.h. Значение 0x17 соответствует техническому индикатору T3.

В случае индикатора T3 этот период нестабильности просто добавляет значение к результату ретроспективного анализа. Таким образом, ретроспективный анализ T3 равен 6 * (timePeriod-1) + TA_GLOBALS_UNSTABLE_PERIOD[TA_FUNC_UNST_T3]. Поэтому по умолчанию 0. И ясно, что точность функции не так проста.

Рассмотрим EMA. Его ретроспективный анализ - timePeriod-1 + TA_GLOBALS_UNSTABLE_PERIOD[TA_FUNC_UNST_EMA]. Предположим, что значение нестабильности равно 0. Таким образом, EMA - это только timePeriod-1. (Я бы порекомендовал без причины не трогать нестабильность). Согласно коду, который я вижу, его первый результат EMA вычисляется как простое среднее значение первого «ретроспективного подсчета» элементов по умолчанию. Существует глобальная настройка совместимости, которая может быть {CLASSIC, METASTOCK, TRADESTATION} и влияет на расчет первого элемента, но это не сильно меняет. Ваш первый элемент является средним, а остальные рассчитываются как EMA_today = (value_today - old_EMA)*coefficient + old_EMA.

По этой причине вы не можете просто передать «ретроспективный счетчик» элементов и получить «точный результат функции». Не будет точно - будет первый, не тот. В случае EMA это всегда будет простое среднее, поскольку простое среднее используется в качестве начального значения для этой функции. И следующие результаты рассчитываются не только для первых N входных элементов, но и включают предыдущее значение EMA. И эта предыдущая EMA включает в себя ее предыдущую EMA и т. Д. Таким образом, вы не можете просто передать ретроспективное количество элементов и ожидать точного результата. Вам также нужно будет передать значение предыдущей функции. Более того, так ведет себя большинство скользящих индикаторов. Их первые значения N сильно зависят от точки, с которой вы начали их вычислять. Эту проблему можно решить с помощью периода нестабильности, но лучше не ограничивать входные данные.

Почему эти подпрограммы возвращают 0 для первого элемента outArray [0]? Я предполагаю, что в вашем ретроспективном вычислении это bcs = -1. Также 0 возвращается для элемента outBegIdx, а не для элемента 0.

Есть ли способ вернуть один элемент (а)

С обычным TA-Lib - нет, или вам нужно каждый раз обрабатывать достаточно большой фрагмент данных, чтобы убедиться, что ваши скользящие результаты действительно «сходятся». Но я сделал для себя вилку TA-Lib здесь, которая предназначена для этого. Основная идея описана в ридми. Он должен быть почти таким же быстрым, как и исходный, и вы можете просто передать одно значение и объект состояния, чтобы получить один результат без пересчета всех данных. Таким образом, вычисления могут быть приостановлены и продолжены при поступлении новых данных без потери предыдущих результатов вычислений. Проблема в том, что TA-Lib написан на C, и код всех его оболочек C # / Java и т. Д. Фактически генерируется его внутренним инструментом (ta-gen). Никто никогда не пытался работать с моим форком через эти интерфейсы-оболочки. Так что они могут быть сломаны. Также я не предоставляю предварительно скомпилированные двоичные файлы, и поскольку TA-Lib очень старая, а ее инфраструктура довольно необычна, для ее создания на целевой платформе могут потребоваться некоторые навыки и усилия.

person truf    schedule 16.05.2018
comment
@DavidCFuchs startIdx должен указывать на самую старую дату. Так что это вариант а) - person truf; 18.05.2018
comment
Я начал переделывать механизм обработки данных вчера вечером, когда понял это. - person David C Fuchs; 18.05.2018
comment
Период инициализации индикаторов, использующих сглаживание, может быть намного дольше, чем вы думаете. Я действительно провел некоторый анализ этого, чтобы продемонстрировать, как сглаживание влияет на значения RSI, например. Для EMA может быть до 200+ баров после периода ретроспективного анализа, прежде чем вы получите точность до двух десятичных знаков. Как и вы, я боролся с TA-Lib, несмотря на то, что использовал его в течение десяти лет. Вместо переделки TA-Lib попробуйте более современную библиотеку: Stock.Indicators. - person Dave Skender; 31.05.2021