Stratégie d'équilibrage dynamique basée sur la monnaie numérique

Auteur: , Créé: 2020-03-03 10:17:43, Mis à jour: 2023-10-09 22:49:27

img

Première partie:

Benjamin Graham, le mentor de Warren Buffett, a mentionné un modèle de négociation de l'équilibre dynamique des actions et des obligations dans son livre L'investisseur intelligent.imgLe modèle de transaction est très simple:

  • Les investisseurs investissent 50% de leur capital dans des fonds d'actions et 50% dans des fonds de titres, soit la moitié des titres et des titres.
  • Une rééquilibrage des actifs est effectuée à intervalles fixes ou en fonction des changements du marché, ramenant le ratio entre les actifs en actions et les actifs en obligations à son niveau initial de 1:1. C'est la logique de toute la stratégie, y compris quand acheter et combien acheter.

Deuxième principe de l'équilibre dynamique

Dans cette approche, les taux de volatilité des fonds obligataires sont en fait très faibles, bien inférieurs à ceux des actions, de sorte que les obligations sont considérées ici comme des "paras de référence", c'est-à-dire que les obligations sont utilisées pour mesurer si les actions gagnent trop ou trop peu.

Si une hausse du prix d'une action rend la valeur marchande de cette dernière plus élevée que celle de la dette, le ratio entre les deux est révisé lorsque la valeur marchande est supérieure au seuil fixé.

En revanche, une baisse du prix des actions rend la valeur marchande des actions inférieure à celle des obligations, et lorsque le ratio entre les deux est supérieur au seuil fixé, la position globale est révisée, les actions achetées et les obligations vendues, ramenant le ratio entre les actions et les obligations à 1:1.img

Ainsi, en équilibrant dynamiquement les ratios entre les actions et les obligations, on peut profiter des fruits de la croissance des actions et réduire la volatilité des actifs. Graham nous a donné une bonne idée en tant que pionnier de l'investissement en valeur. Puisque c'est une stratégie complète, pourquoi ne pas l'utiliser avec la monnaie numérique?

Troisièmement, la logique stratégique

Stratégie d'équilibrage dynamique dans les actifs de la blockchain BTC

La logique stratégique

  • Selon la valeur actuelle des BTC, le solde du compte est réservé à 5000 yen en espèces et 0,1 BTC, soit un ratio initial de 1:1 entre la valeur de l'argent et la valeur marchande des BTC.
  • Si le prix du BTC atteint ¥6000, c'est-à-dire que la valeur marchande du BTC est supérieure au solde du compte et que la différence entre les deux est supérieure au seuil de conversion, vendre ((6000-5000) / 6000/2 pièces.
  • Si le prix du BTC tombe à ¥ 4000, c'est-à-dire que la valeur marchande du BTC est inférieure au solde du compte, et que la différence entre les deux dépasse le seuil fixé, achetez ((5000-4000)/4000/2 pièces.

De cette façon, que BTC soit valorisé ou dévalué, le solde de compte est toujours dynamiquement égal à la valeur marchande de BTC. Si BTC est dévalué, achetez-en un peu, puis vendez-en un peu, comme si c'était normal.

Quatre, le cadre stratégique

Alors, comment le faire avec du code? Prenons l'exemple de la plateforme de trading quantitative inventée par les inventeurs, voyons d'abord le cadre stratégique:

// 撤单函数
function CancelPendingOrders() {}

// 下单函数
function onTick() {}

// 主函数
function main() {
    // 过滤非重要信息
    SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
    while (true) { // 轮询模式
        if (onTick()) { // 执行 onTick 函数
            CancelPendingOrders(); // 取消未成交的挂单
            Log(_C(exchange.GetAccount)); // 打印当前账户信息
        }
        Sleep(LoopInterval * 1000); // 休眠
    }
}

L'ensemble du cadre de stratégie est en fait très simple, avec une fonction principale, une fonction de sous-menu onTick, une fonction CancelPendingOrders et les paramètres nécessaires.

Cinquièmement, le module suivant

// 下单函数
function onTick() {
    var acc = _C(exchange.GetAccount); // 获取账户信息
    var ticker = _C(exchange.GetTicker); // 获取 Tick 数据
    var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差
    // 账户余额与当前持仓价值的差值的 0.5倍
    var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
    var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额
    LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间
    if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值
        return false; // 返回 false
    }
    if (ratio > 0) { // 如果 ratio大于 0
        var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格
        var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量
        if (buyAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单
    } else {
        var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格
        var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量
        if (sellAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单
    }
    return true; // 返回 true
}

La logique de transaction est claire, toutes les annotations sont écrites dans le code, cliquez sur l'image pour l'agrandir.

Les principaux processus sont les suivants:

  • Vous pouvez obtenir des informations sur votre compte.
  • Pour obtenir les données de Tick.
  • Le prix de vente des données de Tick est différent.
  • Le calcul du solde du compte et de la différence de valeur marchande des BTC.
  • Les conditions de vente, le prix de la commande et la quantité de la commande sont calculés.
  • Le résultat de la requête est le même que celui de la requête.

6ème, le module de retrait

// 撤单函数
function CancelPendingOrders() {
    Sleep(1000); // 休眠 1秒
    var ret = false;
    while (true) {
        var orders = null;
        // 持续获取未成交订单数组,如果返回异常,则继续获取
        while (!(orders = exchange.GetOrders())) {
            Sleep(1000); // 休眠 1秒
        }
        if (orders.length == 0) { // 如果订单数组为空
            return ret; // 返回撤单状态
        }
        for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组
            exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单
            ret = true;
            if (j < (orders.length - 1)) {
                Sleep(1000); // 休眠 1秒
            }
        }
    }
}

Il est plus facile de retirer les modules en suivant les étapes suivantes:

  • Il faut attendre une seconde avant de retirer son chèque, les échanges individuels, vous savez.
  • Continuer d'obtenir l'archive des commandes en suspens, si une anomalie est renvoyée.
  • Si l'arbre des commandes en suspens est vide, il renvoie immédiatement l'état de retrait.
  • S'il y a des commandes en suspens, parcourez l'ensemble de l'arithmétique et retirez-les en fonction du numéro de commande.

Sept, le code source complet de la stratégie

// 回测环境
/*backtest
start: 2018-01-01 00:00:00
end: 2018-08-01 11:00:00
period: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/



// 撤单函数
function CancelPendingOrders() {
    Sleep(1000); // 休眠 1秒
    var ret = false;
    while (true) {
        var orders = null;
        // 持续获取未成交订单数组,如果返回异常,则继续获取
        while (!(orders = exchange.GetOrders())) {
            Sleep(1000); // 休眠 1秒
        }
        if (orders.length == 0) { // 如果订单数组为空
            return ret; // 返回撤单状态
        }
        for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组
            exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单
            ret = true;
            if (j < (orders.length - 1)) {
                Sleep(1000); // 休眠 1秒
            }
        }
    }
}

// 下单函数
function onTick() {
    var acc = _C(exchange.GetAccount); // 获取账户信息
    var ticker = _C(exchange.GetTicker); // 获取 Tick 数据
    var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差
    // 账户余额与当前持仓价值的差值的 0.5倍
    var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
    var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额
    LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间
    if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值
        return false; // 返回 false
    }
    if (ratio > 0) { // 如果 ratio大于 0
        var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格
        var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量
        if (buyAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单
    } else {
        var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格
        var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量
        if (sellAmount < MinStock) { // 如果下单量小于最小交易量
            return false; // 返回 false
        }
        exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单
    }
    return true; // 返回 true
}

// 主函数
function main() {
    // 过滤非重要信息
    SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
    while (true) { // 轮询模式
        if (onTick()) { // 执行 onTick 函数
            CancelPendingOrders(); // 取消未成交的挂单
            Log(_C(exchange.GetAccount)); // 打印当前账户信息
        }
        Sleep(LoopInterval * 1000); // 休眠
    }
}

Paramètres extérieurs img

8 - Résultats stratégiques

Maintenant, essayons cette simple stratégie d'équilibrage dynamique et voyons si cela fonctionne. Voici un résumé des données historiques de BTC, à titre de référence.

Résultats du test img

Résultats des tests img

La courbe de recul img

Encore une fois, le graphique de la tendance du prix du BTC en même temps.img

Au cours de la période d'évaluation, BTC a connu une baisse de plus de 8 mois, avec une baisse maximale de plus de 70%, ce qui a conduit de nombreux investisseurs à perdre confiance dans les actifs de la blockchain. Cette stratégie a un rendement cumulé de 160% et un risque de rendement annuel de plus de 5%. Pour une stratégie d'investissement aussi simple, le retour sur investissement est déjà supérieur à la majorité des hippies.

Neuf, obtenir le code source de la stratégie

Le code source de la stratégie est disponible sur le site Web de l'inventeur.https://www.fmz.com/strategy/110545Il n'est pas nécessaire de configurer le test en ligne directement.

10 Résumé

Cette stratégie d'équilibrage dynamique, qui ne comporte qu'un seul paramètre central (le seuil de dévaluation), est une méthode d'investissement très simple, qui ne cherche pas à obtenir des gains excessifs, mais à obtenir des gains solides. Contrairement à la stratégie de tendance, la stratégie d'équilibrage dynamique est un mouvement inverse.

En fait, la stratégie d'équilibrage dynamique est une stratégie qui s'appuie sur l'idée de l'imprévisibilité des prix, tout en capturant les fluctuations des prix. Le cœur clé de la stratégie d'équilibrage dynamique est de définir et d'ajuster les ratios d'allocation des actifs et de déclencher des seuils.

Pour finir, terminons par une citation célèbre de Benjamin Graham dans son livre L'Investisseur astucieux:Le marché boursier n'est pas une balance de valeurs, mais plutôt une machine à voter, où les décisions prises par d'innombrables personnes sont un mélange de choix rationnels et émotionnels, souvent très éloignés l'un de l'autre. Le secret de l'investissement est d'investir lorsque les prix sont bien inférieurs à la valeur intrinsèque et de croire que la tendance du marché rebondira.Benjamin Graham est un investisseur brillant.


Relationnée

Plus de