
워렌 버핏의 멘토인 벤저민 그레이엄은 그의 책 “지능적인 투자자”에서 주식과 채권 간의 동적 균형 거래 모델을 언급한 적이 있습니다.
이 거래 모델은 매우 간단합니다.
이 방법에서 채권 펀드의 변동성은 실제로 매우 작아 주식의 변동성보다 훨씬 낮기 때문에 채권을 여기서 “참조 앵커”로 사용합니다. 즉, 채권을 사용하여 주식이 너무 많이 상승했는지 측정합니다. 증가 아직도 너무 적습니다.
주가가 상승하면 주식의 시장가치는 채권의 시장가치보다 더 클 것입니다. 두 가지의 시장가치 비율이 설정된 임계값을 초과하면 전체 포지션이 재조정되고 주식이 매도되고 채권을 매수하여 주식과 채권의 시장가치 비율을 원래 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); // 休眠
}
}
전체 전략 프레임워크는 실제로 매우 간단합니다. main 함수, 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의 공식 웹사이트 https://www.fmz.com/strategy/110545에 공개되었습니다. 직접 온라인 백테스팅에는 구성이 필요하지 않습니다.
이러한 동적 밸런스 전략은 핵심 매개변수(임계값)가 하나뿐인 매우 간단한 투자 방법으로, 과도한 수익보다는 안정적인 수익을 추구하는 방식입니다. 추세 전략과 대조적으로 동적 균형 전략은 추세에 반하는 전략을 취합니다. 동적 균형 전략은 정반대입니다. 시장이 뜨거울 때는 포지션을 줄여 식히고, 시장이 조용할 때는 포지션을 늘리고 휴면 상태를 유지합니다. 거시경제 규제와 다소 비슷합니다.
실제로 동적 균형 전략은 가격 변동을 포착하는 동시에 가격은 예측 불가능하다는 개념을 고수하는 기술입니다. 동적 균형 전략의 핵심은 자산 배분 비율과 트리거 임계값을 설정하고 조정하는 것입니다. 공간 제약으로 인해 기사가 모든 것을 다루는 것은 불가능합니다. 단어 너머에 마음이 있다는 것을 알아야 합니다. 동적 균형 전략에서 가장 중요한 것은 투자 아이디어입니다. 이 기사의 단일 BTC 자산을 블록체인 자산 바구니로 대체할 수도 있습니다.
마지막으로, Benjamin Graham의 저서 The Intelligent Investor에서 인용한 유명한 말로 이 기사를 마무리해 보겠습니다.주식 시장은 가치를 정확하게 측정할 수 있는 “저울”이 아닙니다. 대신 “투표 기계”입니다. 수많은 사람들이 내리는 결정은 합리성과 감정의 혼합입니다. 많은 경우 이러한 선택은 It is far from 합리적인 가치 판단. 투자의 비결은 가격이 내재적 가치보다 훨씬 낮을 때 투자하고, 시장 추세가 회복될 것이라고 믿는 것입니다. ——벤저민 그레이엄, 지적인 투자자