Benjamin Graham, mentor Warren Buffett, telah menyebut mod perdagangan baki dinamik saham dan bon dalam buku
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.
Dalam kaedah ini, turun naik dana bon adalah sangat kecil sebenarnya, jauh lebih rendah daripada turun naik stok, jadi bon digunakan sebagai
Strategi imbangan dinamik dalam aset blockchain BTC
Logik strategi
Dengan cara ini, tidak kira sama ada BTC meningkat atau menurun, kita sentiasa mengekalkan baki akaun dan nilai pasaran BTC
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.
// 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:
// 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.
// 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
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 persekitaran
Prestasi Ujian Kembali
Kurva ujian balik
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.
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.
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