Sumber daya yang dimuat... Pemuatan...

Sistem Backtest

Setelah Anda menyelesaikan desain strategi perdagangan kuantitatif, bagaimana Anda bisa mengetahui situasi dasar strategi Anda, seperti logika strategi dan arah pengembalian strategi? tentu saja, kita tidak dapat menggunakan uang riil secara langsung untuk menjalankan strategi di pasar perdagangan riil, tetapi kita dapat menggunakan data historis untuk menguji strategi Anda dan mengetahui keuntungan dari strategi Anda dalam data historis.

Model Sistem Backtest

FMZ Quant Trading Platform membagi sistem backtest menjaditingkat botdanTingkat simulasi. Tingkat bot adalah untuk backtest sepenuhnya sesuai dengan data historis lengkap; sementara simulasi tingkat backtest menghasilkantickdata berdasarkan data K-line nyata pada interval reguler untuk backtest. Keduanya didasarkan pada data historis yang sebenarnya, tetapi data tingkat bot lebih akurat dan hasilnya lebih kredibel. Namun, backtesting hanyalah kinerja strategi berdasarkan data historis. Data historis tidak dapat sepenuhnya mewakili pasar masa depan. Pasar historis dapat berulang, atau juga dapat menyebabkan Black Swan. Oleh karena itu, hasil backtest harus diperlakukan secara rasional dan obyektif.

PeraturanTingkat simulasi Tickmenghasilkan simulasidata tickberdasarkan periode K-line yang mendasarinya, setiap periode K-line mendasarinya akan menghasilkan maksimum 12 titik waktu backtest; SementaraTingkat pasar riil Tickbacktesting menggunakan data tick yang dikumpulkan secara real-time, volume data sangat besar dan kecepatan backtesting lambat, sehingga tidak dapat backtested untuk jangka waktu yang sangat lama. mekanisme backtesting FMZ Quant memungkinkan strategi untuk berdagang beberapa kali pada satu garis K, menghindari situasi di mana perdagangan hanya dapat dilaksanakan pada harga penutupan.

Deskripsi mekanisme sistem backtesting

  • Tick Tingkat Simulasi PeraturanTingkat simulasi Tickdidasarkan pada data K-line yang mendasari dari sistem backtest, mensimulasikan data tick untuk backtest dalam kerangka harga tertinggi, harga terendah, harga pembukaan, dan nilai harga penutupan dari bar K-line yang mendasari sesuai dengan algoritma tertentu. Sebagai data tick real-time pada seri waktu backtesting, ini dikembalikan ketika program strategi memanggil antarmuka. Untuk rincian, silakan lihat:Deskripsi mekanisme tingkat simulasi sistem backtesting.

  • Tick Tingkat Bot Bot level backtest adalah data level tik yang sebenarnya dalam bar time series. Untuk strategi yang didasarkan pada data level tik, menggunakan level pasar nyata untuk backtest lebih dekat dengan kenyataan. Dalam bot level backtest, data tik adalah data yang tercatat nyata, bukan yang disimulasikan. Ini mendukung data kedalaman, pemutaran data catatan perdagangan pasar, kedalaman kustom dan setiap data perdagangan individu. Ukuran maksimum backtest data level pasar nyata adalah hingga maksimum 50MB, tanpa batasan pada rentang waktu backtest dalam batas atas dataset. Jika Anda perlu memperbesar rentang waktu backtest sebanyak mungkin, Anda dapat mengurangi nilai pengaturan kedalaman geartest dan tidak menggunakan setiap data perdagangan individu untuk meningkatkan rentang waktu backtest Call.GetDepth, GetTradesPada saat data pasar pada timeline, panggilanGetTicker, GetTrades, GetDepthdanGetRecordstidak akan mendorong waktu beberapa kali ketika waktu bergerak pada garis waktu backtest (yang tidak akan memicu lompatan ke momen data pasar berikutnya). panggilan berulang ke salah satu fungsi di atas akan mendorong waktu backtest untuk bergerak pada garis waktu backtest (lompat ke momen data pasar berikutnya). Ketika tingkat pasar riil digunakan untuk backtest, waktu yang lebih awal tidak dianjurkan untuk memilih. Mungkin tidak ada data tingkat pasar riil dalam periode waktu prematur.

Tick tingkat botdanTick tingkat simulasimodus, mekanisme pencocokan transaksi dari sistem backtest: pencocokan transaksi order dilakukan sesuai dengan harga yang dilihat dan volume penuh diperdagangkan.

Sistem Backtesting Mendukung Beberapa Bahasa Pemrograman

Sistem backtesting mendukung strategi backtesting yang ditulis dan dirancang oleh:JavaScript, TypeScript, Python, C++, PINE, MyLanguage, Blocklyvisualisasi. Pengujian backtest dariJavaScriptdanC++strategi perdagangan dilakukan di browser, dan bot pasar nyata atauWexApppasar real (yaitu pasar realWexAppemulated exchange of FMZ Quant Trading platform) berjalan tanpa menginstal perangkat lunak, perpustakaan atau modul lainnya. Pengujian backtest dariPythondilakukan pada docker; dapat dilakukan pada server publik yang ditambahkan oleh platform FMZ Quant Trading, dan juga dapat dilakukan pada docker pengguna sendiri.PythonJika beberapa perpustakaan diperlukan, mereka perlu diinstal secara manual (hanya umumPythonperpustakaan didukung pada server publik FMZ Quant).

Ini mendukungJavaScriptstrategi backtesting debugging di Chrome DevTools,Silakan lihat.

Pertukaran yang didukung dalam sistem backtesting

  • Cryptocurrency Bursa spot dan futures utama untuk cryptocurrency; mendukung data pada semua jenis bursa.
  • Futu Securities Saham Hong Kong, saham AS dan pasar lainnya.

Pengoptimalan Parameter Sistem Backtesting

Fungsi optimasi parameter dari sistem backtest dari FMZ Quant Trading Platform adalah untuk mengatur kombinasi parameter sesuai dengan setiap opsi optimasi parameter selama backtesting.Optimalisasiopsi di sisi kanan dari parameter strategi untuk menampilkan pengaturan optimasi.

  • Nilai minimum: untuk membatasi nilai awal parameter.
  • Nilai maksimum: untuk membatasi nilai maksimum parameter setelah perubahan bertahap.
  • Ukuran langkah: jumlah variabel tambahan dari parameter.
  • Benang serentak: Selama optimasi parameter, atur jumlah thread untuk eksekusi bersamaan dari setiap kombinasi parameter backtest.JavaScript, PINE, danMy Language, dan tidak mendukung optimasi parameter pada template.

Kombinasi parameter dihasilkan berdasarkanminimum, maximum, danstep sizeSistem backtesting berulang melalui kombinasi parameter ini untuk backtesting (yaitu, backtesting setiap kombinasi parameter sekali).nomorjenis dapat dioptimalkan dalam sistem backtesting.

Simpan Pengaturan Backtest

Dalamhalaman pengeditan strategi, dalam paginasi Backtest (yaitu sistem backtest), Anda dapat mengatur opsi seperti konfigurasi backtest dan parameter strategi untuk backtest strategi. pengaturan Backtest mengacu pada rentang waktu backtest, platform pertukaran, slippoint dan biaya layanan dll; sementara parameter strategi digunakan untuk mengatur opsi parameter untuk strategi. Ketika parameter ini ditetapkan, Anda dapat mengikuti set backtesting strategi, lalu bagaimana untuk menyimpan set informasi konfigurasi?

    1. Anda dapat menggunakan Save Backtest Settings tombol padaHalaman Pengeditan Strategiuntuk mencatat semua informasi konfigurasi backtest (termasuk pengaturan backtest dan pengaturan parameter strategi) dalam kode sumber strategi dalam bentuk kode.
    1. Ketika Anda menyimpan strategi dengan mengklik tombol Save Strategy di halaman pengeditan strategi, platform akan secara otomatis merekam pengaturan backtest saat ini, konfigurasi parameter strategi, dan informasi lainnya. Bagaimana untuk memuat konfigurasi backtest ke dalam sistem backtest?
    1. Saat memperbarui halaman pengeditan strategi atau membuka kembali halaman pengeditan strategi ini, informasi konfigurasi backtest yang direkam oleh tombol Save Backtest Settings akan dimuat secara otomatis terlebih dahulu.
    1. Jika tidak ada informasi konfigurasi backtest yang tercatat dalam kode strategi saat ini sebagai komentarbacktest(disimpan dalam kode strategi melalui tombol Save Backtest Settings), sistem backtest secara otomatis mengkonfigurasi pengaturan backtest ke informasi konfigurasi backtest ketika tombol Save Strategy terakhir diklik untuk strategi saat ini.
    1. Jika informasi konfigurasi backtest yang tercatat dalam bentuk komentar di awal kode strategi dimodifikasi di halaman pengeditan strategi, Anda perlu menyinkronkan informasi konfigurasi backtest yang saat ini diperbarui ke opsi antarmuka backtest strategi. Anda dapat mengklik tombol Backtest Settings di atasbacktestdi bidang penyuntingan strategi.
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
'''backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
'''
/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Klik Simpan pengaturan backtest, ada sedikit perbedaan format padaJavaScript/Python/C++/MyLanguage/PINEbahasa ketika menyimpan pengaturan backtest ke kode strategi: MyLanguage

(*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*)

Bahasa PINE:

/*backtest
start: 2021-06-26 00:00:00
end: 2021-09-23 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/

Sumber Data Khusus

Sistem backtesting dari FMZ Quant Trading Platform mendukung sumber data khusus, sistem backtesting menggunakanGETmetode untuk meminta URL khusus (URL yang dapat diakses publik) untuk mendapatkan sumber data eksternal untuk backtest.

Parameter Makna Penjelasan
lambang Nama Simbol Data pasar spot, seperti:BTC_USDT, data pasar berjangka, seperti:BTC_USDT.swap, data tingkat pendanaan kontrak jangka panjang berjangka, seperti:BTC_USDT.funding, data indeks harga kontrak perpetual berjangka, seperti:BTC_USDT.index
eid Pertukaran seperti OKX, Futures_OKX
bulat Keakuratan Data Benar berarti bahwa presisi spesifik didefinisikan dalam data yang dikembalikan oleh sumber data kustom. Permintaan yang dikirim oleh FMZ Quant Trading Platform Backtesting System ke sumber data kustom ditetapkan sebagai:round=true
periode Periode data K-line (milisekund) seperti:60000adalah periode 1 menit
kedalaman Tingkat kedalaman 1-20
perdagangan Apakah Perlu Pembagian Data benar (1) / salah (2)
dari Waktu Mulai timestamp unix
untuk Waktu Akhir timestamp unix
detail Permintaan data untuk rincian simbol Benar berarti bahwa itu perlu disediakan oleh sumber data kustom. Permintaan yang dikirim oleh FMZ Quant Trading Platform Backtesting System ke sumber data kustom ditetapkan sebagai:detail=true
adat Parameter ini dapat diabaikan

Ketika sumber data dari spot exchange dan obyek futures exchange diatur ke sumber data khusus (feeder), sistem backtesting mengirim permintaan ke layanan sumber data khusus:

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Bitget&from=1351641600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_OKX&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=1

Format data

Format yang dikembalikan harus salah satu dari dua format berikut (yang akan dikenali oleh sistem secara otomatis):

  • Tingkat simulasi Tick, berikut adalah contoh data JSON:

    {
        "detail": {
            "eid": "Binance",
            "symbol": "BTC_USDT",
            "alias": "BTCUSDT",
            "baseCurrency": "BTC",
            "quoteCurrency": "USDT",
            "marginCurrency": "USDT",
            "basePrecision": 5,
            "quotePrecision": 2,
            "minQty": 0.00001,
            "maxQty": 9000,
            "minNotional": 5,
            "maxNotional": 9000000,
            "priceTick": 0.01,
            "volumeTick": 0.00001,
            "marginLevel": 10
        },
        "schema":["time", "open", "high", "low", "close", "vol"],
        "data":[
            [1564315200000, 9531300, 9531300, 9497060, 9497060, 787],
            [1564316100000, 9495160, 9495160, 9474260, 9489460, 338]
        ]
    }
    
  • Tick tingkat bot, berikut adalah contoh data JSON: Tick-level backtest data (mengandung informasi tentang kedalaman pasar, dan format kedalaman adalah array[price, volume]. Itu bisa memiliki beberapa tingkat kedalaman,asksuntuk urutan kenaikan harga,bidsuntuk urutan harga menurun).

    {
        "detail": {
            "eid": "Binance",
            "symbol": "BTC_USDT",
            "alias": "BTCUSDT",
            "baseCurrency": "BTC",
            "quoteCurrency": "USDT",
            "marginCurrency": "USDT",
            "basePrecision": 5,
            "quotePrecision": 2,
            "minQty": 0.00001,
            "maxQty": 9000,
            "minNotional": 5,
            "maxNotional": 9000000,
            "priceTick": 0.01,
            "volumeTick": 0.00001,
            "marginLevel": 10
        },
        "schema":["time", "asks", "bids", "trades", "close", "vol"],
        "data":[
            [1564315200000, [[9531300, 10]], [[9531300, 10]], [[1564315200000, 0, 9531300, 10]], 9497060, 787],
            [1564316100000, [[9531300, 10]], [[9531300, 10]], [[1564316100000, 0, 9531300, 10]], 9497060, 787]
        ]
    }
    
Lapangan Deskripsi
detail Informasi rinci tentang jenis data yang diminta,

termasuk nama mata uang denominasi, mata uang perdagangan, presisi, jumlah pesanan minimum, dll. Schema. Ini menentukan atribut kolom dalam data. array, yang sensitif huruf besar dan hanya terbatas pada waktu, terbuka, tinggi, rendah, dekat, volume, meminta, tawaran, perdagangan data. Struktur kolom, data yang tercatat sesuai dengan skema Pengaturan.

bidang detail

Lapangan Deskripsi
eid Exchange Id, harap dicatat bahwa spot dan berjangka dari
Pertukaran tertentu memiliki eid yang berbeda.
lambang Kode produk perdagangan
alias Simbol dalam pertukaran yang sesuai dengan saat ini
Kode produk perdagangan
Mata uang dasar Mata uang perdagangan
Kutipan Mata uang Mata Uang Denominasi
marginMata uang Mata uang margin
dasarPrecision Akurasi Mata Uang Transaksi
QuotePrecision Keakuratan Harga Mata Uang
MinQty Jumlah pesanan minimum
maxQty Jumlah pesanan maksimum
MinNotional Jumlah pesanan minimum
Max Nominal Jumlah pesanan maksimum
hargaTick Lonjakan Harga
volumeTick Nilai perubahan minimum dari jumlah pesanan (satu lompatan dalam
jumlah pesanan)
marginLevel Nilai Leverage Futures
kontrakJenis Untuk kontrak jangka panjang yang ditetapkan untuk:swap, yang

sistem backtest akan terus mengirim tingkat pendanaan dan indeks harga permintaan.

Atribut kolom khususasks, bids, trades:

Lapangan Deskripsi Pengamatan
permintaan / penawaran [harga, volume],...] Sebagai contoh, data di

yangLive Trading Level TickContoh data:[[9531300, 10]]Percayalah. {\fnCandara\fs55\b1\4cH000000\4aH80}tuk perdagangan {\fnCandara\fs55\b1\4cH000000\4aH80}untuk contoh, data dalamLive Trading Level TickContoh data:[[1564315200000, 0, 9531300, 10]] |

Ketika backtesting kontrak abadi di bursa berjangka, kustom sumber data juga membutuhkan data tingkat pendanaan tambahan dan harga Sistem backtesting akan terus mengirim permintaan untuk tingkat pendanaan hanya ketika data pasar yang diminta dikembalikan dan bidang detail dalam struktur yang dikembalikan berisi"contractType": "swap"Pasangan kunci-nilai.

Ketika sistem backtesting menerima data tingkat pendanaan, terus mengirimkan permintaan untuk data indeks harga.

Struktur data tingkat pendanaan adalah sebagai berikut:

{
    "detail": {
        "eid": "Futures_Binance",
        "symbol": "BTC_USDT.funding",
        "alias": "BTC_USDT.funding",
        "baseCurrency": "BTC",
        "quoteCurrency": "USDT",
        "marginCurrency": "",
        "basePrecision": 8,
        "quotePrecision": 8,
        "minQty": 1,
        "maxQty": 10000,
        "minNotional": 1,
        "maxNotional": 100000000,
        "priceTick": 1e-8,
        "volumeTick": 1e-8,
        "marginLevel": 10
    },
    "schema": [
        "time",
        "open",
        "high",
        "low",
        "close",
        "vol"
    ],
    "data": [
        [
            1584921600000,
            -16795,
            -16795,
            -16795,
            -16795,
            0
        ],
        [
            1584950400000,
            -16294,
            -16294,
            -16294,
            -16294,
            0
        ]
        // ...
    ]
}
  • Interval antara periode berdekatan adalah 8 jam
  • Misalnya, Binance's funding rate diperbarui setiap 8 jam. Apakah data tingkat pendanaan -16795? Karena seperti data K-line, untuk menghindari hilangnya presisi titik terapung selama transmisi jaringan, data menggunakan tipe bilangan bulat; data tingkat pendanaan juga dapat negatif.

Contoh permintaan data tingkat pendanaan dari backtesting sistem adalah:

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.funding&to=1611244800&trades=0

Struktur data indeks harga adalah sebagai berikut:


{
    "detail": {
        "eid": "Futures_Binance",
        "symbol": "BTC_USDT.index",
        "alias": "BTCUSDT",
        "baseCurrency": "BTC",
        "quoteCurrency": "USDT",
        "contractType": "index",
        "marginCurrency": "USDT",
        "basePrecision": 3,
        "quotePrecision": 1,
        "minQty": 0.001,
        "maxQty": 1000,
        "minNotional": 0,
        "maxNotional": 1.7976931348623157e+308,
        "priceTick": 0.1,
        "volumeTick": 0.001,
        "marginLevel": 10,
        "volumeMultiple": 1
    },
    "schema": [
        "time",
        "open",
        "high",
        "low",
        "close",
        "vol"
    ],
    "data": [
        [1584921600000, 58172, 59167, 56902, 58962, 0],
        [1584922500000, 58975, 59428, 58581, 59154, 0],
        // ...
    ]
}

Contoh permintaan data indeks harga yang dikirim oleh backtesting sistem adalah:

http://customserver:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1351641600&period=86400000&round=true&symbol=BTC_USDT.index&to=1611244800&trades=0

Contoh untuk Sumber Data Khusus

Tentukan alamat sumber data, misalnya,http://120.24.2.20:9090/data. Program layanan sumber data khusus ditulis menggunakanGolang:

package main

import (
    "fmt"
    "net/http"
    "encoding/json"
)

func Handle (w http.ResponseWriter, r *http.Request) {
    // e.g. set on backtest DataSourse: http://xxx.xx.x.xx:9090/data

    // request: GET http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=OKX&from=1584921600&period=86400000&round=true&symbol=BTC_USDT&to=1611244800&trades=1
    //              http://xxx.xx.x.xx:9090/data?custom=0&depth=20&detail=true&eid=Futures_Binance&from=1599958800&period=3600000&round=true&symbol=BTC_USDT.swap&to=1611244800&trades=0
    fmt.Println("request:", r)

    // response
    defer func() {
        // response data
        /* e.g. data
        {
            "detail": {
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10
            },
            "schema": [
                "time",
                "open",
                "high",
                "low",
                "close",
                "vol"
            ],
            "data": [
                [1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151],
                [1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738],
                [1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875],
                [1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777],
                [1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292],
                [1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666],
                [1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405],
                [1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768],
                [1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797],
                [1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692]
            ]
        }
        */
        
        // /* Simulation level Tick
        ret := map[string]interface{}{
            "detail": map[string]interface{}{
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10,
            },
            "schema": []string{"time","open","high","low","close","vol"},
            "data": []interface{}{
                []int64{1610755200000, 3673743, 3795000, 3535780, 3599498, 8634843151},  // 1610755200000 : 2021-01-16 08:00:00
                []int64{1610841600000, 3599498, 3685250, 3385000, 3582861, 8015772738},  // 1610841600000 : 2021-01-17 08:00:00
                []int64{1610928000000, 3582499, 3746983, 3480000, 3663127, 7069811875},
                []int64{1611014400000, 3662246, 3785000, 3584406, 3589149, 7961130777},
                []int64{1611100800000, 3590194, 3641531, 3340000, 3546823, 8936842292},
                []int64{1611187200000, 3546823, 3560000, 3007100, 3085013, 13500407666},
                []int64{1611273600000, 3085199, 3382653, 2885000, 3294517, 14297168405},
                []int64{1611360000000, 3295000, 3345600, 3139016, 3207800, 6459528768},
                []int64{1611446400000, 3207800, 3307100, 3090000, 3225990, 5797803797},
                []int64{1611532800000, 3225945, 3487500, 3191000, 3225420, 8849922692},
            },
        }
        // */

        /* Bot level Tick
        ret := map[string]interface{}{
            "detail": map[string]interface{}{
                "eid": "Binance",
                "symbol": "BTC_USDT",
                "alias": "BTCUSDT",
                "baseCurrency": "BTC",
                "quoteCurrency": "USDT",
                "marginCurrency": "USDT",
                "basePrecision": 5,
                "quotePrecision": 2,
                "minQty": 0.00001,
                "maxQty": 9000,
                "minNotional": 5,
                "maxNotional": 9000000,
                "priceTick": 0.01,
                "volumeTick": 0.00001,
                "marginLevel": 10,
            },
            "schema": []string{"time", "asks", "bids", "trades", "close", "vol"},
            "data": []interface{}{
                []interface{}{1610755200000, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{9531300, 10}}, []interface{}{[]int64{1610755200000, 0, 9531300, 10}}, 9497060, 787},
                []interface{}{1610841600000, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{9531300, 15}}, []interface{}{[]int64{1610841600000, 0, 9531300, 11}}, 9497061, 789},                
            },
        }
        */

        b, _ := json.Marshal(ret)
        w.Write(b)
    }()
}
func main () {
    fmt.Println("listen http://localhost:9090")
    http.HandleFunc("/data", Handle)
    http.ListenAndServe(":9090", nil)
}

Strategi pengujian,JavaScriptContoh:

/*backtest
start: 2021-01-16 08:00:00
end: 2021-01-22 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"OKX","currency":"BTC_USDT","feeder":"http://120.24.2.20:9090/data"}]
args: [["number",2]]
*/

function main() {
    var ticker = exchange.GetTicker()
    var records = exchange.GetRecords()
    Log(exchange.GetName(), exchange.GetCurrency())
    Log(ticker)
    Log(records)
}

Mesin Backtest Lokal

FMZ Quant Trading Platform telah membuka sumber untukJavaScriptbahasa danPythonbahasa mesin backtest lokal, mendukung pengaturan Periode K-line yang mendasari selama backtesting.

Kunci Pintasan Halaman Backtest

  • Tombol pintasan untuk beralih antara halaman Editing dan halaman Backtesting Gunakan kunci.Ctrl +,untuk beralih kembali ke halaman Backtest dan halaman Edit Strategy.CtrlTekan tombol.,.

  • Kunci pintasan untuk strategi penghematan Gunakan kunci.Ctrl + suntuk menyelamatkan strategi.

  • Jalan pintas untuk memulai strategi backtest Gunakan kunci.Ctrl + buntuk memungkinkan Start Backtest.

Backtest Data Unduh

  • Mengunduh data log sistem backtesting Buka strategi tertentu dan beralih ke Backtest Page untuk backtest strategi. Di kolom Status Information dari strategi yang ditampilkan setelah backtest, ada tombol Download Table di sudut kanan atas. Klik untuk mengunduh file CSV dari data kolom status di akhir backtest.
  • Backtesting sistem status bar data download Buka strategi tertentu dan beralih ke Backtest Page untuk backtest strategi. Di kolom Log Information dari strategi yang ditampilkan setelah backtest, ada tombol Download Table di sudut kanan atas. Klik untuk mengunduh file format CSV dari data log backtesting.

Algoritma Sharpe dalam Sistem Tes Balik

Kode sumber algoritma Sharpe dalam sistem backtesting:

function returnAnalyze(totalAssets, profits, ts, te, period, yearDays) {
    // force by days
    period = 86400000
    if (profits.length == 0) {
        return null
    }
    var freeProfit = 0.03 // 0.04
    var yearRange = yearDays * 86400000
    var totalReturns = profits[profits.length - 1][1] / totalAssets
    var annualizedReturns = (totalReturns * yearRange) / (te - ts)

    // MaxDrawDown
    var maxDrawdown = 0
    var maxAssets = totalAssets
    var maxAssetsTime = 0
    var maxDrawdownTime = 0
    var maxDrawdownStartTime = 0
    var winningRate = 0
    var winningResult = 0
    for (var i = 0; i < profits.length; i++) {
        if (i == 0) {
            if (profits[i][1] > 0) {
                winningResult++
            }
        } else {
            if (profits[i][1] > profits[i - 1][1]) {
                winningResult++
            }
        }
        if ((profits[i][1] + totalAssets) > maxAssets) {
            maxAssets = profits[i][1] + totalAssets
            maxAssetsTime = profits[i][0]
        }
        if (maxAssets > 0) {
            var drawDown = 1 - (profits[i][1] + totalAssets) / maxAssets
            if (drawDown > maxDrawdown) {
                maxDrawdown = drawDown
                maxDrawdownTime = profits[i][0]
                maxDrawdownStartTime = maxAssetsTime
            }
        }
    }
    if (profits.length > 0) {
        winningRate = winningResult / profits.length
    }
    // trim profits
    var i = 0
    var datas = []
    var sum = 0
    var preProfit = 0
    var perRatio = 0
    var rangeEnd = te
    if ((te - ts) % period > 0) {
        rangeEnd = (parseInt(te / period) + 1) * period
    }
    for (var n = ts; n < rangeEnd; n += period) {
        var dayProfit = 0.0
        var cut = n + period
        while (i < profits.length && profits[i][0] < cut) {
            dayProfit += (profits[i][1] - preProfit)
            preProfit = profits[i][1]
            i++
        }
        perRatio = ((dayProfit / totalAssets) * yearRange) / period
        sum += perRatio
        datas.push(perRatio)
    }

    var sharpeRatio = 0
    var volatility = 0
    if (datas.length > 0) {
        var avg = sum / datas.length;
        var std = 0;
        for (i = 0; i < datas.length; i++) {
            std += Math.pow(datas[i] - avg, 2);
        }
        volatility = Math.sqrt(std / datas.length);
        if (volatility !== 0) {
            sharpeRatio = (annualizedReturns - freeProfit) / volatility
        }
    }

    return {
        totalAssets: totalAssets,
        yearDays: yearDays,
        totalReturns: totalReturns,
        annualizedReturns: annualizedReturns,
        sharpeRatio: sharpeRatio,
        volatility: volatility,
        maxDrawdown: maxDrawdown,
        maxDrawdownTime: maxDrawdownTime,
        maxAssetsTime: maxAssetsTime,
        maxDrawdownStartTime: maxDrawdownStartTime,
        winningRate: winningRate
    }
}
Editor Strategi Fungsi Masuk Strategi