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.Le modèle de transaction est très simple: - Investir 50% de vos fonds dans des fonds d'actions et les 50% restants dans des fonds d'obligations; c'est-à-dire que les actions et les obligations représentent chacune la moitié. - une rééquilibrage des actifs à intervalles fixes ou en fonction des variations 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.
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.
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?
Stratégie d'équilibrage dynamique dans les actifs de la blockchain BTC
La logique stratégique - Le solde du compte est réservé à 5000 yen en espèces et 0,1 BTC selon la valeur actuelle des 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 fixé, 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.
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.
// 下单函数
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: - Obtenir les informations relatives à son compte. - Obtenez les données de Tick. - Calculer le prix de vente des données Tick. - Calculer la différence entre le solde du compte et la valeur marchande des BTC. - Calculer les conditions d'achat et de vente, le prix de la commande, la quantité de la commande. - en bas de l'ordre, et retourne true.
// 撤单函数
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, les étapes sont les suivantes: - Attendez une seconde avant de retirer votre chèque, chaque échange, vous savez. - Continuer d'obtenir l'archive des commandes en suspens, si une anomalie est renvoyée, continuer d'obtenir. - Si l'arbre des commandes en suspens est vide, retournez immédiatement à l'état de retrait. - Si vous avez des commandes en suspens, parcourez l'ensemble de l'arithmétique et retirez-les en fonction du numéro de commande.
// 回测环境
/*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
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
Résultats des tests
La courbe de recul
Encore une fois, le graphique de la tendance du prix du BTC en même temps.
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.
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.
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.