리소스 로딩... 로딩...

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

저자:니나바다스, 창작: 2022-03-23 10:07:18, 업데이트: 2022-03-28 14:31:37

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


  • 1.역사시험 프레임워크

    FMZ 퀀트 백테스트의 전략 프로그램은 완전한 제어 흐름이며, 프로그램은 특정 빈도에 따라 지속적으로 설문 조사를 받는다. 플랫폼 API가 반환하는 모든 시장 코트 및 데이터는 호출 시간에 따라 실제 실행 시기를 시뮬레이션한다. 백테스트는 다른 백테스트 시스템의 온바르 수준이 아니라 온틱 수준에 속한다. 그것은 틱커 데이터 (더 높은 운영 빈도의 전략) 에 기반한 전략의 백테스트를 더 잘 지원한다.

  • 2. 시뮬레이션 수준과 실제 시장 수준 사이의 차이점

    • 시뮬레이션 레벨

      시뮬레이션 레벨 백테스트는 백테스트 시스템의 하층 K-라인 데이터에 기반합니다. 특정 알고리즘에 따라 기본 K-라인 바의 주어진 가장 높은 가격, 가장 낮은 가격, 오픈 가격 및 클로즈 가격으로 구성된 프레임 내에서, 이 바의 시간 계열에 틱어 데이터의 중입을 시뮬레이션합니다.

    • 실제 시장 수준

      실제 시장 수준 백테스트는 바의 시간 계열의 실제 틱어 레벨 데이터입니다. 틱어 레벨 데이터에 기반한 전략의 경우 실제 시장 수준 백테스트를 사용하는 것이 현실에 더 가깝습니다. 실제 시장 수준의 백테스트에서는 실제로 기록된 데이터, 시뮬레이션된 것이 아닙니다.

  • 3.시뮬레이션 레벨 백테스트 메커니즘

    실제 시장 수준의 백테스트를 위해 하층 K-라인 옵션이 없습니다 (티커 데이터가 실제이기 때문에 하층 K-라인은 시뮬레이션에 사용되지 않습니다). 시뮬레이션 레벨 백테스트에서, 틱어 데이터는 K-라인 데이터를 기반으로 시뮬레이션되고 생성된다. 이 K-라인 데이터는 하층 K-라인이다. 시뮬레이션 레벨 백테스트의 실제 동작에서, 전략이 실행될 때 API를 호출하는 기간보다 하층 K-라인의 기간이 작아야 한다. 그렇지 않으면 하층 K-라인의 큰 기간과 생성된 틱어 수가 충분하지 않기 때문에, API가 지정된 기간의 K-선을 얻기 위해 호출될 때, 데이터는 왜곡될 것이다. 하층 K-라인을 백테스트로 사용하는 경우, 하층 K-라인 기간을 적절히 더 크게 설정할 수 있다.

  • 4.How하층 K-라인에서 틱어 데이터를 생성합니까?

    하층 K-라인 시뮬레이션 틱을 생성하는 메커니즘은 MT4와 동일합니다.관련 링크

    img img img img

  • 5. 틱어 데이터를 생성하는 수학적 코드

    하층 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
}

따라서 시뮬레이션 레벨 백테스트가 실행될 때 시간대에서 가격 이동이 있을 것입니다.


더 많은