avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

デジタル通貨に基づくダイナミックバランス戦略

作成日:: 2020-03-03 10:17:43, 更新日:: 2023-10-09 22:49:27
comments   3
hits   3707

デジタル通貨に基づくダイナミックバランス戦略

1. 要約

ウォーレン・バフェットの師であるベンジャミン・グレアムは、著書『賢明なる投資家』の中で、株式と債券の動的バランスの取引モデルについて言及したことがあります。 デジタル通貨に基づくダイナミックバランス戦略 この取引モデルは非常にシンプルです。

  • 資金の 50% を株式ファンドに投資し、残りの 50% を債券ファンドに投資します。つまり、株式と債券がそれぞれ半分ずつを占めていることになります。
  • 一定の間隔で、または市場の変化に基づいて資産のバランスを調整し、株式資産と債券資産の比率を当初の 1:1 に戻します。 これは、いつ売買するか、どれだけの量を売買するかなど、戦略の全体的なロジックです。とても簡単です!

2. 動的バランス原理

この方法では、債券ファンドのボラティリティは実際には非常に小さく、株式のボラティリティよりもはるかに低いため、債券は「参照アンカー」として使用され、つまり債券を使用して株式が上昇しすぎているかどうかを測定します。まだ少なすぎます。

株価が上昇すると、株式の時価総額が債券の時価総額を上回ることになります。両者の時価総額比率が設定された閾値を超えると、総ポジションが再調整され、株式が売却され、株式と債券の時価比率を元の1:1に戻すために債券が購入されます。

逆に株価が下落すると、株式の時価総額は債券の時価総額を下回ります。両者の時価総額比率が設定された閾値を超えると、株式を買い増す方向にポジションが再調整されます。債券を売却して株式と債券の時価比率を元の1:1に戻します。 デジタル通貨に基づくダイナミックバランス戦略

このように、株式と債券の比率を動的にバランスさせることで、株式の成長の果実を享受し、資産のボラティリティを抑えることが可能です。バリュー投資の先駆者として、グレアムは私たちに良いアイデアを提供しています。これは完全な戦略なので、暗号通貨に適用してみませんか?

3. 戦略ロジック

ブロックチェーン資産BTCにおけるダイナミックバランス戦略

戦略ロジック

  • 現在のBTCの価値に応じて、口座残高は現金5000円とBTC 0.1になります。つまり、現金とBTCの市場価値の初期比率は1:1です。
  • BTCの価格が6000円まで上昇した場合、つまりBTCの時価が口座残高より大きくなり、その差額が設定された閾値を超えた場合、(6000-5000)/6000/2コインが売却されます。これは、BTC の価値が上昇し、お金を交換できることを意味します。
  • BTCの価格が4000円まで下がった場合、つまりBTCの時価が口座残高を下回り、その差額が設定された閾値を超えた場合は、(5000-4000)/4000/2コインを購入します。これは、BTC の価値が下がったことを意味するので、BTC を買い戻します。

このように、BTC が値上がりしても値下がりしても、口座残高と BTC の市場価値は常に等しく保たれます。 BTC が下落した場合は、一部を購入し、再び上昇したら、残高と同じように一部を売却します。

4. 戦略フレームワーク

では、コードでそれを実装するにはどうすればよいでしょうか? Inventor Quantitative Trading Platform を例に挙げてみましょう。まず、戦略フレームワークを見てみましょう。

// 撤单函数
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); // 休眠
    }
}

戦略フレームワーク全体は、メイン関数、onTick 注文関数、CancelPendingOrders 関数、および必要なパラメータで構成されており、実は非常にシンプルです。

5. 注文モジュール

// 下单函数
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
}

注文取引ロジックは明確で、すべてのコメントがコードに書き込まれています。画像をクリックすると拡大できます。

主なプロセスは次のとおりです。

  • アカウント情報を取得します。
  • ティックデータを取得します。
  • ティックデータに基づいてビッド・アスク・スプレッドを計算します。
  • 口座残高と BTC 市場価値の差を計算します。
  • 売買条件、注文価格、注文数量を計算します。
  • 注文を出して true を返します。

6. 注文キャンセルモジュール

// 撤单函数
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秒
            }
        }
    }
}

注文キャンセル モジュールはさらに簡単で、手順は次のとおりです。

  • 注文をキャンセルする前に 1 秒待ってください。これは一部の取引所で問題になることがあります。
  • 未処理の注文の配列の取得を続行します。例外が返された場合は、取得を続行します。
  • 未処理の注文の配列が空の場合、注文のキャンセルステータスが直ちに返されます。
  • 未処理の注文がある場合は、配列全体が走査され、注文番号に従って注文が 1 つずつキャンセルされます。

7. 完全な戦略ソースコード

// 回测环境
/*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); // 休眠
    }
}

外部パラメータ デジタル通貨に基づくダイナミックバランス戦略

8. 戦略バックテスト

次に、この単純な動的バランス戦略が機能するかどうかをテストしてみましょう。以下は、BTC の履歴データに基づくバックテストです。参考用です。

バックテスト環境 デジタル通貨に基づくダイナミックバランス戦略

バックテストのパフォーマンス デジタル通貨に基づくダイナミックバランス戦略

バックテスト曲線 デジタル通貨に基づくダイナミックバランス戦略

同じ期間の別のBTC価格チャートはこちらです デジタル通貨に基づくダイナミックバランス戦略

バックテスト期間中、BTCは8か月間も下落し、最大で70%を超える下落となり、多くの投資家がブロックチェーン資産への信頼を失っています。この戦略の累積リターンは 160% にも達し、年率リターンリスク比は 5 を超えます。このようなシンプルな投資戦略であるにもかかわらず、この投資収益率は、全額投資する大多数の人々の投資収益率を上回りました。

9. 戦略ソースコードを取得する

戦略ソースコードは、Inventor Quantitative の公式 Web サイト https://www.fmz.com/strategy/110545 で公開されています。直接オンライン バックテストを行うには、設定は必要ありません。

10. 結論

このダイナミックバランス戦略は、コアパラメータ(閾値)が 1 つだけであり、超過収益ではなく安定収益を追求する非常にシンプルな投資手法です。トレンド戦略とは対照的に、ダイナミックバランス戦略はトレンドに逆らいます。ダイナミックバランス戦略は、まさにその逆です。市場が活況なときは、ポジションを減らして冷静になり、市場が静かであれば、ポジションを増やして休眠状態になります。これは、マクロ経済の規制に似ています。

実際、ダイナミックバランス戦略は、価格変動を捉えながら価格は予測不可能であるという概念を忠実に守るスキルです。ダイナミックバランス戦略の鍵となるのは、資産配分比率とトリガーしきい値の設定と調整です。スペースの制約上、記事ですべてを網羅することは不可能です。言葉の向こうに、心があることを知っておく必要があります。ダイナミックバランス戦略で最も重要なことは、投資のアイデアです。この記事の単一の BTC 資産を、ブロックチェーン資産のバスケットに置き換えることもできます。

最後に、ベンジャミン・グレアムの著書『賢明なる投資家』の有名な引用でこの記事を締めくくりたいと思います。株式市場は価値を正確に測定できる「計量機」ではありません。むしろ「投票機」です。無数の人々が下す決定は、合理性と感情が混ざり合ったものです。多くの場合、これらの選択は、合理的な価値判断。投資の秘訣は、価格が本質的価値をはるかに下回っているときに投資し、市場のトレンドが回復すると信じることである。 ——ベンジャミン・グレアム『賢明なる投資家』