専業システムトレーダーが学習するPython_スクレイピング編
今回はPythonを用いたスクレイピングについて紹介します。
私は、システムトレーダーは第一にExcelVBAを学ぶことをオススメしています。
大抵の検証・実行環境はVBAで手軽に実装することができるため、学習コストの低いVBAを学ぶことが実利への近道になるからです。
といっても、万能のVBAにも苦手な作業があり・・・
その最たるものが情報収集能力・・・
そう、スクレイピングであります!
ビジネスの場でデータサイエンスの必要性が高まるに従って、モダンなプログラミング言語にはどんどんと便利な(スクレイピング)ライブラリが追加されていますが、その点VBAはほとんど停滞してしまっています。
IE操作によるVBAスクレイピングで戦っている猛者も、昨今の便利なPythonライブラリを知れば、VBAで無理に戦っていく気もなくなることでしょう。
今回は、実例を踏まえてPythonスクレイピングを紹介していきたいと思います。
1、スクレイピングのためのPythonライブラリ
Pythonでスクレイピングを実行する際に必要なライブラリは以下のとおり
・Requets:その名のとおりWEBサイトへのリクエスト処理を行う
・BeautifulSoup:HTMLやCSSのパース(タグやセレクタ検索等)
・Selenium:ブラウザ操作を自動化する(本来はWEBアプリのテストツール)
私はPythonを用いて1年ほど日本株のトレード環境を運用してきましたが、基本的にPythonでのスクレイピングは以上の3つのライブラリで実行します。
ロボット対策を行っていないサイトであればRequestsとBeatifulSoupでページ情報をサクサク取得できますが、日本株関連の大抵のサイトは何らかの対策を施してあります。
そんなサイトに対応していくのもプログラミング能力の向上には必要ですが、仮にそこで躓いてしまっても「Seleniumを用いたアプローチに変更すれば割となんとかなる」ということは頭の片隅に置いておきましょう。
2、スクレイピング実行の際の注意事項
サイトへ短時間で高頻度のアクセスを行う行為は、サーバーへの攻撃とみなされる可能性があります。
有料会員であってもペナルティを受けることはあり得ますし、十分留意して開発・運用するよう心がけましょう。
基本的にはsleepやwait関数でスクリプトの実行速度を調整しますが、調整といっても、どの程度が許容範囲なのか初めは分かりませんよね。
プログラマーの方と話をするとその辺の基準を知ることができるのですが、ここではひとまず「手作業より遅いスクレイピング」と覚えておくといいかと思います。
3、東証適時開示情報を取得してみる
それでは実際にpythonのスクレイピングがどんなものか見てみましょう。
以下のスクリプトは東証の適時開示情報のページで「決算」のキーワードを検索にかける作業をPythonで実装したものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
#!/usr/bin/env python # coding=UTF-8 from time import sleep from bs4 import BeautifulSoup from selenium import webdriver from selenium.webdriver.common.keys import Keys import pandas as pd import os def getSearchResults(searchWord): # ブラウザを起動する driver = webdriver.Chrome() driver.get("https://www.release.tdnet.info/onsf/TDJFSearch/I_head") try: # 検索ワードを送る inputElement = driver.find_element_by_id("freewordtxt") inputElement.send_keys(searchWord) inputElement.send_keys(Keys.RETURN) sleep(5) # iframe内の要素を取得する(ここに検索結果が格納されている) iframe = driver.find_element_by_name("mainlist") driver.switch_to_frame(iframe) html_iframe = driver.page_source.encode("utf-8") # 取得した要素(table構造)をDataFrameで受け取る df_result = pd.read_html(html_iframe)[1] df_result.columns = ["時刻", "コード", "会社名", "表題", "XBRL", "上場取引所", "更新履歴"] return df_result except ValueError as e: print("検索結果がありません:", str(e)) except Exception as e: print("想定外のエラー発生!:", str(type(e)), ":", str(e)) def main(): searchWord = "決算" df_result = getSearchResults(searchWord) print(df_result) if __name__ == '__main__': main() |
VBAのIE操作のように、SeleniumでChromeブラウザを操作する方法で実行しています。
スクリプトの実行にはChromeDriverが必要ですので、環境に合わせてダウンロードしておきます。
(ひとまずexeファイルをスクリプトと同じディレクトリに置いておけばパスを通す必要はありません。)
いや~、、、
Pythonやばし!
htmlのテーブル構造を1行でパース(29行目)してしまうなんて、pandasは神か何かでしょうか。
VBAと比べると(例外処理も含めて)実行のフローが理解しやすいのも素敵。
今回取り上げた3つのライブラリを自由に扱えるようになれば、日本株で必要とされる大抵のデータを取得できるようになります。
上記のような簡単なコードであれば、3~4ヵ月程度Pythonを書き続けていれば自由に書けるようになるので、同じシストレクラスタの中でも風上を歩きやすい環境になることでしょう。
4、関連書籍の紹介
昨今のAI・機械学習のブームにあやかりPython関連の出版がかなり増えているのですが、ありがたいことにスクレイピングについて取り上げた書籍も同様に増えています。
これを学習に活かさない手はない!ということで、スクレイピングに関連した書籍を紹介しておきましょう。
まずはこちら。
・たった1日で基本が身に付く!HTML & CSS 超入門
・詳解 HTML & CSS & JavaScript 辞典
スクレイピングを実装する際に、WEBページを構成する言語や仕組みを最低限学んでおく必要があります。
といってもWEBまわりの知識は無限(ほんま無限!)ですから、ここでは最小限必要なものだけ押さえておきましょう(割とこれだけでもなんとかなる)。
一冊はできるかぎり少ないページにまとまった入門書(上記「たった1日で~」でなくとも、短時間で消化できそうならOK)。
もう一冊は辞書的なもの(これも使いやすいものならOKですが、取り上げた辞典はかなり有用です!)。
次に、Pythonのスクレイピングを学べる書籍。
・Pythonクローリング&スクレイピング
・PythonによるWEBスクレイピング
・退屈なことはPythonにやらせよう
どれも非常に有用な内容ですが、技術評論社の「Pythonクローリング&スクレイピング」はとりわけすばらしい内容・構成です。
スクレイピング技術を段階的に紹介してくれているうえ、関連した法律も取り上げているので、ぜひ目を通しておいてほしい一冊。
ここまで紹介した書籍に目を通せば最低限やりたいことを実装することはできるはずですが、もう一歩自由度を高めるための書籍も紹介しておきましょう。
・Selenium 実践入門
・正規表現ポケットリファレンス
まずはSleniumを自在に扱うための「Selenium実践入門」。
わたしのような日曜プログラマの同胞達は、WEB技術の深遠から逃げ込むようにSeleniumへすがりつく運命にあります。
そんな同胞達はこのSeleniumの説明書とでもいうべきこの一冊によく目を通しておきましょう。
巻末には言語別のチートシートまで付けてくれていますので、とりあえず本棚に入れておくべき一冊。
それから、正規表現のリファレンスも取り上げておきました。
キーワード検索等に意匠を凝らす場合は正規表現を使うことになりますので、お守りの一冊。
(実践でまだ必要としたことがないというのは内緒。)
5、おしまい
今回はVBAの一番の苦手要素、WEBスクレイピングを紹介してみました。
正直、このスクレイピングだけでもPythonを取り入れる価値が十分あると感じますが、一番厄介なカテゴリというのも事実です。
途中、「日曜プログラマの同胞達は、WEB技術の深遠から逃げ込むようにSeleniumへすがりつく」なんて表現をしましたが、これは大げさな表現ではなく、WEBまわりの技術は果てしなく、WEBの世界を歩けば自分の無知を痛感するばかりです。
Pythonを扱ってきたこの一年で頭を抱えたことは何度もありましたが、そんな折プログラマの仲間に相談すると、大抵数分で問題解決にたどり着いたり・・・。
餅は餅屋、信頼できるプログラマが近くにいるのでしたら、それはぼくらにとって大変貴重な存在だと心に留めておきましょう。
感謝、感謝。。。m(_ _)m
初めまして、eijiと申します。
システムトレードに関する記事を書いていただきありがとうございます。
Pythonを使ってシステムトレードができるようになりたいと思い、現在Pythonの基礎を学習中なのですが、VBAは絶対に学んだ方が良いのでしょうか?
また、VBAを学ぶとしたら参考になる書籍などがあれば教えていただけると嬉しいです。(VBAのシステムトレードに関する書籍に古いものが多いため購入しても良いものかと悩んでおります。。。)
始めましてeijiさん、コメントありがとうございます。
コメントから察するに、
・プログラマーではない
・プログラミングの第一言語にpythonを選択したばかり
と感じましたので、その条件で返信させていただきます。
「プログラミングの学習ついでにシストレでもやってみようかな」ということでしたら、そのままpython環境で取り組む方向でいいかと思います。
一方で、「結果を出すのが第一で、プログラミングは手段」というのでしたら、エクセルVBAが最適だと感じます。
理由はおおよそ以前の記事(http://trans-trade.jp/?p=1559)に書いた通りです。
(ちなみに、元・現プログラマーという肩書きでもエクセルで検証やっている方が周りに結構います)
検証(バックテスト)や評価の方法を学ぶのでしたら、土屋賢三氏のDVDが最も優れていると思います。
http://www.tradersshop.com/bin/showprod?c=2011172400008
http://www.tradersshop.com/bin/showprod?c=2011172500005
書籍よりずっと高いですが、これ以上のものは今のところ見たことがありません。。
追記
エクセルVBAであれば、「ループ・条件分岐・コピペ」さえ書ければ大抵の検証はできてしまうので、取り組んでみれば推奨した理由がすぐにわかると思います。
基礎とスクレイピングを終えて…その先はどのような方法で学べばいいのか。
続きがみたいです。。
コメントありがとうございます。
大まかに言えば、あとは運用モデルの作成と実際の運用ですね。
最も苦労するのは運用モデルの開発かと思いますが、昨今話題の高度(高次元)な機械学習を用いなくとも、基礎的な統計解析で十分機能するはずです。
あまり近道というものは無いと思いますが、一般書籍、論文、セミナー(映像)等からヒントを集めてひたすら検証するというのが一般的かと思います。
進行中の検証が落ち着いたら続きの記事も書いてみようと思っていますので、また覗きに来てください^^