Объяснение механизма обратного тестирования на уровне моделирования FMZ

Автор:Доброта, Создано: 2020-06-04 09:46:50, Обновлено: 2023-11-01 20:32:27

img

Архитектура обратного тестирования

Программа FMZ платформы backtest является полным контрольным процессом, и программа опросов без остановки в соответствии с определенной частотой. Данные, возвращенные каждым рынком и торговых API также моделирует фактическое время работы в соответствии с времени вызова.onTickуровень, а неonBarУлучшенная поддержка для обратного тестирования стратегий, основанных наTickerданные (стратегии с более высокой частотой работы).

Разница между обратным тестом на уровне моделирования и обратным тестом на уровне реального рынка

  • Обратная проверка на уровне моделирования

Бакт-тест на уровне моделирования основан на данных нижней K-линии системы бакт-теста, и согласно определенному алгоритму интерполяция данных тикера моделируется в рамках значений наивысшей, самой низкой, открывающейся и закрывающейся цены данной нижней K-линии Bar в этомBarвременные ряды.

  • Реальный рыночный уровень

Реальный рыночный уровень обратного теста - это реальные данные уровня тикера вBarДля стратегий, основанных на данных на уровне тикера, использование реального рыночного уровня обратного теста ближе к реальности.

Уровень симуляции механизм обратного испытания-нижняя линия K

Для реального рыночного бэкстеста не существует опции нижней линии K (поскольку данные тикера реальны, для моделирования генерации не требуется нижняя линия K).

В обратном тесте на уровне симуляции генерируемыеtickerЭто K-линейные данные - это нижняя K-линия. При фактическом использовании симуляционного уровня backtest период нижней K-линии должен быть меньше, чем период вызова API для получения K-линии при запуске стратегии. В противном случае, из-за большого цикла нижней K-линии и недостаточного количества генерируемых тикеров, данные будут искажены при вызове API для получения K-линии указанного периода. При использовании большого периода K-линейного backtest вы можете должным образом увеличить нижний K-линейный цикл.

Как генерировать данные тикера для нижней строки K

Механизм генерации имитируемых тикеров на нижней линии K такой же, как и в известном торговом программном обеспечении MetaTrader 4

img img img img

Алгоритмный код для генерации данных тикера

Специфический алгоритм для моделирования данных о тиках из данных нижней линии K:

function recordsToTicks(period, num_digits, records) {
    // http://www.metatrader5.com/en/terminal/help/tick_generation
    if (records.length == 0) {
        return []
    }
    var ticks = []
    var steps = [0, 2, 4, 6, 10, 12, 16, 18, 23, 25, 27, 29]
    var pown = Math.pow(10, num_digits)

    function pushTick(t, price, vol) {
        ticks.push([Math.floor(t), Math.floor(price * pown) / pown, vol])
    }

    for (var i = 0; i < records.length; i++) {
        var T = records[i][0]
        var O = records[i][1]
        var H = records[i][2]
        var L = records[i][3]
        var C = records[i][4]
        var V = records[i][5]
        if (V > 1) {
            V = V - 1
        }
        if ((O == H) && (L == C) && (H == L)) {
            pushTick(T, O, V)
        } else if (((O == H) && (L == C)) || ((O == L) && (H == C))) {
            pushTick(T, O, V)
        } else if ((O == C) && ((O == L) || (O == H))) {
            pushTick(T, O, V / 2)
            pushTick(T + (period / 2), (O == L ? H : L), V / 2)
        } else if ((C == H) || (C == L)) {
            pushTick(T, O, V / 2)
            pushTick(T + (period * 0.382), (C == L ? H : L), V / 2)
        } else if ((O == H) || (O == L)) {
            pushTick(T, O, V / 2)
            pushTick(T + (period * 0.618), (O == L ? H : L), V / 2)
        } else {
            var dots = []
            var amount = V / 11
            pushTick(T, O, amount)
            if (C > O) {
                dots = [
                    O - (O - L) * 0.75,
                    O - (O - L) * 0.5,
                    L,
                    L + (H - L) / 3.0,
                    L + (H - L) * (4 / 15.0),
                    H - (H - L) / 3.0,
                    H - (H - L) * (6 / 15.0),
                    H,
                    H - (H - C) * 0.75,
                    H - (H - C) * 0.5,
                ]
            } else {
                dots = [
                    O + (H - O) * 0.75,
                    O + (H - O) * 0.5,
                    H,
                    H - (H - L) / 3.0,
                    H - (H - L) * (4 / 15.0),
                    H - (H - L) * (2 / 3.0),
                    H - (H - L) * (9 / 15.0),
                    L,
                    L + (C - L) * 0.75,
                    L + (C - L) * 0.5,
                ]
            }
            for (var j = 0; j < dots.length; j++) {
                pushTick(T + period * (steps[j + 1] / 30.0), dots[j], amount)
            }
        }
        pushTick(T + (period * 0.98), C, 1)
    }
    return ticks
}

Таким образом, при использовании обратного теста на уровне симуляции будут наблюдаться скачки цен в временных рядах.


Связанные

Больше