資源の読み込みに... 荷物...

バックテストシステム

定量的な取引戦略の設計を完了した後,戦略の論理や戦略の収益の方向などの戦略の基本状況をどのように知ることができますか? もちろん,我々は実際の取引市場で戦略を実行するために直接実際のお金を使用することはできませんが,我々はあなたの戦略をテストし,歴史的なデータであなたの戦略の利益を知るために歴史的なデータを使用することができます.

バックテストシステムモデル

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バックテストシステムでは,これらのパラメータの組み合わせをバックテスト (つまり,各パラメータの組み合わせを一度バックテスト) に繰り返します.番号バックテストシステムで最適化できます.

バックテスト設定を保存

について戦略編集ページバックテストの設定は,バックテストの時間範囲,交換プラットフォーム,スリップポイント,サービス料金などを指します. 戦略パラメータは戦略のパラメータオプションを設定するために使用されます. 設定された設定情報をどのように保存するか? 設定された設定情報をどのように保存するか?

    1. バックテスト設定を保存するボタンをクリックします.戦略編集ページバックテストの設定情報 (バックテスト設定と戦略パラメータ設定を含む) をすべてコード形式で戦略ソースコードに記録する.
    1. 戦略編集ページの"戦略保存"ボタンをクリックして戦略を保存すると,プラットフォームは現在のバックテスト設定,戦略パラメータ設定,その他の情報を自動的に記録します. バックテストの設定を バックテストシステムにどう読み込むか?
    1. 戦略編集ページをリフレッシュしたり,この戦略編集ページを再開する場合, バックテスト設定を保存するボタンが記録したバックテスト設定情報は,自動的に最初に読み込まれる.
    1. バックテストの構成情報が コメントとして現在の戦略コードに記録されていない場合backtest(戦略コードに"バックテスト設定を保存する"ボタンを介して保存されます) バックテストシステムは,現在の戦略の"バックテスト設定を保存する"ボタンを最後にクリックしたときにバックテスト設定をバックテスト設定情報に自動的に設定します.
    1. 戦略コードの初めのコメント形式で記録されたバックテスト構成情報が戦略編集ページで変更された場合,当面更新されているバックテスト構成情報を戦略バックテストインターフェースオプションに同期する必要があります.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線データ期間 (ミリ秒) 例えば:600001分間の期間です
深さ 深度レベル 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
        ]
        // ...
    ]
}
  • 隣接する期間の間隔は8時間です
  • 例えば,Binanceの資金提供率は 8時間ごとに更新されます. 資金提供率は -16795ですか? K線データと同様に,ネットワーク伝送中に浮点精度の喪失を避けるため,データは整数型を使用します. 資金調達の割合データもマイナスかもしれません.

バックテストからの資金調達のデータ要求の例 システムとは

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 + bBacktestを開始するを有効にする

バックテストデータ ダウンロード

  • バックテストシステムログデータダウンロード 特定の戦略を開いて,戦略をバックテストするために"Backtest Page"に切り替える.バックテスト後に表示される戦略の"Status Information"列には,右上隅に"Download Table"ボタンが表示されます.それをクリックすると,バックテストの終わりにステータス列データのCSVファイルをダウンロードできます.
  • バックテストシステム状態バーデータダウンロード 特定の戦略を開いて,戦略をバックテストするために"Backtest Page"に切り替える.バックテスト後に表示される戦略の"Log Information"列には,右上隅に"Download Table"ボタンが表示されます.それをクリックすると,バックテストログデータのCSVフォーマットファイルをダウンロードできます.

バックテストシステムにおけるシャープアルゴリズム

バックテストシステムにおけるシャープアルゴリズムのソースコード:

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
    }
}
戦略編集者 戦略入力機能