もともとProtraはバックテストだけの目的で、手法が確立したら実践ではPythonをを使ってシステムトレードの仕組みを実装する計画でした。
そのために重要なのは、Protraライブラリ「TIlib.pt(テクニカル指標のAPIを提供)」の移植です。
これに変わるライブラリは存在しており「TA-Lib」を使う事を考えていました。
「TA-Lib」とは(T)テクニカル(A)アナリシス-(Lib)ライブラリの略です。
実装すると、次のようなコードになります。
このアプローチに対し、シストレを既に実践されている方より、次のようなコメントをもらいました。
目的(株の自動売買)に対して、手段(ProtraをPythonに移植する)が入れ替わっているのでは?
毎日、上司に言われている指摘を受けました・・・。
おっしゃる通りです。
素直にProtra(Windowsアプリ)を自動化する事を考えます・・・
【最初の挑戦】Protraの自動化
Protraはオープンソースのアプリです。
であれば、CUIコマンドで必要な処理をできるようにソースコード書き換えすれば良いじゃん?
と試みました。
が・・・断念。GUI依存度が高すぎました。
【次の挑戦】PyAutoGUIでWindowsアプリの操作自動化
Windowsアプリの操作自動化は、簡単です。
学生時代より、UWSCを使ってWindows画面の操作を自動化しています。
ただ、最近は、RPA(Robotic Process Automation /ロボティック・プロセス・オートメーション)とか自動テストの影響で、多くのツールの選択肢があります。
簡単にまとめてみました。
ツール名 | 簡単な説明 |
---|---|
VBA + UIAutomation | UIAutomationをCOM経由でVBAで実行して画面操作 |
PowerShell + UIAutomation | UIAutomationを.NET経由でPowerShellを使って実行 |
WinAppDriver | Microsoftが開発したSeleniumライクの自動操作を実現するツール |
Friendly | テストツール。操作対象のアプリにテスト用のDLLをインジェクションし、タブの中の要素を画像認識を使わずに操作 |
PyAutoGUI | Pythonでの自動操作を実現。基本的に画像認識で操作。MacでもLinuxでも動作。 |
UWSC | 昔のツール。UIAutomationが認識できる要素を解析可能。公式サイトは閉鎖 |
sikulix | 画像認識に特化したツール。Javaで動作してどこでも動くうえ、スクリプト自体はPythonやRuby,JavaScriptで記載できる。 |
RocketMouse | 昔からある自動操作ツール。画像認識はできますが、オブジェクトの認識はWin32で作ったものしかできない |
UIPath | 2018年のforresterの調査でRPAのリーダーと言わしめた製品。高価格帯ですが、Community版なら個人や小規模事業では使用可能。 |
HiMacroEx | マウスの動きやキーボードを記録して再生することができるフリーソフト |
他にも、BizRobo/BasicRobo(Kofax Kapow)、blueprism、Automation Anywhere、Nice、Win Actor、Autoブラウザ名人、ipaS、NEC Software Robot Solution、RPA Express(WorkFusion)、Seleniumなどがある。
今回は汎用性の高そうなPythonライブラリの「PyAutoGUI」を使ってみます。
「PyAutoGUI」は、Windows, Linux, Mac OS対応、マルチプラットフォームで稼働するPython Gui Automation Libraryです。
PyAutoGUIのインストール
pip を使って行うのが手っ取り早くて便利です。
ウインドウの場所を識別するために、COM制御系のモジュールもインストールします。
また、クリップボードも利用するので、pyperclipも必要です。
今回のサンプル実装では、opencv_pythonなどは、インストール無くても動くはずです。
ソースコード
自動売買の処理は次の通りです。
- Protraを起動して最新株価を取得
- PtSimを起動して、バックテスト実施
- バックテスト結果をファイルに保存(デバッグ目的含む)
- 本日(明日)買う・売る銘柄を抽出
- SBI銀行にログインして成行き売り・買い
それをコードにすると次のようになります。
なお、SBI証券へのログインは「SBIcomm」を使いました。
ただし、私は自動売買可能なロジックが出来てないので、スクリプト全体としては動作未確認です。
また、タイムアウト処理などカスタマイズ必要な部分が多々あるので、理解できる方のみお使い下さい。
このソースコードでは、画像比較をしており、正解画像が必要です。
こちらの画像を同じフォルダに入れて下さい。
また、バックテストで、翌日購入銘柄は自分でPrintlog関数などを入れて結果出力が必要です。
それをパースして、購入銘柄を抽出します。
エラーでハマった内容まとめ
簡単に作れる・・と思ったけど、色々ハマッた。
トライ&エラーになり、関数化を断念したものが沢山ある・・
【問題1】TypeError: ‘NoneType’ object is not subscriptable
もっとも多くの人が、ハマってるエラーが「pyautogui.locateCenterOnScreen」が一致せずスクリプトがエラー吐いて死ぬというもの。
これは条件分岐ではなく、例外処理で対応が必要です。
【問題2】画像判断(locateCenterOnScreen)が動かない
こちらは致命的。
PyAutoGUIは、スクリーン上の画像を検索して一致したら指定のアクションを起こす仕組みがあります。
ただ、その画像の画面位置が異なると一致しませんでした・・・。
閾値(confidence)を指定しても動作せず、できる限りキーボード操作に差し替えました。
ただ、後学のために「株価の更新」部分は、画像を使って完了処理を確認しています。
タイムアウトをセットしているので、画像一致が動作しなくても問題はありませんし、この部分は、スクリーン位置を動かしても認識しました。
PtSimのバックテスト完了に関しては、「正常に終了しました。」が表示されたら終了としています。
当初は「実行」ボタン有無で判断してました。
しかし上記理由で、locateCenterOnScreenが動かないので、苦肉の策としました。
結果
YouTubeに動画を上げておきました。
単にUIが動いているだけで、何も面白いところは無いです。
まとめ
あくまで実際に自動でGUI操作を自動化するだけなので、処理スピードとしては遅いです。
また、各イベントを座標・ショートカットキー・カーソル移動で指定していくので、ソースコードが見づらくなりがちです。
また、処理が動いているときは対象のPCが操作できません(プログラムの処理に影響あり)。
この辺りは、昔から何も変わってはいませんね。
とりあえず、私の場合は自動化より、はやく売買ロジックを見つける必要があります・・・
参考)PyAutoGUIリファレンス
殆んどPyAutoGUIが使われてないのか情報が少ないので、後学を兼ねて載せておきます(色々なサイトに転載させておりオリジナルが誰か分からず)。