システムトレードソフト「Protra」のバックテストがソート処理修正で6倍高速になる

ある日の職場での会話。

 
 

先輩「俺は株のセンス結構あると思うんだよね。」

先輩「10億ぐらい貸してくれたら、利子つけて返せる自信があるよ。」

先輩「元手が無いからやってないけどさ。」

私「では、まず100万円を200万円にすることから始めたらどうでしょう?」

私「自信があるなら何度もやっていれば1億いきますよ?」

先輩「いや、何度も予想を当て続けるのは無理っしょ。」

 
 

何度も勝ち続けれない=再現性が無い

 
そんな手法はギャンブルだ。

 
 

東大生や慶応早稲田などの高学歴者が多い会社だけど、投資の世界じゃ てんでトーシローだな……。

そもそも投資は「センス」で行ったり「予想」するものではない。

徹底的に裁量を捨て再現性を追求した投資方法の一つが

 
 
システムトレード
 
 

これは、システムトレードで億万長者という安易な夢を見て

人生の大半を費やしてしまった 一人の愚かな中年男性のストーリー。

全然、儲からねーーー。

ソート部分の実装結局どうしたか?

前回、システムトレードツール「Protra」でソートの部分が遅かった事が分かった。

システムトレードソフト「Protra」のバックテストが遅い原因の調査
もしもし虎よProtra(プロトラ)よ世界のうちでお前ほど歩みの のろいものはないどうして そんなにのろいのか。一回のバ...

 
 

「遅くても別に良いや~!」

 

と思っていたけど、週末に手持ち無沙汰だったので「選択ソート」を使った形に作り直した。

週末を潰したけどね。

 

「釣り」や「ウンチク」記事って全くPVが伸びない。

一方、システムトレード関連の記事ならどんな話でも「釣り」の記事の6倍以上は訪問客が来る。

訪問客をブログに呼ぶために修正したと言っても過言ではない……。

 

……という訳ではなく、時間を忘れて没入して実装&検証していた。

きっと自分はこういう作業が好きなのだと思う。

 
 

「課題」まで出させておいて「施策」を実施させない、うちのような組織になっちゃ駄目だしね。

ソート修正後の、バックテスト時間はどうなった?

で、前回同様に下記のストラテジーを使って「時間測定」をしてみた。

cosisin氏の高スペックデイトレ戦略有効性検証(システムトレード)
システムトレードのバックテストを継続的に続けているが、それに対して嬉しい反響をもらった。うん。儲かってないのは事実だ。利益曲線が寝ないストラテジーが未だ作れてないからね。でも、手法を公開した事で利...

 
 

【修正前】

  • 約3時間(2時間54分52秒)

【修正後】

  • 約30分(0時間30分24秒)

その差

 
 
 

まさかの 6倍

 
 
 

6倍だよ……6倍。

 
 
 

(C)鳥山明/ドラゴンボール

 
 
 

悟空がこの時「界王拳6倍」を使えていたら

楽にベジータを倒すことができていただろう。

 
 
 

衝撃的な速度改善。

 
 
 

図に表すとこうなる。

 
 
 

今まで、どれだけ無駄なアルゴリズムで実装していたのか……。

中身を理解せずにソースコードを拝借したら駄目だなーー。

 
 

この関数はUtility.ptに追加。

既にGitHubにも公開済み。

GitHub - nehori/protra_lib
Contribute to nehori/protra_lib development by creating an account on GitHub.

大域変数や実処理部分に「オマジナイ」的な処理を書きたくないので、これでも色々と無駄な計算が走っている。

できる限り下位互換を取るつもりだったが、過去の無駄な大域変数を消すことにした。

なので、少しアルゴリズムに修正が必要。

抜粋すると次のような書き方となる。

この例では、銘柄を最大10件のみ選定して選択ソートで昇順に並べている。

まぁ……別に誰も使っているライブラリでも無いし、多くの人にはどうでも良い話だろうけどね。

まとめ

ソート部分を選択ソート&必要銘柄数だけソートをするように変更することで、今回のストラテジーでは6倍の速度改善を実現した。

今後のバックテストでは、この方法を使っていく。

ただし、シグナルが極端に多いような手法に有効な高速化であり、すべての手法が6倍早くなる訳ではない。念の為。

システムトレード 2021年(社会人17年) 投資

コメント

  1. マコト より:

    検証時間の短縮ができて良かったです。
    3時間以上かかると当然ですが検証の数をこなせませんし、何より実運用が難しくなります。
    何かトラブルがあった時のリカバーを考えると30分あたりが無理がない時間です。

  2. nehori より:

    アドバイスありがとうございました。

    これでストラテジー部分に専念できます。

  3. materakado より:

    いつの間にかorderの初期化を
    while (i < $maxCode)
    $order[i] = -1
    i = i + 1
    end
    とフロントからUtilityに移していたりして進化感じております。

ねほり.com
タイトルとURLをコピーしました