Sumber dimuat naik... memuat...

Strategi Keseimbangan Dinamik Berdasarkan Mata Wang Digital

Penulis:FMZ~Lydia, Dicipta: 2022-12-01 16:17:29, Dikemas kini: 2023-09-20 09:43:30

img

I. Ringkasan

Benjamin Graham, mentor Warren Buffett, telah menyebut mod perdagangan baki dinamik saham dan bon dalam buku The Intelligent Investor.

img

Mod dagangan sangat mudah: - Melaburkan 50% dana dalam dana saham dan 50% yang selebihnya dalam dana bon. - Berikutan selang masa tetap atau perubahan pasaran, lakukan penimbangan semula aset untuk memulihkan perkadaran aset saham dan aset bon kepada asal 1: 1. Ini adalah logik keseluruhan strategi, termasuk bila untuk membeli dan menjual dan berapa banyak untuk membeli dan menjual.

II. Prinsip keseimbangan dinamik

Dalam kaedah ini, turun naik dana bon adalah sangat kecil sebenarnya, jauh lebih rendah daripada turun naik stok, jadi bon digunakan sebagai reference anchors di sini, iaitu untuk mengukur sama ada stok telah meningkat terlalu banyak atau terlalu sedikit oleh bon. Jika harga saham meningkat, nilai pasaran saham akan lebih besar daripada nilai pasaran bon. Apabila nisbah nilai pasaran kedua-duanya melebihi ambang yang ditetapkan, jumlah kedudukan akan disesuaikan semula, stok akan dijual, dan bon akan dibeli, sehingga nisbah nilai pasaran saham dan bon akan kembali ke 1:1 asal. Sebaliknya, jika harga saham menurun, nilai pasaran saham akan lebih kecil daripada nilai pasaran bon. Apabila nisbah nilai pasaran kedua-duanya melebihi ambang yang ditetapkan, jumlah kedudukan akan disesuaikan semula, stok akan dibeli, dan bon akan dijual, sehingga nisbah nilai pasaran saham dan bon akan kembali ke 1:1 asal. Dengan cara ini, kita boleh menikmati buah-buahan pertumbuhan saham dan mengurangkan turun naik aset dengan menyeimbangkan nisbah antara saham dan bon secara dinamik. Sebagai perintis pelaburan nilai, Graham telah memberikan kita idea yang baik.

III. Logik Strategi

Strategi imbangan dinamik dalam aset blockchain BTC

Logik strategi

  • Menurut nilai BTC semasa, baki akaun menyimpan wang tunai sebanyak ¥5000 dan 0,1 BTC, iaitu nisbah awal wang tunai terhadap nilai pasaran BTC adalah 1: 1.
  • Jika harga BTC meningkat kepada ¥6000, iaitu, nilai pasaran BTC lebih besar daripada baki akaun, dan perbezaan di antara mereka melebihi ambang yang ditetapkan, maka jual (6000-5000) / 6000/2 syiling.
  • Jika harga BTC menurun kepada ¥4000, iaitu, nilai pasaran BTC kurang daripada baki akaun, dan perbezaan di antara mereka melebihi ambang yang ditetapkan, maka beli (5000-4000)/4000/2 syiling.

Dengan cara ini, tidak kira sama ada BTC meningkat atau menurun, kita sentiasa mengekalkan baki akaun dan nilai pasaran BTC sama secara dinamik.

IV. Rangka Strategi

Jadi, bagaimana untuk melaksanakan dalam kod? Kita mengambil FMZ Quant Trading Platform sebagai contoh, mari kita lihat kerangka strategi pertama:

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

Keseluruhan kerangka strategi adalah sangat mudah sebenarnya, termasuk fungsi utama, fungsi tempat pesanan onTick, fungsi CancelPendingOrders, dan parameter yang diperlukan.

V. Modul Penempatan Perintah

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

Logik perdagangan pesanan adalah teratur, dan semua komen telah ditulis ke dalam kod.

Proses utama adalah seperti berikut:

  • Dapatkan maklumat akaun.
  • Dapatkan data Tick.
  • Mengira penyebaran tawaran meminta data Tick.
  • Mengira perbezaan antara baki akaun dan nilai pasaran BTC.
  • Mengira syarat beli dan jual, harga pesanan dan kuantiti pesanan.
  • Buat pesanan dan kembali benar.

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 pengeluaran adalah lebih mudah.

  • Tunggu 1 saat sebelum membatalkan pesanan.
  • Berterusan mendapatkan array susunan yang tidak diselesaikan. Jika pengecualian dikembalikan, teruskan mendapatkan.
  • Jika barisan pesanan yang tidak diselesaikan kosong, status pengeluaran akan dikembalikan dengan segera.
  • Jika ada pesanan yang tidak diselesaikan, seluruh array dilalui dan pesanan dibatalkan mengikut nombor pesanan.

VII. Kod 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 luaran

img

VIII. Ujian belakang strategi

Seterusnya, mari kita menguji strategi penyeimbangan dinamik yang mudah ini untuk melihat apakah ia berfungsi. Berikut adalah ujian belakang pada data sejarah BTC untuk rujukan sahaja.

Backtesting persekitaranimg

Prestasi Ujian Kembaliimg

Kurva ujian balikimg

Semasa tempoh backtest, BTC terus menurun sehingga 8 bulan, walaupun dengan penurunan maksimum lebih dari 70%, yang menyebabkan banyak pelabur kehilangan keyakinan terhadap aset blockchain. Pengembalian kumulatif strategi ini adalah sehingga 160%, dan nisbah risiko pulangan tahunan melebihi 5. Untuk strategi pelaburan yang sederhana, kadar pulangan pelaburan telah melebihi kebanyakan orang yang berada dalam kedudukan penuh.

Dapatkan kod sumber strategi

Kod sumber strategi telah diterbitkan di laman web rasmi FMZ Quant:https://www.fmz.com/strategy/110545. Tidak perlu untuk mengkonfigurasi, anda boleh backtesting dalam talian terus.

X. Ringkasan

Strategi keseimbangan dinamik dalam artikel ini hanya mempunyai satu parameter teras (batas), yang merupakan kaedah pelaburan yang sangat mudah. Apa yang dikejarnya bukan kelebihan pulangan, tetapi pulangan yang stabil. Berbeza dengan strategi trend, strategi keseimbangan dinamik adalah menentang trend. Tetapi strategi keseimbangan dinamik adalah sebaliknya. Apabila pasaran popular, mengurangkan kedudukan, sementara apabila pasaran tidak popular, skala dalam kedudukan, yang serupa dengan peraturan makroekonomi.

Sebenarnya, strategi baki dinamik adalah kraf yang mewarisi konsep harga yang tidak dapat diramalkan dan menangkap turun naik harga pada masa yang sama. Inti strategi baki dinamik adalah untuk menetapkan dan menyesuaikan nisbah peruntukan aset, serta ambang pencetus. Memandangkan panjangnya, satu artikel tidak boleh komprehensif. Anda harus tahu bahawa di luar kata-kata, ada hati. Bahagian yang paling penting dari strategi baki dinamik adalah idea pelaburan. Anda bahkan boleh menggantikan aset BTC individu dalam artikel ini dengan bakul portfolio aset blockchain.

Akhirnya, mari kita tutup artikel ini dengan kata-kata terkenal Benjamin Graham dalam buku The Intelligent Investor: Pasaran saham bukan mesin menimbang yang boleh mengukur nilai dengan tepat, tetapi lebih merupakan mesin mengundi. Keputusan yang dibuat oleh orang yang tidak terhitung jumlahnya adalah campuran kecerdasan dan kepekaan. Sering kali keputusan ini jauh dari penilaian nilai rasional. Rahsia pelaburan adalah untuk melabur apabila harga jauh lebih rendah daripada nilai intrinsik, dan percaya bahawa trend pasaran akan bangkit semula. Benjamin Graham The Intelligent Investor


Berkaitan

Lebih lanjut