Tài nguyên đang được tải lên... tải...

Chiến lược cân bằng năng động dựa trên tiền kỹ thuật số

Tác giả:FMZ~Lydia, Tạo: 2022-12-01 16:17:29, Cập nhật: 2023-09-20 09:43:30

img

I. Tóm lại

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 Người đầu tư thông minh.

img

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.

II. Nguyên tắc cân bằng động

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à anchor tham chiếu ở đây, nghĩa là để đo lường liệu cổ phiếu có tăng quá nhiều hoặc quá ít bởi trái phiếu hay không. Nếu giá cổ phiếu tăng, giá trị thị trường của cổ phiếu sẽ lớn hơn giá trị thị trường của trái phiếu. Khi tỷ lệ giá trị thị trường của cả hai vượt quá ngưỡng đã thiết lập, tổng vị trí sẽ được điều chỉnh lại, cổ phiếu sẽ được bán và trái phiếu sẽ được mua, do đó tỷ lệ giá trị thị trường của cổ phiếu và trái phiếu sẽ trở lại mức ban đầu 1: 1. Ngược lại, nếu giá cổ phiếu giảm, giá trị thị trường của cổ phiếu sẽ nhỏ hơn giá trị thị trường của trái phiếu. Khi tỷ lệ giá trị thị trường của hai vượt quá ngưỡng đã thiết lập, tổng vị trí sẽ được điều chỉnh lại, cổ phiếu sẽ được mua và trái phiếu sẽ được bán, do đó tỷ lệ giá trị thị trường của cổ phiếu và trái phiếu sẽ trở lại mức ban đầu 1: 1. Bằng cách này, chúng ta có thể tận hưởng những kết quả của sự tăng trưởng cổ phiếu và giảm biến động tài sản bằng cách cân bằng tỷ lệ giữa cổ phiếu và trái phiếu một cách năng động. Là một người tiên phong trong đầu tư giá trị, Graham đã cung cấp cho chúng ta một ý tưởng tốt. Vì đây là một chiến lược hoàn chỉnh, tại sao chúng ta không sử dụng nó trong tiền kỹ thuật số?

III. Lý thuyết chiến lược

Chiến lược cân bằng năng động trong tài sản blockchain BTC

Chiến lược logic

  • Theo giá trị BTC hiện tại, số dư tài khoản dự trữ tiền mặt là ¥ 5000 và 0,1 BTC, tức là tỷ lệ ban đầu của tiền mặt so với giá trị thị trường BTC là 1: 1.
  • Nếu giá của BTC tăng lên ¥6000, nghĩa là giá trị thị trường của BTC lớn hơn số dư tài khoản, và sự khác biệt giữa chúng vượt quá ngưỡng đặt, sau đó bán (6000-5000)/6000/2 đồng xu. Điều đó có nghĩa là BTC đã tăng giá và chúng tôi có thể đổi lại tiền.
  • Nếu giá của BTC giảm xuống ¥4000, nghĩa là giá trị thị trường của BTC thấp hơn số dư tài khoản và sự khác biệt giữa chúng vượt quá ngưỡng đặt, sau đó mua (5000-4000)/4000/2 coin. Điều đó có nghĩa là BTC đã mất giá và chúng ta có thể mua lại BTC.

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ư.

IV. Khung chiến lược

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.

V. Mô-đun đặt lệnh

// 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:

  • Tìm thông tin tài khoản.
  • Lấy dữ liệu Tick.
  • Tính toán giá thầu yêu cầu phân bố dữ liệu Tick.
  • Tính toán sự khác biệt giữa số dư tài khoản và giá trị thị trường BTC.
  • Tính toán các điều kiện mua và bán, giá đặt hàng và số lượng đặt hàng.
  • Đặt hàng và trả lại đúng.

VI. Mô-đun thu hồi

// 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.

  • Chờ 1 giây trước khi hủy đơn đặt hàng.
  • Tiếp tục lấy mảng thứ tự không được giải quyết. Nếu một ngoại lệ được trả về, tiếp tục lấy.
  • Nếu mảng lệnh chưa giải quyết trống, trạng thái rút sẽ được trả lại ngay lập tức.
  • Nếu có một đơn đặt hàng không được giải quyết, toàn bộ mảng được đi qua và đơn đặt hàng bị hủy theo số đơn đặt hàng.

VII. Mã nguồn chiến lược hoàn chỉnh

// 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

img

VIII. Kiểm tra lại chiến lược

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ượcimg

Hiệu suất kiểm tra ngượcimg

Đường cong kiểm tra ngượcimg

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 đủ.

Đưa mã nguồn chiến lược

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.

X. Tóm tắt

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 The Intelligent Investor: Thị trường chứng khoán không phải là một máy cân có thể đo lường giá trị chính xác, mà là một máy bỏ phiếu . Các quyết định được đưa ra bởi vô số người là một sự pha trộn của lý trí và nhạy cảm. Nhiều lần những quyết định này không phải là đánh giá giá trị hợp lý. Bí mật của đầu tư là đầu tư khi giá thấp hơn nhiều so với giá trị nội tại, và tin rằng xu hướng thị trường sẽ phục hồi. Benjamin Graham Nhà đầu tư thông minh


Có liên quan

Thêm nữa