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.
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 menghasilkantick
data 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
, GetTrades
Pada saat data pasar pada timeline, panggilanGetTicker
, GetTrades
, GetDepth
danGetRecords
tidak 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 strategi backtesting yang ditulis dan dirancang oleh:JavaScript
, TypeScript
, Python
, C++
, PINE
, MyLanguage
, Blockly
visualisasi.
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.
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.
JavaScript
, PINE
, danMy Language
, dan tidak mendukung optimasi parameter pada template.Kombinasi parameter dihasilkan berdasarkanminimum
, maximum
, danstep size
Sistem backtesting berulang melalui kombinasi parameter ini untuk backtesting (yaitu, backtesting setiap kombinasi parameter sekali).nomorjenis dapat dioptimalkan dalam sistem backtesting.
Dalamhalaman pengeditan strategi, dalam paginasi
backtest
(disimpan dalam kode strategi melalui tombol backtest
di 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 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"}]
*/
Sistem backtesting dari FMZ Quant Trading Platform mendukung sumber data khusus, sistem backtesting menggunakanGET
metode 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:60000 adalah 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 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,asks
untuk urutan kenaikan harga,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 | 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 Tick
Contoh data:[[9531300, 10]]
Percayalah.
{\fnCandara\fs55\b1\4cH000000\4aH80}tuk perdagangan {\fnCandara\fs55\b1\4cH000000\4aH80}untuk
contoh, data dalamLive Trading Level Tick
Contoh 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
]
// ...
]
}
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
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,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 mesin backtest lokal, mendukung pengaturan Periode K-line yang mendasari selama backtesting.
Tombol pintasan untuk beralih antara halaman Ctrl +,
untuk beralih kembali ke halaman Ctrl
Tekan tombol.,
.
Kunci pintasan untuk strategi penghematan
Gunakan kunci.Ctrl + s
untuk menyelamatkan strategi.
Jalan pintas untuk memulai strategi backtest
Gunakan kunci.Ctrl + b
untuk memungkinkan
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