워렌 버핏의 멘토인 벤자민 그레이엄은 "지혜로운 투자자"라는 책에서 주식과 채권의 동적 균형 거래 방식을 언급했다.이 거래 모델은 매우 간단합니다.
이 방법에서는 채권펀드의 변동률이 주식 변동률보다 훨씬 낮기 때문에, 채권은 여기서 '반응 유동'으로 간주된다. 즉, 채권으로 주가가 너무 많이 벌어지고, 너무 적게 벌어지는지 측정한다.
주식 가격이 상승하면 주식의 시가치가 채권의 시가치보다 커지고, 두 가지의 시가치 비율이 설정된 문턱을 초과하면 전체 지위를 재조정하여 주식을 판매하고 채권을 구입하여 주식 채권 시가치 비율을 초기 1:1로 되돌립니다.
반대로, 주식 가격이 하락하면 주식의 시가치가 채권의 시가치보다 작아지며, 두 가지의 시가치 비율이 설정된 문턱을 초과하면 총 포지션이 재조정되어 주식을 구입하고 채권을 판매하여 주식 채권 시가치 비율이 초기 1:1로 돌아갑니다.
따라서 동적 균형 주식과 채권 사이의 비율은 주식 성장의 열매를 누릴 수 있고 자산의 변동성을 줄일 수 있습니다. 가치 투자의 선구자로서 그레이엄은 우리에게 좋은 아이디어를 제공합니다. 이것이 완전한 전략이기 때문에 왜 디지털 통화에서 그것을 사용하지 않을까요?
블록체인 자산인 BTC의 동적 균형 전략
전략적 논리
따라서, BTC가 부가가치나 부가가치에 상관없이, 항상 동적으로 BTC의 시장 가치와 동일한 계좌 잔액을 유지합니다. BTC가 부가가치되면 몇 개를 구입하고, 다시 부가가치로 돌아와서 더 많은 것을 판매합니다.
그래서, 어떻게 코드를 사용해서 이 일을 할 수 있을까요? 우리는 발명가들의 양적 거래 플랫폼을 예로 들겠습니다.
// 撤单函数
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); // 休眠
}
}
전체 정책 프레임워크는 매우 간단합니다. 메인 메인 함수, 온틱 하위 함수,
// 下单函数
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% 이상이다. 이렇게 간단한 투자 전략의 수익률은 대부분의 힙합 대중보다 훨씬 높다.
전략의 소스 코드는 발명자 정량화 웹사이트에 공개되었습니다.https://www.fmz.com/strategy/110545온라인 리테이크를 직접 설정할 필요가 없습니다.
이 문서의 동적 평형 전략은 하나의 핵심 매개 변수 (threshold threshold) 를 가지고 있으며, 초과 수익을 추구하는 것이 아니라 안정적인 수익을 추구하는 매우 간단한 투자 방법이다. 트렌드 전략과는 달리 동적 평형 전략은 역동적이다. 동적 평형 전략은 반대로, 시장이 뜨겁을 때 주식을 낮추고, 시장이 맑을 때 주식을 올리고, 거시경제 규제와 비슷하다.
사실, 동적 균형 전략은 가격의 예측불가능성을 고수하고 동시에 가격의 변동을 포착하는 기법이다. 동적 균형 전략의 핵심은 자산 분배 비율을 설정하고 조정하는 것, 그리고 한계값을 유발하는 것이다.
마지막으로, 벤저민 그레이엄의 저서 "The Brilliant Investor"에서 유명한 말을 인용하여 마무리하겠습니다.주식시장은 가치를 정확하게 측정할 수 있는 '중량기'가 아니라, 오히려 '투표기'이며, 수많은 사람들이 하는 결정은 이성적이고 감정적인 혼합물이며, 종종 이 선택과 이성적인 가치평가는 거리가 멀다. 투자의 비법은 가격이 내재적 가치보다 훨씬 낮을 때 투자하고 시장 추세가 회복될 것이라고 믿는 것이다.