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.
FMZ Quant Trading Platform membahagikan sistem backtest keparas botdantahap simulasi. Tahap bot adalah untuk backtest sepenuhnya mengikut data sejarah lengkap; manakala tahap simulasi backtest menjanatick
data 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
, GetTrades
Pada masa data pasaran pada garis masa, memanggilGetTicker
, GetTrades
, GetDepth
danGetRecords
tidak 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 strategi backtesting yang ditulis dan direka oleh:JavaScript
, TypeScript
, Python
, C++
, PINE
, MyLanguage
, Blockly
penglihatan.
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.
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.
JavaScript
, PINE
, danMy Language
, dan tidak menyokong optimalisasi parameter pada templat.Kombinasi parameter dihasilkan berdasarkanminimum
, maximum
, danstep size
Sistem backtesting berulang melalui kombinasi parameter ini untuk backtesting (iaitu, backtesting setiap kombinasi parameter sekali).nomborjenis boleh dioptimumkan dalam sistem backtesting.
Dalamhalaman penyuntingan strategi, dalam paginasi
backtest
(diselamatkan dalam kod strategi melalui butang backtest
dalam 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 JavaScript
/Python
/C++
/MyLanguage
/PINE
bahasa 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"}]
*/
Sistem backtesting Platform Dagangan Kuantum FMZ menyokong sumber data tersuai, sistem backtesting menggunakanGET
kaedah 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:60000 adalah 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 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,asks
untuk pesanan harga yang semakin meningkat,bids
untuk 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 Tick
contoh data:[[9531300, 10]]
∙∙
Perdagangan. Waktu, Arah, Harga, Volume.
contohnya, data dalamLive Trading Level Tick
contoh 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
]
// ...
]
}
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
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,JavaScript
contoh:
/*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)
}
FMZ Quant Trading Platform telah membuka sumber untukJavaScript
bahasa danPython
bahasa enjin backtest tempatan, menyokong tetapan Underlying K-line Period semasa backtesting.
Tombol pintasan untuk beralih antara halaman Ctrl +,
untuk beralih semula ke halaman Ctrl
Tekan kekunci.,
.
Kunci pintasan untuk strategi penjimatan
Gunakan kunci.Ctrl + s
untuk menyelamatkan strategi.
Pintasan untuk memulakan strategi backtest
Gunakan kunci.Ctrl + b
untuk membolehkan
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