Benjamin Graham, mentor Warren Buffett, telah menyebutkan modus perdagangan neraca dinamis saham dan obligasi dalam buku
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.
Dalam metode ini, volatilitas dana obligasi sangat kecil sebenarnya, jauh lebih rendah daripada volatilitas saham, sehingga obligasi digunakan sebagai
Strategi keseimbangan dinamis dalam aset blockchain BTC
Logika strategi
Dengan cara ini, tidak peduli apakah BTC meningkat atau menurun, kita selalu menjaga saldo akun dan nilai pasar BTC
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.
// 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:
// 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:
// 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
Berikut ini adalah backtest pada data historis BTC untuk referensi saja.
Lingkungan pengujian balik
Kinerja Backtesting
Kurva pengujian balik
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.
Kode sumber strategi telah dipublikasikan di situs resmi FMZ Quant:https://www.fmz.com/strategy/110545. Tidak perlu mengkonfigurasi, Anda dapat backtesting online langsung.
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