avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1120
수행원

발명가의 정량적 시뮬레이션 레벨 백테스팅 메커니즘 설명

만든 날짜: 2017-02-07 13:04:57, 업데이트 날짜: 2023-09-07 17:49:15
comments   34
hits   14535

발명가의 정량적 시뮬레이션 레벨 백테스팅 메커니즘 설명


  • ### 1, 구조를 재검토

발명자의 양적 피드백 중 전략 프로그램은 완전한 제어 프로세스이며, 이 프로그램은 일정 주파수에 따라 멈추지 않는 설문조사를 한다. 각 상황, 거래 API가 반환하는 데이터는 또한 호출 시점에 따라 실제 실행 시기를 모방하는 상황이다. onTick 계층에 속하며, 다른 피드백 시스템의 onBar 계층은 아니다. Ticker 데이터를 기반으로 한 전략의 피드백을 더 잘 지원한다.

  • 2., 아날로그 레벨 회수와 하드 디스크 레벨 회수의 차이

    • #### 시뮬레이션 레벨 재측정

    시뮬레이션 레벨 회귀는 회귀 시스템의 밑바닥 K선 데이터를 따라, 주어진 밑바닥 K선 Bar의 최고값, 최저값, 개시값, 닫기값의 수학적 구성의 프레임워크 내에서 특정 알고리즘에 따라, 틱러 데이터 삽입 값을 이 Bar의 시간 연속으로 시뮬레이션한다.

    • #### 리드 디스크 레벨 재검토

    실 디스크 레벨 회귀는 Bar의 시간 순서에 있는 실제 틱러 레벨 데이터이다. 틱러 레벨 데이터에 기반한 전략의 경우 실 디스크 레벨 회귀를 사용하는 것이 더 가깝다. 디스크 레벨 회귀, 틱어는 실제 기록된 데이터이며, 시뮬레이션 생성되지 않는다.

  • 3. 아날로그 레벨 리포스 메커니즘 - 하위 K 라인

리드 디스크 레벨 회귀에는 기본 K 라인 옵션이 없습니다. 시뮬레이션 레벨 회귀에서는, K선 데이터 기반의 시뮬레이션으로 생성된 티커。 이 K선 데이터는 기본 K선。 실제 사용 시 기본 K선 주기가 전략 실행 시 K선을 얻기 위해 API를 호출하는 주기보다 작아야 한다。 그렇지 않으면, 기본 K선 주기가 크기 때문에 생성된 티커 수가 부족하여, API를 호출하여 지정된 주기의 K선을 얻는 경우, 데이터가 부정확할 수 있다。 큰 주기의 K선 회귀를 사용할 때, 기본 대층 K선 주기를 적절히 조정할 수 있다。

  • ### 4 K선 밑바닥에서 티커 데이터를 생성하는 방법

기본 K선에서 모의티커를 생성하는 메커니즘은 MT4와 동일하다.

발명가의 정량적 시뮬레이션 레벨 백테스팅 메커니즘 설명 발명가의 정량적 시뮬레이션 레벨 백테스팅 메커니즘 설명 발명가의 정량적 시뮬레이션 레벨 백테스팅 메커니즘 설명 발명가의 정량적 시뮬레이션 레벨 백테스팅 메커니즘 설명

  • ### 5, 틱러 데이터를 생성하는 알고리즘 코드

기본 K선 데이터를 모의하는 tick 데이터의 구체적인 알고리즘:

function recordsToTicks(period, num_digits, records) {
    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
}

따라서, 시퀀스 상의 가격 변동은 시뮬레이션 레벨 재검토를 사용할 때 발생합니다.