FMZ量子シミュレーションレベル バックテスト メカニズム説明

作者: リン・ハーンニナバダス, 作成日: 2022-03-23 10:07:18, 更新日: 2022-03-28 14:31:37

FMZ量子シミュレーションレベル バックテスト メカニズム説明


  • 1.バックテストの枠組み

    FMZ Quant バックテストにおける戦略プログラムでは,戦略プログラムは完全な制御フローであり,プログラムは一定の頻度に従って常にアンケートされます.プラットフォーム API によって返されるすべての市場コートとデータは,コールタイムに応じて実際の実行時の状況をシミュレートします. バックテストは他のバックテストシステムのオンバーレベルではなく,オンティックレベルに属します.それはTicker データ (より高い動作頻度を持つ戦略) をベースにした戦略のバックテストをよりよくサポートします.

  • 2. シミュレーションレベルと実際の市場レベルとの違い

    • シミュレーションレベル

      シミュレーションレベルバックテストは,バックテストシステムの底層K線データに基づい,特定のアルゴリズムに従って,基礎となるK線バーの最高価格,最低価格,オープン価格,閉鎖価格から構成された枠内で,このバーの時間列にティッカーデータの挿入をシミュレートします.

    • リアル市場レベル

      リアルマーケットレベルバックテストは,バーの時間列における実際のティッカーレベルデータである.ティッカーレベルデータに基づく戦略では,リアルマーケットレベルバックテストを使用することは現実に近い. 実際の市場レベルのバックテストでは,ティッカーは実際に記録されたデータで,シミュレーションではありません.

  • 3.シミュレーションレベルバックテストメカニズム 底層K線

    実際の市場レベルバックテストには,底層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
}

したがって,シミュレーションレベルバックテストを実行すると,時間系列で価格が動きます.


もっと