
Le mentor de Warren Buffett, Benjamin Graham, a un jour mentionné un modèle de trading d’équilibre dynamique entre les actions et les obligations dans son livre « The Intelligent Investor ».
Ce modèle de trading est très simple :
Dans cette méthode, la volatilité des fonds obligataires est en réalité très faible, bien inférieure à la volatilité des actions, de sorte que les obligations sont utilisées ici comme « ancre de référence », c’est-à-dire en utilisant les obligations pour mesurer si les actions ont trop augmenté. c’est encore trop peu.
Si le cours de l’action augmente, la valeur marchande de l’action sera supérieure à la valeur marchande de l’obligation. Lorsque le ratio de valeur marchande des deux dépasse le seuil fixé, la position totale sera réajustée, l’action sera vendue et l’obligation sera achetée pour ramener le ratio de valeur marchande des actions par rapport à celui des obligations à son niveau initial de 1:1.
Au contraire, si le cours de l’action baisse, la valeur marchande de l’action sera inférieure à la valeur marchande de l’obligation. Lorsque le ratio de valeur marchande des deux dépasse le seuil fixé, la position totale sera réajustée pour acheter des actions et vendre des obligations pour rétablir le ratio de valeur marchande des actions et des obligations à son niveau initial de 1:1.

De cette façon, en équilibrant dynamiquement le ratio entre actions et obligations, il est possible de profiter des fruits de la croissance des actions et de réduire la volatilité des actifs. En tant que pionnier de l’investissement de valeur, Graham nous offre une bonne idée. Puisqu’il s’agit d’une stratégie complète, pourquoi ne pas l’appliquer aux crypto-monnaies ?
Stratégie d’équilibre dynamique dans l’actif blockchain BTC
Logique de stratégie
De cette façon, peu importe que le BTC s’apprécie ou se déprécie, le solde du compte et la valeur marchande du BTC restent toujours égaux. Si le BTC se déprécie, achetez-en, et quand il remonte, vendez-en, comme un solde.
Alors, comment l’implémenter avec du code ? Prenons comme exemple la plateforme de trading quantitative Inventor. Commençons par examiner 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 stratégique est en fait très simple, avec une fonction principale, une fonction de commande onTick, une fonction CancelPendingOrders et les paramètres nécessaires.
// 下单函数
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 trading des ordres est claire et tous les commentaires ont été écrits dans le code. Vous pouvez cliquer sur l’image pour l’agrandir.
Le processus principal est le suivant :
// 撤单函数
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秒
}
}
}
}
Le module d’annulation de commande est encore plus simple, les étapes sont les suivantes :
// 回测环境
/*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 externes

Ensuite, testons cette stratégie simple d’équilibre dynamique pour voir si elle fonctionne. Ce qui suit est un backtest sur les données historiques du BTC, pour votre référence uniquement.
Environnement de backtesting

Performances des backtests

Courbe de backtest

Voici un autre graphique des prix du BTC pour la même période

Au cours de la période de backtest, le BTC a chuté pendant 8 mois, avec une baisse maximale dépassant 70 %, ce qui a amené de nombreux investisseurs à perdre confiance dans les actifs blockchain. Le rendement cumulé de cette stratégie peut atteindre 160 % et le ratio rendement/risque annualisé dépasse 5. Pour une stratégie d’investissement aussi simple, ce retour sur investissement a dépassé celui de la grande majorité des personnes qui misent à fond.
Le code source de la stratégie a été rendu public sur le site officiel d’Inventor Quantitative https://www.fmz.com/strategy/110545. Aucune configuration n’est requise pour le backtesting en ligne direct.
Cette stratégie d’équilibre dynamique n’a qu’un seul paramètre de base (seuil), qui est une méthode d’investissement très simple qui recherche des rendements stables plutôt que des rendements excédentaires. Contrairement à la stratégie de tendance, la stratégie d’équilibre dynamique va à contre-courant de la tendance. La stratégie d’équilibre dynamique est exactement l’inverse. Lorsque le marché est chaud, vous réduisez les positions pour vous calmer, et lorsque le marché est calme, vous augmentez les positions et restez inactif. Cela ressemble un peu à la régulation macroéconomique.
En fait, la stratégie d’équilibre dynamique est une compétence qui adhère au concept selon lequel les prix sont imprévisibles tout en capturant les fluctuations de prix. La clé de la stratégie d’équilibre dynamique est de définir et d’ajuster le ratio de répartition des actifs et le seuil de déclenchement. En raison des contraintes d’espace, il est impossible de tout résumer dans un article. Il faut savoir qu’au-delà des mots, il y a le cœur. L’élément le plus important de la stratégie d’équilibre dynamique est l’idée d’investissement. Vous pouvez même remplacer l’actif BTC unique de cet article par un panier d’actifs blockchain.
Enfin, terminons cet article avec une célèbre citation de Benjamin Graham dans son livre The Intelligent Investor :La bourse n’est pas une « machine à peser » qui peut mesurer avec précision la valeur. C’est plutôt une « machine à voter ». Les décisions prises par d’innombrables personnes sont un mélange de rationalité et d’émotion. Bien souvent, ces choix sont loin d’être jugement de valeur rationnel. 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é va se redresser. ——Benjamin Graham, L’investisseur intelligent