【Python】USD/JPYのリアルタイム情報を力技で取得する。

Uncategorized

こんにちはWorkaholicです。

今回はUSD/JPYの情報をリアルタイムに取得方法の提案です。(もっといい方法があるかも
現状で思いついた方法が以下の方法であったので備忘録として残しておきます。

・経緯

一昔前までリアルタイムで為替情報を取得するにはOANDA APIを利用するのが一般的でした。
無料で使えて大変重宝していましたが、OANDA側のサーバ負荷であったり、本来の目的以外の利用が増えたせいで本番口座を持ち一定の取引をしている人限定のサービスとなりました。
今まで無料が使えていたのが不思議なくらいだったのでしょうがないですね。

OANDAの HPより抜粋

「【重要】デモ口座の利用期限およびオーダーブックインジケーター、APIの利用条件変更について」

【重要】デモ口座の利用期限およびオーダーブックインジケーター、APIの利用条件変更について お知らせ詳細 | OANDA証券株式会社
お客様各位 平素は、弊社のサービスをご利用いただき誠に有難うございます。 この度、デモ口座の利用期限を設けさせていただくとともに、オーダーブックインジケーター、およびAPIのご利用条件を変更させていただくことになりましたので、ご案内いたします。 はじめに、これらの判断に至った経緯

ではこれはからはどうするのか?と言う点についてですが、OANDA以外に無償で使えるモノがまともに存在しない状況です。でもこれからシストレをやりたいのにデータが取得できないと困っちゃうので力技でもいいから取得手段について考えてみました。

・手段案

・Webサイトのスクレイピング

この手段はNGです。理由としては、スクレイピングをすればWebページのデータ取得は容易に行えますが、これは配信サイトに過剰な負荷をかける事になり常識的に良くありません。明にスクレイピングを禁止しているサイトもありますが、書いてなければOKという訳ではありません。自分だけだから・・・とやっていても、アクセス禁止になる可能性はありますので注意をしてください

・画面キャプチャ→OCR

もう手段なんて残されてなさそうですが一つだけやや難ありの方法があります。
それは「為替情報表示 →画面キャプチャ→OCR読み取り→数値化」この一連の流れを行う事です。
具体的には以下の通りです。

・為替情報表示→MT4(※前提としてMT4に対応したサービスで口座を持っている必要性があります

・画面キャプチャ→Python自作

・OCR読み取り→Tesseract 

OCRの正確性や、端末を一台これ用に使用する必要性がある部分が難点ですが、
他に手段が思いつかないので今回のこの手段を用いて実現をしたいと思います。

・手順

・為替情報の表示

MT4で自分の口座にログインし、ポップアップで現在の為替情報を表示させます。
※文字が小さいと後々のTesseractで正しく読めなくなる可能性があります。 

・ 画面キャプチャ

画面のキャプチャと加工も併せて行いたいのでPythonで行います。
※Pythonのインストールと必要なパッケージのインストールしておいてください

pip install opencv-python
pip install pyautogui
pip install Pillow

サンプルコードは以下の通りです。
保存先のパスは適当な場所を指定してください、<Y軸上>~の部分は切り抜きを行う箇所の座標を指定しています。各自の環境で異なるので正しい座標位置を指定してあげてください

import pyautogui as pag
from time import sleep
import cv2

savepath = '<保存先パス>'

try:
    while True:
       
        #スクリーンショット
        img = pag.screenshot(savepath + '/screenshot' + '.png')
        sleep(1)
        
        #ファイル切り抜き
        img = cv2.imread(savepath + '/screenshot' + '.png')
        img1 = img[<Y軸上> : <Y軸下>, <X軸左>: <X軸右>]
        
        #デバック出力
        cv2.imwrite(savepath + '/tmp.jpg', img1)
        
        #白黒二極化
        src = cv2.imread(savepath + '/tmp.jpg',0)
        gray = cv2.bitwise_not(src)
        ret, img_thresh = cv2.threshold(gray,230,255,cv2.THRESH_BINARY)
        
        #保存
        cv2.imwrite(savepath + '/output.jpg', img_thresh)
        
except KeyboardInterrupt:
    print('\n')

上記コードを起動すると止めるまで、1秒間隔でキャプチャ→指定箇所の切り抜き→白黒二極化変換を繰り返します。下記画像が実際に出力される画像のサンプルです。

円安・・・

・ OCR読み取り

OCRの読み取りには「tesseract」を利用します。WindowsにもLinuxにも対応しているので便利です。
後々の加工具合に合わせてOSの選択は行って下さい

Windows版

自身の環境に合わせて32bit/64bit版を選択してインストールしてください

「GitHub tesseract」

Home
Tesseract Open Source OCR Engine (main repository) - UB-Mannheim/tesseract

Linux(RHEL)版

tesseract Ver4系が以下のコマンドでインストールされます。
※Ver45系のインストールはすんなり出来なかったので現在検証中です。

# yum-config-manager --add-repo https://download.opensuse.org/repositories/home:/Alexander_Pozdnyakov/CentOS_7/
# sudo rpm --import https://build.opensuse.org/projects/home:Alexander_Pozdnyakov/public_key
# yum install tesseract 
# yum install tesseract-langpack-jpn ※日本語対応パック、無くても良いです。

・読み取り

読り取りは以下のコマンド1つでOKです。
あとは出力されたデータを取りためるなどをして活用していきましょう!

tesseract <インプット画像パス> stdout --psm 7

Windows内ですべてtesseractの読み取りまで実施をしても良いのですが、Linuxの場合はsamba等を利用してデータの連携を行うと良いでしょう。

・出力イメージ

読み取った為替データと合わせて、一緒に日付を出力させると後々の加工で便利です。

上:自前で取得したデータをグラフ化

下:http://nikkei225jp.comより取得したグラフ

なかなかうまくデータの取得は出来ているかなと思います。

・最後に

今回は力技での為替情報の取得について解説を行いました。
概念や基本的な考え方についての解説でしたので、要望があればもっと詳しい解説を行いたいと思います。
あとはもっとスマートな方法が見つかればそちらの方を紹介していきたいと思います。

(Visited 430 times, 1 visits today)

コメント

タイトルとURLをコピーしました