Strategi Keseimbangan Dinamis Berdasarkan Mata Uang Digital

Penulis:Lydia, Dibuat: 2022-12-01 16:17:29, Diperbarui: 2023-09-20 09:43:30

img

I. Ringkasan

Benjamin Graham, mentor Warren Buffett, telah menyebutkan modus perdagangan neraca dinamis saham dan obligasi dalam buku The Intelligent Investor.

img

Modus perdagangan sangat sederhana: Investasikan 50% dana dalam dana saham dan 50% yang tersisa dalam dana obligasi. -Menurut interval tetap atau perubahan pasar, melakukan rebalancing aset untuk mengembalikan proporsi aset saham dan aset obligasi ke 1:1 asli. Ini adalah logika dari seluruh strategi, termasuk kapan untuk membeli dan menjual dan berapa banyak untuk membeli dan menjual.

II. Prinsip keseimbangan dinamis

Dalam metode ini, volatilitas dana obligasi sangat kecil sebenarnya, jauh lebih rendah daripada volatilitas saham, sehingga obligasi digunakan sebagai reference anchors di sini, yaitu untuk mengukur apakah saham telah meningkat terlalu banyak atau terlalu sedikit oleh obligasi. Jika harga saham naik, nilai pasar saham akan lebih besar dari nilai pasar obligasi. Ketika rasio nilai pasar keduanya melebihi ambang batas yang ditetapkan, total posisi akan disesuaikan kembali, saham akan dijual, dan obligasi akan dibeli, sehingga rasio nilai pasar saham dan obligasi akan kembali ke 1:1 asli. Sebaliknya, jika harga saham menurun, nilai pasar saham akan lebih kecil dari nilai pasar obligasi. Ketika rasio nilai pasar keduanya melebihi ambang batas yang ditetapkan, total posisi akan disesuaikan kembali, saham akan dibeli, dan obligasi akan dijual, sehingga rasio nilai pasar saham dan obligasi akan kembali ke 1:1 asli. Dengan cara ini, kita dapat menikmati buah-buahan dari pertumbuhan saham dan mengurangi volatilitas aset dengan menyeimbangkan proporsi antara saham dan obligasi secara dinamis. Sebagai pelopor investasi nilai, Graham telah memberi kita ide yang baik. Karena ini adalah strategi yang lengkap, mengapa kita tidak menggunakannya dalam mata uang digital?

III. Logika Strategi

Strategi keseimbangan dinamis dalam aset blockchain BTC

Logika strategi

  • Menurut nilai BTC saat ini, saldo rekening menyisakan uang tunai sebesar ¥5000 dan 0,1 BTC, yaitu rasio awal uang tunai terhadap nilai pasar BTC adalah 1: 1.
  • Jika harga BTC meningkat menjadi ¥6000, yaitu, nilai pasar BTC lebih besar dari saldo akun, dan perbedaan antara keduanya melebihi ambang batas yang ditetapkan, maka juallah (6000-5000)/6000/2 koin.
  • Jika harga BTC menurun menjadi ¥4000, yaitu, nilai pasar BTC kurang dari saldo akun, dan perbedaan antara keduanya melebihi ambang batas yang ditetapkan, maka beli koin (5000-4000)/4000/2. Ini berarti bahwa BTC telah terdepresiasi, dan kita dapat membeli BTC kembali.

Dengan cara ini, tidak peduli apakah BTC meningkat atau menurun, kita selalu menjaga saldo akun dan nilai pasar BTC sama secara dinamis.

IV. Kerangka strategi

Jadi, bagaimana menerapkannya dalam kode? Kita mengambil Platform Perdagangan Kuantitas FMZ sebagai contoh, mari kita lihat kerangka strategi terlebih dahulu:

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

Seluruh kerangka strategi sangat sederhana sebenarnya, termasuk fungsi utama, fungsi penempatan pesanan onTick, fungsi CancelPendingOrders, dan parameter yang diperlukan.

V. Modul penempatan pesanan

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

Logika perdagangan order terorganisir dengan baik, dan semua komentar telah ditulis ke dalam kode. Anda dapat mengklik gambar untuk memperbesar.

Proses utamanya adalah sebagai berikut:

  • Dapatkan informasi akun.
  • Dapatkan data Tick.
  • Hitung bid ask spread dari data Tick.
  • Hitung perbedaan antara saldo rekening dan nilai pasar BTC.
  • Menghitung kondisi pembelian dan penjualan, harga pesanan dan jumlah pesanan.
  • Tempatkan pesanan dan kembali benar.

VI. Modul Penarikan

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

Modul penarikan lebih sederhana. Langkah-langkahnya adalah sebagai berikut:

  • Tunggu 1 detik sebelum membatalkan pesanan.
  • Continuously obtain the unsettled order array. Jika suatu pengecualian dikembalikan, lanjutkan untuk mendapatkan.
  • Jika array pesanan yang belum diselesaikan kosong, status penarikan akan dikembalikan segera.
  • Jika ada pesanan yang tidak diselesaikan, seluruh array dilalui dan pesanan dibatalkan sesuai dengan nomor pesanan.

VII. Kode sumber strategi lengkap

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

Parameter eksternal

img

VIII. Pengujian strategi

Berikut ini adalah backtest pada data historis BTC untuk referensi saja.

Lingkungan pengujian balikimg

Kinerja Backtestingimg

Kurva pengujian balikimg

Selama periode backtest, BTC terus menurun hingga 8 bulan, bahkan dengan penurunan maksimum lebih dari 70%, yang menyebabkan banyak investor kehilangan kepercayaan pada aset blockchain. Pengembalian kumulatif strategi ini mencapai 160%, dan rasio risiko pengembalian tahunan melebihi 5.

Dapatkan kode sumber strategi

Kode sumber strategi telah dipublikasikan di situs resmi FMZ Quant:https://www.fmz.com/strategy/110545. Tidak perlu mengkonfigurasi, Anda dapat backtesting online langsung.

X. Ringkasan

Strategi keseimbangan dinamis dalam artikel ini hanya memiliki satu parameter inti (batas), yang merupakan metode investasi yang sangat sederhana. Apa yang dikejarnya bukan laba yang berlebihan, tetapi laba yang stabil. Berbeda dengan strategi tren, strategi keseimbangan dinamis bertentangan dengan tren. Tetapi strategi keseimbangan dinamis adalah kebalikan. Ketika pasar populer, mengurangi posisi, sementara ketika pasar tidak populer, menskalakan posisi, yang mirip dengan regulasi makroekonomi.

Pada kenyataannya, strategi keseimbangan dinamis adalah sebuah kerajinan yang mewarisi konsep harga yang tidak dapat diprediksi dan menangkap fluktuasi harga pada saat yang sama. Inti dari strategi keseimbangan dinamis adalah untuk mengatur dan menyesuaikan rasio alokasi aset, serta ambang pemicu. Mengingat panjangnya, sebuah artikel tidak dapat komprehensif. Anda harus tahu bahwa di luar kata-kata, ada hati. Bagian terpenting dari strategi keseimbangan dinamis adalah ide investasi. Anda bahkan dapat mengganti aset BTC individu dalam artikel ini dengan keranjang portofolio aset blockchain.

Akhirnya, mari kita tutup artikel ini dengan kata-kata terkenal Benjamin Graham dalam buku The Intelligent Investor: Pasar saham bukanlah mesin menimbang yang dapat mengukur nilai dengan akurat, melainkan mesin pemungutan suara. Keputusan yang dibuat oleh orang yang tak terhitung jumlahnya adalah campuran rasionalitas dan kepekaan. Sering kali keputusan ini jauh dari penilaian nilai rasional. Rahasia investasi adalah berinvestasi ketika harga jauh lebih rendah dari nilai intrinsik, dan percaya bahwa tren pasar akan bangkit kembali. Benjamin Graham The Intelligent Investor


Berkaitan

Lebih banyak