
Warren Buffetts Mentor Benjamin Graham erwähnte in seinem Buch „Der intelligente Investor“ einmal ein Handelsmodell mit dynamischem Gleichgewicht zwischen Aktien und Anleihen.
Dieses Handelsmodell ist sehr einfach:
Bei dieser Methode ist die Volatilität von Anleihefonds tatsächlich sehr gering, viel niedriger als die Volatilität von Aktien, so dass Anleihen hier als „Referenzanker“ verwendet werden, d. h. Anleihen werden verwendet, um zu messen, ob die Aktien zu stark gestiegen sind. Es ist immer noch zu wenig Anstieg.
Wenn der Aktienkurs steigt, ist der Marktwert der Aktie höher als der Marktwert der Anleihe. Wenn das Marktwertverhältnis der beiden den festgelegten Schwellenwert überschreitet, wird die Gesamtposition neu angepasst, die Aktie wird verkauft und Die Anleihe wird gekauft, um das Marktwertverhältnis zwischen Aktien und Anleihen wiederherzustellen und den ursprünglichen Wert von 1:1 zu erreichen.
Im Gegenteil, wenn der Aktienkurs fällt, ist der Marktwert der Aktie geringer als der Marktwert der Anleihe. Wenn das Marktwertverhältnis der beiden den festgelegten Schwellenwert überschreitet, wird die Gesamtposition neu angepasst, um Aktien zu kaufen und Verkaufen Sie Anleihen, um das Marktwertverhältnis zwischen Aktien und Anleihen wieder auf den ursprünglichen Wert von 1:1 zu bringen.

Auf diese Weise ist es durch einen dynamischen Ausgleich des Verhältnisses zwischen Aktien und Anleihen möglich, die Früchte des Aktienwachstums zu genießen und die Volatilität der Vermögenswerte zu reduzieren. Als Pionier des Value Investing gibt uns Graham eine gute Idee. Da es sich hierbei um eine umfassende Strategie handelt, warum wenden wir sie nicht auf Kryptowährungen an?
Dynamische Balance-Strategie im Blockchain-Asset BTC
Strategielogik
Auf diese Weise bleiben der Kontostand und der Marktwert von BTC immer gleich, unabhängig davon, ob BTC im Wert steigt oder fällt. Wenn der Wert von BTC sinkt, kaufen Sie einen Teil, und wenn der Wert wieder steigt, verkaufen Sie einen Teil, genau wie bei einem Guthaben.
Also, wie implementiert man es mit Code? Nehmen wir als Beispiel die Inventor Quantitative Trading Platform. Schauen wir uns zunächst den Strategierahmen an:
// 撤单函数
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); // 休眠
}
}
Der gesamte Strategierahmen ist eigentlich sehr einfach und besteht aus einer Hauptfunktion, einer OnTick-Order-Funktion, einer CancelPendingOrders-Funktion und den erforderlichen Parametern.
// 下单函数
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
}
Die Orderhandelslogik ist klar und alle Kommentare wurden in den Code geschrieben. Sie können auf das Bild klicken, um es zu vergrößern.
Der Hauptprozess ist wie folgt:
// 撤单函数
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秒
}
}
}
}
Das Modul zur Auftragsstornierung ist noch einfacher. Die Schritte sind wie folgt:
// 回测环境
/*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); // 休眠
}
}
Externe Parameter

Als Nächstes testen wir diese einfache dynamische Ausgleichsstrategie, um zu sehen, ob sie funktioniert. Nachfolgend finden Sie einen Backtest der historischen BTC-Daten, der ausschließlich zu Ihrer Information dient.
Backtesting-Umgebung

Backtest-Performance

Backtest-Kurve

Hier ist ein weiteres BTC-Preisdiagramm für den gleichen Zeitraum

Während des Backtest-Zeitraums ist der BTC-Kurs acht Monate lang gefallen, wobei der maximale Rückgang 70 % überstieg, was dazu geführt hat, dass viele Anleger das Vertrauen in Blockchain-Assets verloren haben. Die kumulierte Rendite dieser Strategie beträgt bis zu 160 %, und das annualisierte Rendite-Risiko-Verhältnis liegt bei über 5. Für eine so einfache Anlagestrategie übertrifft diese Kapitalrendite die der überwiegenden Mehrheit der Leute, die alles auf eine Karte setzen.
Der Quellcode der Strategie wurde auf der offiziellen Website von Inventor Quantitative veröffentlicht: https://www.fmz.com/strategy/110545. Für das direkte Online-Backtesting ist keine Konfiguration erforderlich.
Diese dynamische Balance-Strategie hat nur einen Kernparameter (Schwellenwert). Dabei handelt es sich um eine sehr einfache Anlagemethode, die stabile Renditen statt Überrenditen anstrebt. Im Gegensatz zur Trendstrategie geht die dynamische Balancestrategie gegen den Trend. Die dynamische Balance-Strategie ist genau das Gegenteil. Wenn der Markt heiß ist, reduzieren Sie Ihre Positionen, um ihn abzukühlen, und wenn der Markt ruhig ist, erhöhen Sie Ihre Positionen und bleiben inaktiv. Sie ähnelt in gewisser Weise der makroökonomischen Regulierung.
Tatsächlich handelt es sich bei der dynamischen Bilanzstrategie um eine Fähigkeit, die dem Konzept der Unvorhersehbarkeit von Preisen folgt, während Preisschwankungen erfasst werden. Der Schlüssel zur dynamischen Balance-Strategie liegt in der Festlegung und Anpassung der Vermögensallokationsquote und des Auslöseschwellenwerts. Aus Platzgründen ist es unmöglich, in einem Artikel alles abzudecken. Sie müssen wissen, dass hinter den Worten das Herz liegt. Das Wichtigste an der dynamischen Balance-Strategie ist die Anlageidee. Sie können das einzelne BTC-Asset in diesem Artikel sogar durch einen Korb von Blockchain-Assets ersetzen.
Abschließend möchten wir diesen Artikel mit einem berühmten Zitat von Benjamin Graham aus seinem Buch Der intelligente Investor beenden:Die Börse ist keine „Waagemaschine“, die Werte genau messen kann. Stattdessen ist sie eine „Wahlmaschine“. Die Entscheidungen unzähliger Menschen sind eine Mischung aus Rationalität und Emotionen. Oft sind diese Entscheidungen weit davon entfernt, rationales Werturteil. Das Geheimnis des Investierens liegt darin, zu investieren, wenn die Preise weit unter dem inneren Wert liegen, und darauf zu vertrauen, dass sich der Markttrend erholt. ——Benjamin Graham, Der intelligente Investor