FMZ 시뮬레이션 레벨 백테스트 메커니즘 설명

저자:선함, 제작: 2020-06-04 09:46:50, 업데이트: 2023-11-01 20:32:27

img

백테스트 아키텍처

FMZ 플랫폼 백테스트 프로그램은 완전한 제어 프로세스이며, 프로그램은 특정 주파수에 따라 멈추지 않고 투표합니다. 각 시장 및 거래 API가 반환하는 데이터는 호출 시간에 따라 실제 실행 시간을 시뮬레이션합니다.onTick수준이 아니라onBar다른 백트테스트 시스템의 수준.Ticker데이터 (더 높은 작동 빈도의 전략)

시뮬레이션 레벨 백테스트와 실제 시장 레벨 백테스트의 차이

  • 시뮬레이션 레벨 백테스트

시뮬레이션 레벨 백테스트는 백테스트 시스템의 하단 K-라인 데이터에 기반하고, 특정 알고리즘에 따라, 틱어 데이터 인터폴레이션은Bar시간 계열

  • 실제 시장 수준 백트 테스트

실제 시장 수준 백테스트는Bar틱어 레벨 데이터에 기반한 전략의 경우 실제 시장 수준 백테스트를 사용하여 현실에 더 가깝습니다. 실제 시장 수준에서 백테스트, 틱어는 실제 기록 된 데이터이며 시뮬레이션되지 않습니다.

시뮬레이션 레벨 백테스트 메커니즘-하위 K 라인

실제 시장 백테스트를 위한 하위 K-라인 옵션은 없습니다. (티커 데이터가 실제이기 때문에 생성 시뮬레이션을 위해 하위 K-라인이 필요하지 않습니다.)

시뮬레이션 레벨 백테스트에서 생성된ticker이 K-라인 데이터는 아래 K-라인이다. 시뮬레이션 레벨 백테스트의 실제 사용에서는, 전략이 실행될 때 K-라인을 얻기 위해 API를 호출하는 기간보다 아래 K-라인 기간이 작아야 한다. 그렇지 않으면, 아래 K-라인의 큰 사이클과 생성된 티커의 부족으로 인해, 지정된 기간의 K-라인을 얻기 위해 API를 호출할 때 데이터가 왜곡될 것이다. 큰 기간 K-라인 백테스트를 사용할 때, 당신은 적절하게 아래 K-라인 사이클을 증가시킬 수 있다.

아래 K 라인에 대한 틱어 데이터를 생성하는 방법

아래 K 라인에 시뮬레이션 틱을 생성하는 메커니즘은 유명한 거래 소프트웨어 메타 트레이더 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
}

따라서 시뮬레이션 레벨 백테스트를 사용할 때 시간 계열에서 가격 점프가 발생할 것입니다.


관련

더 많은