Sumber dimuat naik... memuat...

Sistem Ujian Belakang

Selepas anda menyelesaikan reka bentuk strategi perdagangan kuantitatif, bagaimana anda boleh mengetahui keadaan asas strategi anda, seperti logik strategi dan arah pulangan strategi? Sudah tentu, kita tidak boleh menggunakan wang sebenar secara langsung untuk menjalankan strategi di pasaran perdagangan sebenar, tetapi kita boleh menggunakan data sejarah untuk menguji strategi anda dan mengetahui keuntungan strategi anda dalam data sejarah.

Backtest Model Sistem

FMZ Quant Trading Platform membahagikan sistem backtest keparas botdantahap simulasi. Tahap bot adalah untuk backtest sepenuhnya mengikut data sejarah lengkap; manakala tahap simulasi backtest menjanatickdata berdasarkan data K-line sebenar pada selang waktu yang tetap untuk backtest. Kedua-duanya berdasarkan data sejarah sebenar, tetapi data peringkat bot lebih tepat dan hasilnya lebih boleh dipercayai. Walau bagaimanapun, backtesting hanyalah prestasi strategi mengikut data sejarah. Data sejarah tidak dapat mewakili sepenuhnya pasaran masa depan. Pasaran sejarah boleh berulang, atau juga boleh membawa kepada Black Swan. Oleh itu, hasil backtest harus diperlakukan secara rasional dan objektif.

PeraturanTahap simulasi Tickmenghasilkan simulasiData kutuberdasarkan tempoh garis K asas, setiap tempoh garis K asas akan menjana maksimum 12 titik masa backtest;Tahap pasaran sebenar Tickbacktesting menggunakan data tik sebenar yang dikumpulkan detik demi detik, jumlah data sangat besar dan kelajuan backtesting perlahan, jadi ia tidak boleh backtested untuk jangka masa yang sangat lama. mekanisme backtest FMZ Quant membolehkan strategi untuk berdagang beberapa kali pada satu K-line, mengelakkan situasi di mana perdagangan hanya boleh dilaksanakan pada harga penutupan. Ia lebih tepat sambil mengambil kira kelajuan backtest.

Penerangan mekanisme sistem pengujian balik

  • Simulasi Tingkat Tick PeraturanTahap simulasi Tickadalah berdasarkan data K-line asas sistem backtest, mensimulasikan data tik untuk backtest dalam rangka harga tertinggi, harga terendah, harga pembukaan, dan nilai harga penutupan bar K-line asas tertentu mengikut algoritma tertentu. Sebagai data tik masa nyata pada siri masa backtesting, ia kembali apabila program strategi memanggil antara muka. Untuk butiran, sila rujuk:Mekanisme Simulasi Tahap Sistem Ujian Belakang.

  • Tick Tingkat Bot Bot level backtest adalah data tahap tik sebenar dalam bar time series. Untuk strategi berdasarkan data tahap tik, menggunakan tahap pasaran sebenar untuk backtest lebih dekat dengan realiti. Dalam bot level backtest, data tik adalah data yang direkodkan sebenar, bukan yang disimulasikan. Ia menyokong data kedalaman, main semula data rekod perdagangan pasaran, kedalaman tersuai dan setiap data perdagangan individu. Saiz maksimum backtest data peringkat pasaran sebenar adalah sehingga maksimum 50MB, tanpa had pada julat masa backtest dalam had atas set data. Jika anda perlu memperbesar julat masa backtest sebanyak mungkin, anda boleh mengurangkan nilai tetapan kedalaman geartest dan tidak menggunakan setiap data perdagangan individu untuk meningkatkan julat masa backtest Call.GetDepth, GetTradesPada masa data pasaran pada garis masa, memanggilGetTicker, GetTrades, GetDepthdanGetRecordstidak akan mendorong masa beberapa kali apabila masa bergerak pada garis masa backtest (yang tidak akan mencetuskan lompatan ke masa data pasaran seterusnya). Panggilan berulang ke salah satu fungsi di atas akan mendorong masa backtest untuk bergerak pada garis masa backtest (lompat ke masa data pasaran seterusnya). Apabila tahap pasaran sebenar digunakan untuk backtest, masa yang lebih awal tidak disyorkan untuk memilih. Mungkin tidak ada data tahap pasaran sebenar dalam tempoh masa yang lebih awal.

Tick peringkat botdanTick tahap simulasimod, mekanisme pencocokan urus niaga sistem backtest: pencocokan urus niaga pesanan dijalankan mengikut harga yang dilihat dan jumlah penuh diperdagangkan. Oleh itu, senario transaksi separa tidak boleh diuji dalam sistem backtest.

Sistem Backtesting menyokong pelbagai bahasa pengaturcaraan

Sistem backtesting menyokong strategi backtesting yang ditulis dan direka oleh:JavaScript, TypeScript, Python, C++, PINE, MyLanguage, Blocklypenglihatan. Ujian belakangJavaScriptdanC++strategi perdagangan dijalankan dalam penyemak imbas, dan bot pasaran sebenar atauWexApppasaran sebenar pertukaran (iaituWexApppertukaran FMZ Quant Trading platform) berjalan tanpa memasang sebarang perisian lain, perpustakaan atau modul. Ujian belakangPythondilakukan pada docker; ia boleh dilakukan pada pelayan awam yang ditambahkan oleh platform FMZ Quant Trading, dan ia juga boleh dilakukan pada docker pengguna sendiri.PythonJika beberapa perpustakaan diperlukan, mereka perlu dipasang secara manual (hanya biasaPythonperpustakaan disokong pada pelayan awam FMZ Quant).

Ia menyokongJavaScriptPengujian balik strategi dalam Chrome DevTools,sila rujuk.

Pertukaran yang disokong dalam sistem pengujian balik

  • Cryptocurrency Bursa spot dan niaga hadapan utama untuk cryptocurrency; menyokong data mengenai semua jenis bursa.
  • Futu Securities Saham Hong Kong, saham AS dan pasaran lain.

Pengoptimuman Parameter Sistem Backtesting

Fungsi pengoptimuman parameter sistem backtest FMZ Quant Trading Platform adalah untuk menetapkan kombinasi parameter mengikut setiap pilihan pengoptimuman parameter semasa backtesting.Pengoptimumanpilihan di sebelah kanan parameter strategi untuk memaparkan tetapan pengoptimuman.

  • Nilai minimum: untuk menghadkan nilai permulaan parameter.
  • Nilai maksimum: untuk mengehadkan nilai maksimum parameter selepas perubahan tambahan.
  • Saiz langkah: jumlah pembolehubah tambahan parameter.
  • Benang serentak: Semasa pengoptimuman parameter, tetapkan bilangan utas untuk pelaksanaan serentak setiap kombinasi parameter backtest.JavaScript, PINE, danMy Language, dan tidak menyokong optimalisasi parameter pada templat.

Kombinasi parameter dihasilkan berdasarkanminimum, maximum, danstep sizeSistem backtesting berulang melalui kombinasi parameter ini untuk backtesting (iaitu, backtesting setiap kombinasi parameter sekali).nomborjenis boleh dioptimumkan dalam sistem backtesting.

Simpan Tetapan Backtest

Dalamhalaman penyuntingan strategi, dalam paginasi Backtest (iaitu sistem backtest), anda boleh menetapkan pilihan seperti konfigurasi backtest dan parameter strategi untuk backtest strategi. tetapan backtest merujuk kepada julat masa backtest, platform pertukaran, slippoint dan yuran perkhidmatan dan lain-lain; manakala parameter strategi digunakan untuk menetapkan pilihan parameter untuk strategi. Apabila parameter ini ditetapkan, anda boleh mengikuti strategi set backtesting, maka bagaimana untuk menyimpan set maklumat konfigurasi?

    1. Anda boleh menggunakan Save Backtest Settings butang padaHalaman Pengeditan Strategiuntuk merakam semua maklumat konfigurasi backtest (termasuk tetapan tetapan backtest dan tetapan parameter strategi) dalam kod sumber strategi dalam bentuk kod.
    1. Apabila anda menyimpan strategi dengan mengklik butang Save Strategy di halaman penyuntingan strategi, platform akan secara automatik merakam tetapan backtest semasa, konfigurasi parameter strategi, dan maklumat lain. Bagaimana untuk memuatkan konfigurasi backtest ke dalam sistem backtest?
    1. Apabila menyegarkan halaman penyuntingan strategi atau membuka semula halaman penyuntingan strategi ini, maklumat konfigurasi backtest yang direkodkan oleh butang Save Backtest Settings akan dimuatkan secara automatik terlebih dahulu.
    1. Jika tidak ada maklumat konfigurasi backtest yang direkodkan dalam kod strategi semasa sebagai komenbacktest(diselamatkan dalam kod strategi melalui butang Save Backtest Settings), sistem backtest secara automatik mengkonfigurasi tetapan backtest kepada maklumat konfigurasi backtest apabila butang Save Strategy terakhir diklik untuk strategi semasa.
    1. Jika maklumat konfigurasi backtest yang direkodkan dalam bentuk komen di awal kod strategi diubah pada halaman penyuntingan strategi, anda perlu menyegerakkan maklumat konfigurasi backtest yang dikemas kini ke pilihan antara muka backtest strategi.backtestdalam 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 tetapan backtest, terdapat sedikit perbezaan format padaJavaScript/Python/C++/MyLanguage/PINEbahasa apabila menyimpan tetapan backtest ke kod 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 tersuai

Sistem backtesting Platform Dagangan Kuantum FMZ menyokong sumber data tersuai, sistem backtesting menggunakanGETkaedah untuk meminta URL tersuai (URL yang boleh diakses awam) untuk mendapatkan sumber data luaran untuk backtest. Parameter permintaan tambahan adalah seperti berikut:

Parameter Makna Penjelasan
simbol Nama Simbol Data pasaran spot, seperti:BTC_USDT, data pasaran niaga hadapan, seperti:BTC_USDT.swap, data kadar pembiayaan kontrak jangka panjang, seperti:BTC_USDT.funding, data indeks harga kontrak kekal niaga hadapan, seperti:BTC_USDT.index
eid Pertukaran seperti OKX, Futures_OKX
bulat Ketepatan Data Benar bermaksud bahawa ketepatan tertentu ditakrifkan dalam data yang dimasukkan kembali oleh sumber data tersuai.round=true
tempoh Tempoh data K-line (milisaat) seperti:60000adalah tempoh 1 minit
kedalaman Tahap Kedalaman 1-20
perdagangan Sama ada perlu untuk membahagikan data benar(1) / salah(0)
daripada Masa Mula cap masa unix
kepada Masa Akhir cap masa unix
butiran Permintaan data untuk butiran simbol Benar bermaksud bahawa ia perlu disediakan oleh sumber data tersuai. Permintaan yang dihantar oleh FMZ Quant Trading Platform Backtesting System ke sumber data tersuai ditetapkan sebagai:detail=true
adat Parameter ini boleh diabaikan

Apabila sumber data objek pertukaran spot dan pertukaran niaga hadapan ditetapkan kepada sumber data tersuai (feeder), sistem backtesting menghantar permintaan kepada perkhidmatan sumber data tersuai:

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 mestilah salah satu daripada dua format berikut (yang akan dikenali oleh sistem secara automatik):

  • Tahap 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]
        ]
    }
    
  • Bot tahap centang, berikut adalah contoh data JSON: Tick-level data backtest (mengandung maklumat mengenai kedalaman pasaran, dan format kedalaman adalah pelbagai[price, volume]Ia boleh mempunyai pelbagai tahap kedalaman,asksuntuk pesanan harga yang semakin meningkat,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 Penerangan
butiran Maklumat terperinci mengenai jenis data yang diminta,

termasuk nama mata wang yang diisytiharkan, nama mata wang dagangan, ketepatan, kuantiti pesanan minimum, dan sebagainya. Schema. Ia menentukan sifat-sifat lajur dalam data array, yang sensitif huruf besar dan hanya terhad kepada masa, terbuka, tinggi, rendah, dekat, vol, meminta, tawaran, perdagangan Data. Struktur lajur, data yang direkodkan mengikut skema tetapan.

medan butiran

Lapangan Penerangan
eid ID Bursa, sila ambil perhatian bahawa tempat dan niaga hadapan
Pertukaran tertentu mempunyai eid yang berbeza.
simbol Kod produk dagangan
nama samaran Simbol dalam pertukaran yang sepadan dengan semasa
Kod produk dagangan
Mata wang asas Mata Wang Dagangan
hargaCurrency Mata wang yang ditandatangani
MarginWaluta Mata Wang Margin
asasKetepatan Keakuratan Mata Wang Transaksi
QuotePrecision Keakuratan Mata Wang Harga
MinQty Jumlah Perintah Minimum
MaxQty Jumlah Perintah Maksimum
MinNotional Jumlah Perintah Minimum
maxNotional Jumlah Perintah Maksimum
hargaTick Lonjakan Harga
volumeTick Nilai perubahan minimum kuantiti pesanan (satu lompatan dalam
kuantiti pesanan)
marginLevel Nilai Leverage Futures
kontrakJenis Untuk kontrak kekal yang ditetapkan untuk:swap, yang

sistem backtest akan terus menghantar kadar pembiayaan dan indeks harga permintaan.

Atribut lajur khasasks, bids, trades:

Lapangan Penerangan Catatan
permintaan / tawaran [harga, jumlah],...] Sebagai contoh, data dalam

KesemuaLive Trading Level Tickcontoh data:[[9531300, 10]]∙∙ Perdagangan. Waktu, Arah, Harga, Volume. contohnya, data dalamLive Trading Level Tickcontoh data:[[1564315200000, 0, 9531300, 10]] |

Apabila backtesting kontrak kekal di bursa niaga hadapan, adat sumber data juga memerlukan data kadar pembiayaan tambahan dan harga Sistem backtesting akan terus menghantar permintaan untuk kadar pembiayaan hanya apabila data pasaran yang diminta dikembalikan dan medan butiran dalam struktur yang dikembalikan mengandungi"contractType": "swap"Pasangan kunci-nilai.

Apabila sistem backtesting menerima data kadar pembiayaan, ia akan terus menghantar permintaan untuk data indeks harga.

Struktur data kadar pembiayaan adalah seperti 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
        ]
        // ...
    ]
}
  • Julat antara tempoh bersebelahan adalah 8 jam
  • Sebagai contoh, kadar pembiayaan Binance dikemas kini setiap 8 jam. Adakah data kadar pembiayaan -16795? Kerana seperti data K-line, untuk mengelakkan kehilangan ketepatan titik terapung semasa penghantaran rangkaian, data menggunakan jenis bilangan bulat; data kadar pembiayaan juga boleh negatif.

Contoh permintaan data kadar pembiayaan 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 seperti 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 dihantar 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 tersuai

Tentukan alamat sumber data, contohnya,http://120.24.2.20:9090/data. Program perkhidmatan sumber data tersuai 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 ujian,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)
}

Enjin Ujian Kembali Lokal

FMZ Quant Trading Platform telah membuka sumber untukJavaScriptbahasa danPythonbahasa enjin backtest tempatan, menyokong tetapan Underlying K-line Period semasa backtesting.

Tombol pintasan halaman Backtest

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

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

  • Pintasan untuk memulakan strategi backtest Gunakan kunci.Ctrl + buntuk membolehkan Start Backtest.

Muat turun Data Ujian Belakang

  • Muat turun data log sistem backtesting Buka strategi tertentu dan beralih ke Backtest Page untuk backtest strategi. Dalam lajur Status Information strategi yang dipaparkan selepas backtest, terdapat butang Download Table di sudut kanan atas. Klik untuk memuat turun fail CSV data lajur status di akhir backtest.
  • Backtesting sistem status bar data muat turun Buka strategi tertentu dan beralih ke Backtest Page untuk backtest strategi. Dalam lajur Log Information strategi yang dipaparkan selepas backtest, terdapat butang Download Table di sudut kanan atas. Klik untuk memuat turun fail format CSV data log backtesting.

Algoritma Sharpe dalam Sistem Ujian Balik

Kod 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