定量的な取引戦略の設計を完了した後,戦略の論理や戦略の収益の方向などの戦略の基本状況をどのように知ることができますか? もちろん,我々は実際の取引市場で戦略を実行するために直接実際のお金を使用することはできませんが,我々はあなたの戦略をテストし,歴史的なデータであなたの戦略の利益を知るために歴史的なデータを使用することができます.
FMZ 量子取引プラットフォームはバックテストシステムをボットレベルそしてシミュレーションレベルバックテストが生成される間,シミュレーションレベルのバックテストが生成されます.tick
バックテストのための定期的な間隔で実際のKラインデータに基づいてデータ.どちらも実際の歴史的データに基づいていますが,ボットレベルのデータはより正確で,結果はより信頼性があります.しかし,バックテストは歴史的なデータに基づいて戦略のパフォーマンスに過ぎません.歴史的なデータは将来の市場を完全に表現することはできません.歴史的な市場は繰り返す可能性があります.またはブラック・スワンも引き起こす可能性があります.したがって,バックテスト結果は合理的かつ客観的に扱われるべきです.
についてシミュレーションレベル Tickシミュレーションされたティックのデータ基となるK線周期に基づいて,各基となるK線周期は最大12のバックテストタイムポイントを生成します.実際の市場レベル Tickバックテストは,秒ごとに収集された実際のティックデータを使用し,データの量は非常に大きく,バックテストの速度は遅いため,非常に長い期間バックテストすることはできません. FMZ Quantのバックテストメカニズムは,戦略が1つのKラインで複数回取引できるようにし,取引が閉じる価格でのみ実行できる状況を回避します.バックテストの速度を考慮しながらより正確です.
シミュレーションレベル チェック についてシミュレーションレベル Tickバックテストシステムの基となるK線データに基づい,特定のアルゴリズムに従って,与えられた基となるK線バーの最高価格,最低価格,開盤価格,閉盤価格値の枠組み内でバックテストにティックデータをシミュレートする.バックテストタイムシリーズ上のリアルタイムティックデータとして,戦略プログラムがインターフェースを呼び出すときに返される.詳細については,以下を参照してください:バックテストシステムシミュレーションレベル メカニズム説明.
ボットレベル チェック
ボットレベルバックテストは,バータイムシリーズにおける実際のティックレベルデータである.ティックレベルデータに基づく戦略では,実際の市場レベルをバックテストに使うことが現実に近い.ボットレベルバックテストでは,ティックデータはシミュレーションではなく,実際の記録データである.深度データ,市場取引の記録データ再生,カスタム深度および各個別取引データをサポートする.リアルマーケットレベルのデータバックテストの最大サイズは最大50MBまでで,データセットの上限内のバックテスト時間範囲に制限はありません.バックテストの時間範囲をできるだけ拡大する必要がある場合は,ギア深度設定の値を減らすことができ,バックテストの時間範囲を増やすために各個別取引データを使用しないでください.GetDepth
, GetTrades
タイムラインの市場データで,電話GetTicker
, GetTrades
, GetDepth
そしてGetRecords
バックテストのタイムラインで時間が移動するときに,時間を複数回プッシュしない (次の市場データ瞬間へのジャンプを誘発しない).上記の機能の1つへの繰り返し呼び出しは,バックテストのタイムラインに移動するためにバックテスト時間をプッシュする (次の市場データ瞬間へのジャンプ).バックテストのために実際の市場レベルを使用する場合,以前の時間を選択することが推奨されません.早期の時間帯には実際の市場レベルのデータがない可能性があります.
ロボットレベル チェックそしてシミュレーションレベルTickバックテストシステムのトランザクションマッチングメカニズム:オーダートランザクションマッチングは,見られた価格に応じて実行され,全ボリュームが取引されます.したがって,部分的なトランザクションのシナリオは,バックテストシステムでテストすることはできません.
バックテストシステムは,以下によって作成され設計されたバックテスト戦略をサポートします.JavaScript
, TypeScript
, Python
, C++
, PINE
, MyLanguage
, Blockly
視覚化
バックテストJavaScriptそしてC++実際の市場ボットまたはウェックスアプリリアル市場 (つまり,ウェックスアプリFMZ Quant Tradingプラットフォームのエミュレーション交換) は,他のソフトウェア,ライブラリ,モジュールをインストールすることなく実行されます.
バックテストパイソンFMZ Quant Trading プラットフォームによって追加された公共サーバーで実行され,またユーザー自身のdockerで実行することもできます.実際の市場操作とバックテストの両方がパイソンドッカーが位置するシステムにインストールされます. いくつかのライブラリが必要であれば,手動でインストールする必要があります (一般的なもののみ)パイソンFMZ Quant 公共サーバーでサポートされています).
サポートしていますJavaScriptChrome DevToolsで戦略バックテスト・デバッグ参照してください.
FMZ Quant Trading Platformのバックテストシステムのパラメータ最適化機能は,バックテスト中に各パラメータ最適化オプションに従ってパラメータ組み合わせを設定することです.最適化戦略パラメータの右側に最適化設定を表示するオプションがあります.
JavaScript
, PINE
そしてMy Language
テンプレート上のパラメータ最適化をサポートしていない.パラメータの組み合わせはminimum
, maximum
そしてstep size
バックテストシステムでは,これらのパラメータの組み合わせをバックテスト (つまり,各パラメータの組み合わせを一度バックテスト) に繰り返します.番号バックテストシステムで最適化できます.
について戦略編集ページバックテストの設定は,バックテストの時間範囲,交換プラットフォーム,スリップポイント,サービス料金などを指します. 戦略パラメータは戦略のパラメータオプションを設定するために使用されます. 設定された設定情報をどのように保存するか? 設定された設定情報をどのように保存するか?
backtest
(戦略コードに"バックテスト設定を保存する"ボタンを介して保存されます) バックテストシステムは,現在の戦略の"バックテスト設定を保存する"ボタンを最後にクリックしたときにバックテスト設定をバックテスト設定情報に自動的に設定します.backtest
戦略編集の分野です/*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"}]
*/
微小なフォーマット差があるJavaScript
/Python
/C++
/MyLanguage
/PINE
バックテストの設定を戦略コードに保存する際の言語:
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"}]
*)
パイン語:
/*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"}]
*/
FMZ 量子取引プラットフォームのバックテストシステムは,カスタムデータソースをサポートし,バックテストシステムは,GET
バックテストのための外部データソースを取得するためにカスタム URL (公開アクセス可能な URL) を要求する方法.追加の要求パラメータは以下のとおりです.
パラメーター | 意味 | 解説 |
---|---|---|
シンボル | シンボルの名前 | スポット市場データ:BTC_USDT , 将来の市場データ,例えば:BTC_USDT.swap , 期日期永続契約の資金提供率データ,例えば:BTC_USDT.funding , 期貨永続契約価格指数データ,例えば:BTC_USDT.index |
イード | 交換 | OKX,Futures_OKX など |
丸い | データ の 正確性 | True は,カスタムデータソースから返信されるデータで特定の精度が定義されていることを意味します. FMZ 量子取引プラットフォームバックテストシステムからカスタムデータソースに送信されるリクエストは,以下のように固定されます.round=true |
期間 | K線データ期間 (ミリ秒) | 例えば:60000 1分間の期間です |
深さ | 深度レベル | 1-20 |
取引 | データを分割する必要性 | true ((1) / false ((0) となる |
から | 開始時間 | UNIX タイムスタンプ |
に | 終わり の 時 | UNIX タイムスタンプ |
詳細 | シンボルの詳細を要求するデータ | true は,カスタムデータソースによって提供される必要があることを意味します. FMZ 量子取引プラットフォームバックテストシステムによってカスタムデータソースに送信されるリクエストは,以下のように固定されます.detail=true |
カスタム | – | このパラメータは無視できます. |
スポット取引所と先物取引所のデータソースがカスタムデータソース (フィーダー) に設定された場合,バックテストシステムはカスタムデータソースサービスに要求を送信します:
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
返信形式は次の2つの形式の1つでなければならない ( システムによって自動的に認識されます)
シミュレーションレベル Tick,以下は 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]
]
}
JSON データの一例です.
Tickレベルバックテストデータ (市場深度に関する情報を含み,深度形式は[price, volume]
複数の深さのレベルを持つことができますasks
価格上昇順序の場合bids
値下がり順序で).
{
"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]
]
}
フィールド | 記述 |
---|---|
詳細 | 要求されるデータタイプに関する詳細な情報 |
通貨の名前を含む 取引通貨,精度,最低注文量などです データの列の属性を指定します. アレイは小数字感受性があり 時間に限定されています 高い,低い,閉じる,ボリューム,要求,オファー,取引 スキーマに従って記録されたデータです セットアップ
詳細フィールド
フィールド | 記述 |
---|---|
イード | スポットと先物 |
ある種の交換には 異なる効果があります | |
シンボル | 取引商品コード |
偽名 | 交換の記号は,現在の |
取引商品コード | |
ベース通貨 | 取引通貨 |
コート 通貨 | 定額通貨 |
マージン 通貨 | マージン通貨 |
ベース 精度 | 取引通貨の正確性 |
引用 精度 | 価格設定通貨の正確性 |
ミニ | 最低注文量 |
最大Qty | 最大注文量 |
ミノノショナル | 最低注文量 |
マックスノショナルの | オーダーの最大額 |
価格 タグ | 価格上昇 |
音量 チェック | オーダー数量の最小変更値 (一回 |
注文量) | |
マージンレベル | ローナンスローナンス |
契約型 | 永続契約については,以下のように設定します.swap について |
資金調達の率と価格指数を送信する 頼むのです
特殊列属性asks
, bids
, trades
:
フィールド | 記述 | コメント |
---|---|---|
要求 / 申し出 | [価格,容量...] | 例えば, |
についてLive Trading Level Tick
データ例:[[9531300, 10]]
素晴らしいです
取引をします. 取引の時間,方向,価格,量,
例えば,データLive Trading Level Tick
データ例:[[1564315200000, 0, 9531300, 10]]
|
フューチャー取引所の永続契約のバックテストでは,カスタム
資金提供率と価格に関する追加データも必要です
バックテストシステムはリクエストを送信し続けます
要求された市場データが返される場合に限る資金提供率
返された構造の詳細欄には"contractType": "swap"
キー値ペア
バックテストシステムに資金提供率のデータを受け取ると, 価格指数データへの要請を継続する.
資金調達の割合のデータ構造は以下のとおりです.
{
"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
]
// ...
]
}
バックテストからの資金調達のデータ要求の例 システムとは
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
価格指数データ構造は以下のとおりです.
{
"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],
// ...
]
}
バックテストによって送信された価格指数データ要求の例 システムとは
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
データ源アドレスを指定します.http://120.24.2.20:9090/data
. カスタムデータソースサービスプログラムは,Golang
:
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)
}
試験戦略JavaScript
例:
/*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 トレーディング プラットフォームはJavaScript
言語とPython
ローカルバックテストエンジンの言語,バックテスト中に基礎K線期間設定をサポートする.
戦略 Ctrl +,
キーの後ろに キーが表示され,Ctrl
キーを押して,
.
節約戦略のショートカットキー
鍵を使うCtrl + s
戦略を救うために
戦略のバックテストを開始するためのショートカット
鍵を使うCtrl + b
バックテストシステムにおけるシャープアルゴリズムのソースコード:
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
}
}
戦略編集者
戦略入力機能