Penasihat Warren Buffett, Benjamin Graham pernah menulis dalam bukunya Investor yang Pintar, mengenai model perdagangan yang dinamika dengan saham dan bon yang seimbang.Model perdagangan ini sangat mudah:
Dalam pendekatan ini, kadar turun naik dana bon sebenarnya sangat kecil, jauh di bawah kadar turun naik saham, jadi bon di sini dianggap sebagai 'bond rujukan', iaitu menggunakan bon untuk mengukur sama ada saham terlalu banyak atau terlalu sedikit.
Jika harga saham meningkat, maka nilai pasaran saham akan lebih besar daripada nilai pasaran bon, apabila nisbah nilai pasaran kedua-duanya melebihi ambang yang ditetapkan, kedudukan keseluruhan disesuaikan semula, menjual saham, dan membeli bon, sehingga nisbah nilai pasaran saham dan bon kembali ke 1:1 yang awal.
Sebaliknya, harga saham jatuh, menjadikan nilai pasaran saham kurang daripada nilai pasaran bon, dan apabila nisbah nilai pasaran kedua-duanya melebihi ambang yang ditetapkan, kedudukan keseluruhan disesuaikan semula, membeli saham, dan menjual bon, menjadikan nisbah nilai pasaran saham dan bon kembali ke tahap awal 1:1.
Dengan cara ini, perbandingan antara saham dan bon yang seimbang secara dinamik cukup untuk menikmati buah pertumbuhan saham dan mengurangkan turun naik aset. Sebagai pelopor pelaburan nilai, Graham memberi kita idea yang baik. Oleh kerana ini adalah strategi yang lengkap, mengapa kita tidak menggunakannya untuk mata wang digital?
Strategi keseimbangan dinamik dalam aset blockchain BTC
Logik Strategi
Dengan cara ini, sama ada BTC meningkat atau menurun, baki akaun sentiasa dinamik dijaga sama dengan nilai pasaran BTC. Jika BTC menurun, beli beberapa, tunggu untuk kembali, dan jual beberapa lagi, seolah-olah tidak ada apa-apa.
Jadi, bagaimana untuk mewujudkan ini dengan kod? Mari kita lihat pada platform perdagangan kuantitatif pencipta sebagai contoh, pertama-tama mari kita lihat kerangka strategi:
// 撤单函数
function CancelPendingOrders() {}
// 下单函数
function onTick() {}
// 主函数
function main() {
// 过滤非重要信息
SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
while (true) { // 轮询模式
if (onTick()) { // 执行 onTick 函数
CancelPendingOrders(); // 取消未成交的挂单
Log(_C(exchange.GetAccount)); // 打印当前账户信息
}
Sleep(LoopInterval * 1000); // 休眠
}
}
Rangka kerja dasar ini sebenarnya sangat mudah, dengan fungsi utama utama, fungsi bawah onTick, fungsi CancelPendingOrders, dan parameter yang diperlukan.
// 下单函数
function onTick() {
var acc = _C(exchange.GetAccount); // 获取账户信息
var ticker = _C(exchange.GetTicker); // 获取 Tick 数据
var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差
// 账户余额与当前持仓价值的差值的 0.5倍
var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额
LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间
if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值
return false; // 返回 false
}
if (ratio > 0) { // 如果 ratio大于 0
var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格
var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量
if (buyAmount < MinStock) { // 如果下单量小于最小交易量
return false; // 返回 false
}
exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单
} else {
var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格
var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量
if (sellAmount < MinStock) { // 如果下单量小于最小交易量
return false; // 返回 false
}
exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单
}
return true; // 返回 true
}
Peraturan logik urus niaga di bawah jelas, semua komen telah ditulis dalam kod, anda boleh mengklik gambar untuk melihat lebih besar.
Proses utama adalah sebagai berikut:
// 撤单函数
function CancelPendingOrders() {
Sleep(1000); // 休眠 1秒
var ret = false;
while (true) {
var orders = null;
// 持续获取未成交订单数组,如果返回异常,则继续获取
while (!(orders = exchange.GetOrders())) {
Sleep(1000); // 休眠 1秒
}
if (orders.length == 0) { // 如果订单数组为空
return ret; // 返回撤单状态
}
for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组
exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单
ret = true;
if (j < (orders.length - 1)) {
Sleep(1000); // 休眠 1秒
}
}
}
}
Mengeluarkan modul adalah lebih mudah, langkah-langkahnya adalah sebagai berikut:
// 回测环境
/*backtest
start: 2018-01-01 00:00:00
end: 2018-08-01 11:00:00
period: 1m
exchanges: [{"eid":"Bitfinex","currency":"BTC_USD"}]
*/
// 撤单函数
function CancelPendingOrders() {
Sleep(1000); // 休眠 1秒
var ret = false;
while (true) {
var orders = null;
// 持续获取未成交订单数组,如果返回异常,则继续获取
while (!(orders = exchange.GetOrders())) {
Sleep(1000); // 休眠 1秒
}
if (orders.length == 0) { // 如果订单数组为空
return ret; // 返回撤单状态
}
for (var j = 0; j < orders.length; j++) { // 遍历未成交订单数组
exchange.CancelOrder(orders[j].Id); // 依次取消未成交订单
ret = true;
if (j < (orders.length - 1)) {
Sleep(1000); // 休眠 1秒
}
}
}
}
// 下单函数
function onTick() {
var acc = _C(exchange.GetAccount); // 获取账户信息
var ticker = _C(exchange.GetTicker); // 获取 Tick 数据
var spread = ticker.Sell - ticker.Buy; // 获取 Tick 数据的买卖价差
// 账户余额与当前持仓价值的差值的 0.5倍
var diffAsset = (acc.Balance - (acc.Stocks * ticker.Sell)) / 2;
var ratio = diffAsset / acc.Balance; // diffAsset / 账户余额
LogStatus('ratio:', ratio, _D()); // 打印 ratio和当前时间
if (Math.abs(ratio) < threshold) { // 如果 ratio的绝对值小于指定阈值
return false; // 返回 false
}
if (ratio > 0) { // 如果 ratio大于 0
var buyPrice = _N(ticker.Sell + spread, ZPrecision); // 计算下单价格
var buyAmount = _N(diffAsset / buyPrice, XPrecision); // 计算下单量
if (buyAmount < MinStock) { // 如果下单量小于最小交易量
return false; // 返回 false
}
exchange.Buy(buyPrice, buyAmount, diffAsset, ratio); // 买入下单
} else {
var sellPrice = _N(ticker.Buy - spread, ZPrecision); // 计算下单价格
var sellAmount = _N(-diffAsset / sellPrice, XPrecision); // 计算下单量
if (sellAmount < MinStock) { // 如果下单量小于最小交易量
return false; // 返回 false
}
exchange.Sell(sellPrice, sellAmount, diffAsset, ratio); // 卖出下单
}
return true; // 返回 true
}
// 主函数
function main() {
// 过滤非重要信息
SetErrorFilter("GetRecords:|GetOrders:|GetDepth:|GetAccount|:Buy|Sell|timeout");
while (true) { // 轮询模式
if (onTick()) { // 执行 onTick 函数
CancelPendingOrders(); // 取消未成交的挂单
Log(_C(exchange.GetAccount)); // 打印当前账户信息
}
Sleep(LoopInterval * 1000); // 休眠
}
}
Parameter luaran
Seterusnya, mari kita uji strategi keseimbangan dinamik yang mudah ini untuk melihat apakah ia berkesan. Berikut adalah ulasan semula mengenai data sejarah BTC, hanya untuk rujukan anda.
Pengukuran semula persekitaran
Uji semula prestasi
Kurva pengukuran semula
Satu lagi, grafik pergerakan harga BTC pada masa yang sama.
Dalam tempoh yang ditonton semula, BTC telah mengalami penurunan selama 8 bulan dan bahkan penurunan tertinggi lebih daripada 70%, yang menyebabkan banyak pelabur kehilangan keyakinan terhadap aset blockchain. Strategi ini mempunyai keuntungan kumulatif sebanyak 160% dan risiko pendapatan tahunan lebih daripada 5%. Untuk strategi pelaburan yang sederhana, pulangan pelaburan ini telah melebihi kebanyakan orang hip-hop.
Kod sumber strategi telah dibuka kepada inventor quantify.orghttps://www.fmz.com/strategy/110545Tidak perlu mengkonfigurasi ujian semula secara langsung dalam talian.
Strategi imbangan dinamik ini, yang hanya mempunyai satu parameter teras (threshold threshold), adalah kaedah pelaburan yang sangat mudah, yang tidak mengejar keuntungan yang berlebihan, tetapi keuntungan yang kukuh. Berbeza dengan strategi trend, strategi imbangan dinamik adalah pergerakan ke belakang. Sebaliknya, strategi imbangan dinamik adalah sebaliknya, menurunkan kadar semasa pasaran panas, dan meningkatkan kadar turun naik semasa pasaran sejuk, agak mirip dengan pengawalan makroekonomi.
Sebenarnya, strategi imbangan dinamik adalah idea harga yang tidak dapat diramalkan, tetapi juga satu teknik untuk menangkap turun naik harga. Inti utama strategi imbangan dinamik adalah menetapkan dan menyesuaikan peratusan peruntukan aset, dan juga memicu ambang nilai. Oleh kerana alasan yang luas, satu artikel tidak dapat melakukan semua itu secara langsung, hanya perlu mengetahui secara lisan.
Akhirnya, mari kita selesaikan dengan kata-kata terkenal Benjamin Graham dalam bukunya Investor Yang Pintar:Pasaran saham bukan 'timbalan' yang dapat mengukur nilai dengan tepat, sebaliknya ia adalah'mesin pengundian' di mana keputusan yang dibuat oleh orang yang tidak terhitung jumlahnya adalah campuran rasional dan emosi, dan banyak kali pilihan dan penilaian nilai rasional jauh berlawanan.Benjamin Graham, seorang pelabur yang bijak