Benjamin Graham, người cố vấn của Warren Buffett, đã đề cập đến một chế độ giao dịch cân bằng năng động của cổ phiếu và trái phiếu trong cuốn sách
Phương thức giao dịch rất đơn giản: - Đầu tư 50% quỹ vào quỹ cổ phiếu và 50% còn lại vào quỹ trái phiếu. nghĩa là cổ phiếu và trái phiếu chiếm một nửa của nhau. - Theo khoảng thời gian cố định hoặc thay đổi thị trường, thực hiện tái cân bằng tài sản để khôi phục tỷ lệ tài sản cổ phiếu và tài sản trái phiếu trở lại mức ban đầu 1: 1. Đây là logic của toàn bộ chiến lược, bao gồm cả khi nào mua và bán và bao nhiêu để mua và bán.
Trong phương pháp này, sự biến động của quỹ trái phiếu thực sự rất nhỏ, thấp hơn nhiều so với sự biến động của cổ phiếu, vì vậy trái phiếu được sử dụng như là
Chiến lược cân bằng năng động trong tài sản blockchain BTC
Chiến lược logic
Bằng cách này, bất kể BTC có tăng hay giảm giá, chúng tôi luôn giữ số dư tài khoản và giá trị thị trường của BTC bằng động. Nếu BTC giảm giá, chúng tôi mua, và nếu nó tăng lại, chúng tôi bán một số, giống như số dư.
Vì vậy, làm thế nào để thực hiện nó trong mã? Chúng ta lấy nền tảng giao dịch FMZ Quant như một ví dụ, hãy xem xét khung chiến lược đầu tiên:
// function to cancel orders
function CancelPendingOrders() {}
// function to place an order
function onTick() {}
// main function
function main() {
// filter non-important information
SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
while (true) { // polling mode
if (onTick()) { // execute onTick function
CancelPendingOrders(); // cancel the outstanding pending orders
Log(_C(exchange.GetAccount)); // print the current account information
}
Sleep(LoopInterval * 1000); // sleep
}
}
Toàn bộ khuôn khổ chiến lược là rất đơn giản thực sự, bao gồm một chức năng chính, một chức năng đặt hàng onTick, một chức năng hủy PendingOrders, và các thông số cần thiết.
// order-placing function
function onTick() {
var acc = _C(exchange.GetAccount); // obtain account information
var ticker = _C(exchange.GetTicker); // obtain Tick data
var spread = ticker.Sell - ticker.Buy; // obtain bid ask spread of Tick data
// 0.5 times of the difference between the account balance and the current position value
var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
var ratio = diffAsset / acc.Balance; // diffAsset / account balance
LogStatus('ratio:', ratio, _D()); // Print ratio and current time
if (Math.abs(ratio) < threshold) { // If the absolute value of the ratio is less than the specified threshold
return false; // return false
}
if (ratio > 0) { // if ratio > 0
var buyPrice = _N(ticker.Sell + spread, ZPrecision); // Calculate the price of an order
var buyAmount = _N(diffAsset / buyPrice, XPrecision); // Calculate the order quantity
if (buyAmount < MinStock) { // If the order quantity is less than the minimum transaction quantity
return false; // return false
}
exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // Purchase order
} else {
var sellPrice = _N(ticker.Buy - spread, ZPrecision); // Calculate the price of an order
var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // Calculate the order quantity
if (sellAmount < MinStock) { // If the order quantity is less than the minimum transaction quantity
return false; // return false
}
exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // Sell and place an order
}
return true; // return true
}
Các logic giao dịch lệnh được tổ chức tốt, và tất cả các bình luận đã được viết vào mã.
Quá trình chính là như sau:
// Withdrawal function
function CancelPendingOrders() {
Sleep(1000); // Sleep for 1 second
var ret = false;
while (true) {
var orders = null;
// Obtain the unsettled order array continuously. If an exception is returned, continue to obtain
while (!(orders = exchange.GetOrders())) {
Sleep(1000); // Sleep for 1 second
}
if (orders.length == 0) { // If the order array is empty
return ret; // Return to order withdrawal status
}
for (var j = 0; j < orders.length; j++) { // Iterate through the array of unfilled orders
exchange.CancelOrder(orders[j].Id); // Cancel unfilled orders in sequence
ret = true;
if (j < (orders.length - 1)) {
Sleep(1000); // Sleep for 1 second
}
}
}
}
Mô-đun rút tiền đơn giản hơn.
// Backtest environment
/*backtest
start: 2018-01-01 00:00:00
end: 2018-08-01 11:00:00
period: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
// Order withdrawal function
function CancelPendingOrders() {
Sleep(1000); // Sleep for 1 second
var ret = false;
while (true) {
var orders = null;
// Obtain the unsettled order array continuously. If an exception is returned, continue to obtain
while (!(orders = exchange.GetOrders())) {
Sleep(1000); // Sleep for 1 second
}
if (orders.length == 0) { // If the order array is empty
return ret; // Return to order withdrawal status
}
for (var j = 0; j < orders.length; j++) { // Iterate through the array of unfilled orders
exchange.CancelOrder(orders[j].Id); // Cancel unfilled orders in sequence
ret = true;
if (j < (orders.length - 1)) {
Sleep(1000); // Sleep for 1 second
}
}
}
}
// Order function
function onTick() {
var acc = _C(exchange.GetAccount); // obtain account information
var ticker = _C(exchange.GetTicker); // obtain Tick data
var spread = ticker.Sell - ticker.Buy; // obtain bid ask spread of Tick data
// 0.5 times of the difference between the account balance and the current position value
var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
var ratio = diffAsset / acc.Balance; // diffAsset / account balance
LogStatus('ratio:', ratio, _D()); // Print ratio and current time
if (Math.abs(ratio) < threshold) { // If the absolute value of ratio is less than the specified threshold
return false; // return false
}
if (ratio > 0) { // if ratio > 0
var buyPrice = _N(ticker.Sell + spread, ZPrecision); // Calculate the order price
var buyAmount = _N(diffAsset / buyPrice, XPrecision); // Calculate the order quantity
if (buyAmount < MinStock) { // If the order quantity is less than the minimum trading quantity
return false; // return false
}
exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // buy order
} else {
var sellPrice = _N(ticker.Buy - spread, ZPrecision); // Calculate the order price
var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // Calculate the order quantity
if (sellAmount < MinStock) { // If the order quantity is less than the minimum trading quantity
return false; // return false
}
exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // sell order
}
return true; // return true
}
// main function
function main() {
// Filter non-important information
SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
while (true) { // Polling mode
if (onTick()) { // Execute onTick function
CancelPendingOrders(); // Cancel pending orders
Log(_C(exchange.GetAccount)); // Print current account information
}
Sleep(LoopInterval * 1000); // sleep
}
}
Các thông số bên ngoài
Tiếp theo, chúng ta hãy kiểm tra chiến lược cân bằng năng động đơn giản này để xem nó có hiệu quả hay không.
Môi trường kiểm tra ngược
Hiệu suất kiểm tra ngược
Đường cong kiểm tra ngược
Trong thời gian kiểm tra lại, BTC đã tiếp tục giảm lên đến 8 tháng, ngay cả khi giảm tối đa hơn 70%, khiến nhiều nhà đầu tư mất niềm tin vào tài sản blockchain. Lợi nhuận tích lũy của chiến lược này lên đến 160%, và tỷ lệ rủi ro lợi nhuận hàng năm vượt quá 5. Đối với một chiến lược đầu tư đơn giản như vậy, tỷ lệ lợi nhuận đầu tư đã vượt quá tỷ lệ của hầu hết những người đang ở vị trí đầy đủ.
Mã nguồn chiến lược đã được công bố trên trang web chính thức của FMZ Quant:https://www.fmz.com/strategy/110545Không cần thiết phải cấu hình, bạn có thể backtesting trực tuyến trực tiếp.
Chiến lược cân bằng năng động trong bài viết này chỉ có một tham số cốt lõi (mức ngưỡng), đó là một phương pháp đầu tư rất đơn giản. Điều nó theo đuổi không phải là lợi nhuận dư thừa, mà là lợi nhuận ổn định. Trái ngược với chiến lược xu hướng, chiến lược cân bằng năng động là chống lại xu hướng. Nhưng chiến lược cân bằng năng động chỉ ngược lại. Khi thị trường phổ biến, giảm vị trí, trong khi khi thị trường không phổ biến, mở rộng vị trí, tương tự như quy định kinh tế vĩ mô.
Trên thực tế, chiến lược cân bằng động là một công cụ thừa hưởng khái niệm giá không thể đoán trước và nắm bắt biến động giá cùng một lúc. Cốt lõi của chiến lược cân bằng động là thiết lập và điều chỉnh tỷ lệ phân bổ tài sản, cũng như ngưỡng kích hoạt. Do độ dài, một bài viết không thể toàn diện. Bạn nên biết rằng ngoài các từ, có một trái tim. Phần quan trọng nhất của chiến lược cân bằng động là ý tưởng đầu tư. Bạn thậm chí có thể thay thế các tài sản BTC cá nhân trong bài viết này bằng một giỏ danh mục tài sản blockchain.
Cuối cùng, chúng ta hãy kết thúc bài viết này với những lời nổi tiếng của Benjamin Graham trong cuốn sách