
ウォーレン・バフェットの師であるベンジャミン・グレアムは、著書『賢明なる投資家』の中で、株式と債券の動的バランスの取引モデルについて言及したことがあります。
この取引モデルは非常にシンプルです。
この方法では、債券ファンドのボラティリティは実際には非常に小さく、株式のボラティリティよりもはるかに低いため、債券は「参照アンカー」として使用され、つまり債券を使用して株式が上昇しすぎているかどうかを測定します。まだ少なすぎます。
株価が上昇すると、株式の時価総額が債券の時価総額を上回ることになります。両者の時価総額比率が設定された閾値を超えると、総ポジションが再調整され、株式が売却され、株式と債券の時価比率を元の1:1に戻すために債券が購入されます。
逆に株価が下落すると、株式の時価総額は債券の時価総額を下回ります。両者の時価総額比率が設定された閾値を超えると、株式を買い増す方向にポジションが再調整されます。債券を売却して株式と債券の時価比率を元の1:1に戻します。

このように、株式と債券の比率を動的にバランスさせることで、株式の成長の果実を享受し、資産のボラティリティを抑えることが可能です。バリュー投資の先駆者として、グレアムは私たちに良いアイデアを提供しています。これは完全な戦略なので、暗号通貨に適用してみませんか?
ブロックチェーン資産BTCにおけるダイナミックバランス戦略
戦略ロジック
このように、BTC が値上がりしても値下がりしても、口座残高と BTC の市場価値は常に等しく保たれます。 BTC が下落した場合は、一部を購入し、再び上昇したら、残高と同じように一部を売却します。
では、コードでそれを実装するにはどうすればよいでしょうか? 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 関数、および必要なパラメータで構成されており、実は非常にシンプルです。
// 下单函数
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 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秒
}
}
}
}
注文キャンセル モジュールはさらに簡単で、手順は次のとおりです。
// 回测环境
/*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); // 休眠
}
}
外部パラメータ

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

バックテストのパフォーマンス

バックテスト曲線

同じ期間の別のBTC価格チャートはこちらです

バックテスト期間中、BTCは8か月間も下落し、最大で70%を超える下落となり、多くの投資家がブロックチェーン資産への信頼を失っています。この戦略の累積リターンは 160% にも達し、年率リターンリスク比は 5 を超えます。このようなシンプルな投資戦略であるにもかかわらず、この投資収益率は、全額投資する大多数の人々の投資収益率を上回りました。
戦略ソースコードは、Inventor Quantitative の公式 Web サイト https://www.fmz.com/strategy/110545 で公開されています。直接オンライン バックテストを行うには、設定は必要ありません。
このダイナミックバランス戦略は、コアパラメータ(閾値)が 1 つだけであり、超過収益ではなく安定収益を追求する非常にシンプルな投資手法です。トレンド戦略とは対照的に、ダイナミックバランス戦略はトレンドに逆らいます。ダイナミックバランス戦略は、まさにその逆です。市場が活況なときは、ポジションを減らして冷静になり、市場が静かであれば、ポジションを増やして休眠状態になります。これは、マクロ経済の規制に似ています。
実際、ダイナミックバランス戦略は、価格変動を捉えながら価格は予測不可能であるという概念を忠実に守るスキルです。ダイナミックバランス戦略の鍵となるのは、資産配分比率とトリガーしきい値の設定と調整です。スペースの制約上、記事ですべてを網羅することは不可能です。言葉の向こうに、心があることを知っておく必要があります。ダイナミックバランス戦略で最も重要なことは、投資のアイデアです。この記事の単一の BTC 資産を、ブロックチェーン資産のバスケットに置き換えることもできます。
最後に、ベンジャミン・グレアムの著書『賢明なる投資家』の有名な引用でこの記事を締めくくりたいと思います。株式市場は価値を正確に測定できる「計量機」ではありません。むしろ「投票機」です。無数の人々が下す決定は、合理性と感情が混ざり合ったものです。多くの場合、これらの選択は、合理的な価値判断。投資の秘訣は、価格が本質的価値をはるかに下回っているときに投資し、市場のトレンドが回復すると信じることである。 ——ベンジャミン・グレアム『賢明なる投資家』