Explication du mécanisme de backtest au niveau de simulation FMZ

Auteur:La bonté, Créé: 2020-06-04 09:46:50, Mis à jour: 2023-11-01 20:32:27

img

Architecture des tests par rétroaction

Le programme de backtest de la plate-forme FMZ est un processus de contrôle complet, et le programme polling non-stop selon une certaine fréquence.onTickniveau, et non leonBarUn meilleur appui pour le backtest des stratégies basées sur lesTickerdonnées (stratégies ayant une fréquence de fonctionnement plus élevée).

La différence entre le backtest au niveau de la simulation et le backtest au niveau du marché réel

  • Backtest au niveau de la simulation

Le backtest de niveau de simulation est basé sur les données inférieures de la ligne K du système de backtest, et selon un certain algorithme, l'interpolation des données ticker est simulée dans le cadre des valeurs des prix d'ouverture, de clôture et de clôture les plus élevés, les plus bas de la barre inférieure de la ligne K donnée dans ceBarséries chronologiques.

  • Backtest au niveau du marché réel

Le backtest au niveau du marché réel est les données du niveau réel des tickersBarPour les stratégies basées sur des données de niveau ticker, l'utilisation de backtest au niveau du marché réel est plus proche de la réalité.

Niveau de simulation mécanisme de backtest-ligne inférieure K

Il n'existe pas d'option de ligne K inférieure pour le backtest du marché réel (parce que les données ticker sont réelles, aucune ligne K inférieure n'est nécessaire pour simuler la génération).

Dans le backtest au niveau de la simulation, les données généréestickerLa période de la ligne K inférieure doit être inférieure à la période d'appel de l'API pour obtenir la ligne K lorsque la stratégie est en cours d'exécution. Sinon, en raison du grand cycle de la ligne K inférieure et du nombre insuffisant de tickers générés, les données seront déformées lors de l'appel de l'API pour obtenir la ligne K de la période spécifiée. Lorsque vous utilisez le backtest de la ligne K inférieure à grande période, vous pouvez augmenter de manière appropriée le cycle de la ligne K inférieure.

Comment générer des données de ticker pour la ligne K inférieure

Le mécanisme de génération de tickers simulés sur la ligne K inférieure est le même que le célèbre logiciel de trading MetaTrader 4

img img img img

Code d'algorithme pour la génération de données ticker

Algoritme spécifique pour simuler les données de tick à partir des données inférieures de la ligne 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
}

Par conséquent, lors de l'utilisation du backtest de niveau de simulation, il y aura des sauts de prix dans la série temporelle.


Relationnée

Plus de