Pythonで最新のニュースヘッドラインを取得する方法(feedparser)
こんばんは、新米データサイエンティスト(@algon_fx)です。食欲の秋を堪能した結果、体重が増えてしまいました。今週からジムを再開してしっかり絞っていきます。
さて、前回は「トランプ大統領のツイートからFXの為替相場を予想する方法」をまとめました。私は原則としてテクニカル分析 + 機械学習が主体ですが、ファンダメンタルズ分析も最近は取り入れています。
当選前から過激なツイートで有名だったトランプ氏ですが、今となればアメリカ大統領です。その発言(ツイート)が及ぼす影響は多大であり、「トランプ砲」と揶揄されたりします。
しかしながら、トランプ大統領のツイートだけでは正しいファンダメンタルズ分析は行えません。世の中には様々なニュースが出回っており、それらのニュースも多少ながら為替市場に影響を及ぼします。
そこで・・今日はPythonを使って最新のニュースデータを取得する方法をまとめます。ファンダメンタル分析をFX機械学習トレードに取り入れたい方、リアルタイムのニュースデータを取得した方は是非活用してみてください。
役に立つニュースデータとは?
機械学習でFX予想を行うためにニュースデータを使いたいと考えると、幾つか考えるべき条件があります。ニュースデータの鮮度はその一つです。
トレードのスタイルに応じて必要なデータの鮮度は異なります。例えば、比較的期間の長いスイングトレードや長期トレードのスタイルでは「日毎」のニュース鮮度で問題ないと思われます。
しかし、私の主体はデイトレードです。状況に応じてはスキャルピングに近いトレードも多々行います。つまり、ニュースが掲載された直後の為替レートの動きが重要なのです。
ニュースが各メディアで掲載された時点でデータの取得が望ましく、データ取得までのギャップがあるものは私的にはあまり役に立ちません。
新鮮なニュースデータを取得する手段
新鮮なニュースデータを取得する方法ですが主に3パターンあります。「スクレイピング」「API」そして「RSS」です。それぞれメリット・デメリットがあります。
まずは「スクレイピング」をやってみました。Pythonでスクレピングをするのであれば「BeautifulSoup」や「Scrapy」が主要なライブラリーです。
両方とも使いやすく、少し操作方法を覚えれば簡単にスクレイピングを行うことが可能です。ただし、スクレイピングには2つデメリットもあります。
まずは「データ取得先の変更リスク」です。スクレイピングはデータを取得する先のフォーマットに適合させて、データをHTML(またはそれに準ずる)形式から取得します。つまり、データ取得先がフォーマットを変更する度にスクレイピングのコードも変更しなくてはいけません。データ取得先が1つならまだしも、複数あるとこの作業が大変です。
2つ目のデメリットが「相手に負担をかけてしまう」ことです。スクレイピングはプログラムで自動的にデータを取得できる反面、スクレイピングされる側は無駄なサーバー負荷がかかってしまうため、目立ったスクレイピングを行うと拒絶されることがあります。そもそも、スクレイピングを行う場合は相手が明確に許可している、または個別に許可を得ることが必要です。
単発的なデータ取得であればスクレイピングで問題ありませんが、新鮮かつ定期的なデータ取得には不向きです。
そこで2つ目は「API」を検討しました。日本語のニュースデータのAPIは恐らく限定的だろうが、海外ニュースであればAPIくらいありそうだと考えました。探したら便利なのが見つかりました。それが「NewsAPI」です。

NewsAPIは世界中のニュースを取得してAPIからヘッドラインを取得可能なPythonのライブラリです。まさにこれ!これは便利そうだと思いました!
しかしながら・・詳細を確認してみると残念な点が一つ。非商用であれば無料で利用が可能なんですが、無料版ではニュースが掲載されてから15分間の遅延が生じます。有料版ではリアルタイムで取得が可能ですが、月額で449ドルかかります。う〜ん、、使いたいけどそこまでガチデータは必要ないなぁってことで却下になりました。
消去法で行き着いたのが3つ目の方法「RSS」です。もはや平成も終わりかけのこの時代、RSSなんて死語に近しい存在ですが・・でもやはりRSSは役に立つのです!RSSとはニュースやブログなどで、ウェブサイトの更新情報を配信するためのフォーマットです。
自分でコード書いてRSSをパース(構文解析)してみようかと思ったのですが、便利なライブラリを発見しました。それが「feedparser」です。
こいつが超手軽+便利でした!RSSであればデータの鮮度も多くのサイトで問題ないと思われます。では、feedparserを使ってニュースヘッドラインデータを取得してみましょう。
STEP1 feedparserのインストール
ではJupyter Notebookを立ち上げて実際にニュースデータを取得してみましょう。まずはfeedparserのインストールから。これは簡単にpipで行えます。
1 2 3 |
$ pip install feedparser |
feedparserですがPython2系しか対応していませんが、インストール時に2to3で自動更新してくれるためPython3系でも問題なく使えます。
RSSはサイトの更新情報をまとめたフォーマットですが複数種類あります。feedparserですが、主要なRSSフォーマット(RSS0.9、RSS1.0、RSS2.0、Atom)に対応しています。便利です。
STEP2 ロイタービジネス面を取得してみる
では、早速feedparserをインポートしてニュースのヘッドラインを取得してみましょう。金融に強いメディアは多数ありますが、まずは大御所であるロイターのビジネスカテゴリのヘッドラインを取得してみましょう。
1 2 3 4 5 6 |
# 必要なライブラリのインポート import pandas as pd import numpy as np import feedparser |
ロイタービジネス(英語)のRSSフィードは下記のURLです。ブラウザでアクセスるとフィードの内容が確認できます。
http://feeds.reuters.com/reuters/businessNews
では、Pythonを使ってこのRSSフィードの内容を取得しましょう。
1 2 3 4 5 6 7 |
# ロイターのRSSを取得 reuters = feedparser.parse('http://feeds.reuters.com/reuters/businessNews') # データ型を確認 type(reuters) |
1 2 3 4 |
--出力 feedparser.FeedParserDict |
FeedParserDictという型のようです。確認してみましょう。
1 2 3 4 |
# 取得したデータを確認 reuters |
1 2 3 4 5 6 7 8 9 10 11 12 |
--出力 {'bozo': 0, 'encoding': 'UTF-8', 'entries': [{'feedburner_origlink': 'https://www.reuters.com/article/us-usa-china-huawei/huawei-cfo-bail-hearing-to-resume-in-canada-as-beijing-steps-up-pressure-idUSKBN1O90FW?feedType=RSS&feedName=businessNews', ...中略.. 'language': None, 'type': 'text/plain', 'value': 'Chinese state media distance Huawei arrest from U.S. trade talks'}} |
どうやらdict型のようなオブジェクトのようです。データを確認して欲しいデータを3つに絞ります。ニュースのヘッドライン(title)、ニュースの公開日時(published)、ニュースのURL(link)を表示させて見ましょう。
1 2 3 4 5 6 7 8 9 10 |
# ニュースのヘッドライン print(reuters['entries'][0]['title']) # 公開日時 print(reuters['entries'][0]['published']) # URL print(reuters['entries'][0]['link']) |
1 2 3 4 5 6 |
--出力 Ghosn, Nissan formally charged in financial misconduct scandal Mon, 10 Dec 2018 06:39:15 -0500 http://feeds.reuters.com/~r/reuters/businessNews/~3/CGhbxFNqd98/ghosn-nissan-formally-charged-in-financial-misconduct-scandal-idUSKBN1O904L |
今話題の日産のゴーン氏のニュースのようですね。最後にニュースが何件取得できるのか確認して見ましょう。
1 2 3 4 5 6 7 |
# ニュースの取得件数の確認 len(reuters['entries']) --出力 20 |
どうやらRSSで取得できたのは最新の20件のようです。こんな簡単にRSSを取得できるなんて、本当に便利なライブラリです。
STEP3 マーケットウォッチの最新ニュースを取得
ロイターに続いて世界中の投資家が利用しているマーケットウォッチのヘッドラインも取得してみましょう。マーケットウォッチですがリアルタイムヘッドラインのRSSフィードは下記で配信しています。
http://feeds.marketwatch.com/marketwatch/realtimeheadlines/
では、Pythonでデータを取得してみましょう。
1 2 3 4 |
# マーケットウォッチのデータを取得 market = feedparser.parse('http://feeds.marketwatch.com/marketwatch/realtimeheadlines/') |
先ほどはデータをそのまま確認しました。今回はより視認性を高めるためPandasのデータフレーム形式に変換してあげましょう。
1 2 3 4 |
market_df = pd.DataFrame(market['entries']) market_df.head(2) |
1 2 3 4 5 6 |
--出力 feedburner_origlink guidislink id link links published published_parsed summary summary_detail title title_detail 0 http://www.marketwatch.com/tools/quotes/quotes... False {8B3510D6-D821-44F2-BA6D-508D2F2720F0} http://feeds.marketwatch.com/~r/marketwatch/re... [{'rel': 'alternate', 'type': 'text/html', 'hr... Mon, 10 Dec 2018 13:50:57 GMT (2018, 12, 10, 13, 50, 57, 0, 344, 0) This is a Real-time headline. These are breaki... {'type': 'text/html', 'language': None, 'base'... Macrogenics downgraded to underperform from ou... {'type': 'text/plain', 'language': None, 'base... 1 http://www.marketwatch.com/tools/quotes/quotes... False {D2D27746-198E-4958-98A6-C41B2BF10BAE} http://feeds.marketwatch.com/~r/marketwatch/re... [{'rel': 'alternate', 'type': 'text/html', 'hr... Mon, 10 Dec 2018 13:48:51 GMT (2018, 12, 10, 13, 48, 51, 0, 344, 0) This is a Real-time headline. These are breaki... {'type': 'text/html', 'language': None, 'base'... Canada Goose initiated at positive rating with... {'type': 'text/plain', 'language': None, 'base... |
不要なデータが多いので少し綺麗にしてあげます。
1 2 3 4 5 |
# データを綺麗にする market_df = market_df[['published', 'title']] market_df.head() |
1 2 3 4 5 6 7 8 |
published title 0 Mon, 10 Dec 2018 13:50:57 GMT Macrogenics downgraded to underperform from ou... 1 Mon, 10 Dec 2018 13:48:51 GMT Canada Goose initiated at positive rating with... 2 Mon, 10 Dec 2018 13:35:41 GMT Vail Resorts price target cut to 256from256from 29... 3 Mon, 10 Dec 2018 13:32:04 GMT Esperion Therapeutics price target lifted to $... 4 Mon, 10 Dec 2018 13:31:10 GMT Synchronoss Technologies upgraded to hold from... |
綺麗になりました。マーケットウォッチの最新のニュースヘッドラインが取得されました。
STEP4 Zai FXさんの為替ニュースを取得
RSSがあればデータの取得は可能です。上の事例は英語のニュース大手のデータを取得してみましたが、次は日本語のニュースサイトからもデータを取得してみましょう。
日本でも多くのニュースサイトがありますが、今回はZai FXさんの「ザイFX!為替のとれたてニュース」のデータを取得してみます。
1 2 3 4 5 6 7 8 9 10 11 |
# Zai FXのデータ取得 zai = feedparser.parse('http://zai.diamond.jp/list/feed/rssfxnews') # データフレーム形式へ変換 zai_df = pd.DataFrame(zai['entries']) zai_df = zai_df[['published', 'summary']] # 確認 zai_df.head() |
1 2 3 4 5 6 7 8 9 |
--出力 published summary 0 Mon, 10 Dec 2018 21:15:00 +0900 「メイ英首相、EU離脱案の議会採決を延期」、「欧州委員会、英国のEU離脱再交渉はしない」等の... 1 Mon, 10 Dec 2018 21:06:47 +0900 [欧米市場の為替相場動向]<br />\n 10日のロンドン外為市場では、ドル・円は112円... 2 Mon, 10 Dec 2018 20:12:00 +0900 17日の欧州外国為替市場でユーロドルは上値が重い。20時時点では1.1405ドルと17時時点... 3 Mon, 10 Dec 2018 19:58:09 +0900 [欧米市場の為替相場動向]<br />\n 10日のロンドン外為市場では、ドル・円は112円... 4 Mon, 10 Dec 2018 19:54:00 +0900 ドル円は、6日にいったん下げ止まった112.24円に面合わせしたところから戻している。このま... |
日本語でもしっかり取得されています。SummaryだとHTMLが少し混じっているようなので機械学習の訓練前にクレンジングする必要はありそうですが。
まとめと次の課題
如何でしたでしょうか?今回はニュースサイトのRSSフィードを利用してPythonで最新ニュースヘッドラインのデータを取得する方法をまとめました。
RSSですがニュースサイトの多くが配信しています。英語、日本語含めて訓練データとして使いたいと思うニュースサイトをチェックして、RSSが配信されていればデータの取得が可能ですね。
ただし、それぞれのサイトでニュースの鮮度は異なります。また実際のトレードで役に立つようなデータにするにはニュースタイトルだけでなく、詳細ページの本文などのデータも必要です。(結局スクレイピングかw)
FXで機械学習を使うための初心者向けチュートリアルもまとめています!Pythonの初歩的な知識があれば実装が可能ですので、興味がある方は是非ご覧ください!
決定木を使ってFX予想をやってみる
FXトレードでロジスティック回帰を独自テクニカル指標として活用する方法
ブログ読んでいただきありがとうございます!Twitterでも色々と発信しているので、是非フォローお願いします!
ディスカッション
コメント一覧
まだ、コメントがありません