avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

発明者の定量シミュレーションレベルのバックテストメカニズムの説明

作成日:: 2017-02-07 13:04:57, 更新日:: 2023-09-07 17:49:15
comments   34
hits   15002

発明者の定量シミュレーションレベルのバックテストメカニズムの説明


  • ### 1 回測構造

発明者による量化反測の策略程序は,完全な制御流程であり,プログラムは一定の周波数に従って絶え間なくアンケートしている.各行情,取引APIが返したデータは,呼び出し時に従って,実際の実行時の状況をシミュレートしている.他の反測システムのonTickレベルではなく,onBarレベルである.よりよいサポートは,Tickerデータに基づく策略による反測操作 (より高い周波数の策略) である.

  • 2. アナログレベルとリッドディスクレベルとの違い

    • #### 模擬レベルの反測

    模擬レベル回測は,回測システムの底層K線データに従って,あるアルゴリズムに従って,与えられた底層K線Barの最高値,最低値,開値,閉値の数値構成の枠内で,ティッカーデータの挿入値をこのBarの時間序列に模擬するものである.

    • #### レディースレベルの反省

    实体レベルの反射は,Barの時間配列に存在する真のティッカーレベルのデータである. ティッカーレベルのデータに基づいた策略では,实体レベルの反射を使用することは,より真実に近い. リアルディスクレベルの反省,tickerはリアルに記録されたデータであり,模擬生成ではない.

  • 3 模擬レベル反射機構 - 底層K線

固形ディスクレベルの反省には底層K線オプションはありません (tickerデータは真であり,底層K線を使用して生成を模擬しません). 模擬レベル反測では,K線データに基づく模擬生成のticker。このK線データは底層K線である。実用的な模擬レベル反測では,底層K線周期は,策略が実行される時にAPIがK線を取得する周期より小さいものでなければならない。そうでなければ,底層K線周期が大きいため,生成されたtickerの数が不十分で,APIが指定された周期のK線を取得するときに,データが誤りになる場合がある。大周期K線反測を使用すると,適切な底層K線周期を調節することができる。

  • ### 4 底層K線がtickerデータを生成する

底層の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
}

したがって,模擬レベル反射を使用すると,時系列上の価格の波動が発生します.