ねほり.com

何もないから何かみつかる

PyAutoGuiでWindows操作の自動化(protraシストレ)

   

もともと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 + UIAutomationUIAutomationをCOM経由でVBAで実行して画面操作
PowerShell + UIAutomationUIAutomationを.NET経由でPowerShellを使って実行
WinAppDriverMicrosoftが開発したSeleniumライクの自動操作を実現するツール
Friendlyテストツール。操作対象のアプリにテスト用のDLLをインジェクションし、タブの中の要素を画像認識を使わずに操作
PyAutoGUIPythonでの自動操作を実現。基本的に画像認識で操作。MacでもLinuxでも動作。
UWSC昔のツール。UIAutomationが認識できる要素を解析可能。公式サイトは閉鎖
sikulix画像認識に特化したツール。Javaで動作してどこでも動くうえ、スクリプト自体はPythonやRuby,JavaScriptで記載できる。
RocketMouse昔からある自動操作ツール。画像認識はできますが、オブジェクトの認識はWin32で作ったものしかできない
UIPath2018年の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などは、インストール無くても動くはずです。

ソースコード

自動売買の処理は次の通りです。

  1. Protraを起動して最新株価を取得
  2. PtSimを起動して、バックテスト実施
  3. バックテスト結果をファイルに保存(デバッグ目的含む)
  4. 本日(明日)買う・売る銘柄を抽出
  5. 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が使われてないのか情報が少ないので、後学を兼ねて載せておきます(色々なサイトに転載させておりオリジナルが誰か分からず)。

 - 2019年(社会人15年), 投資, システムトレード, テクノロジー

  関連記事

Kerasを使ったMatplotlibのグラフ整形と日本語表示(ディープラーニング)

PytorchはLSTMが難しいらしいし、TensorFlowも難しいので未挑戦 …

AWS Summit Tokyo 2013 は飯が食べれず

仕事をサボってAWS(Amazon web service) Summit To …

個人サイト開設1999年より10周年経過

2009年05月14日(木) 個人サイト開設 10周年の御礼! 1999年 5月 …

cosisin氏の乖離率スイング戦略+騰落レシオの有効性検証(システムトレード)

大型台風 15号(ファクサイ)が猛威を奮い、10時頃に改札口まで行くと電車が15 …

「ネットランナー」のトレーディングカード「ねとらん者」を大人買い(1/2)

もしも 童話世界に 2ch を作ったら ‥‥?  ■掲示板に戻る■ 全 …

不老不死に向けた研究はどこまで進んでいるか?

「不老不死」 それは、歴史上、中国・秦の始皇帝が追い求め、多くの独裁者にとっての …

テニスコートの自動キャンセル確認&予約システム

2008年05月31日(土) 何か他にも活用できるかも テニスコートの自動キャン …

Kerasのモデル保存・利用(ディープラーニング)

Kerasを使った学習モデルの書き方に関しては、ある程度調べました。 はじめての …

JavaScriptを使った一発ギャグ

有限会社ヘッドジャパン・・・・の求人情報 待遇・・・・ 各種社保完備 昇給 賞与 …

じんぱち氏風グランビルの法則もどきの有効性検証(protraシストレ)

株のルールは単純なゲームです。 株が上がるのは、誰かが売りよりたくさん買ったから …