IB証券 API ニュースの取得

スポンサーリンク
スポンサーリンク

前提

このページでは接続後のみのサンプルを記載しています。接続方法は以下を参照してください。
IB証券 APIの接続方法

取得できる過去データ(ヒストリカルデータ)

過去データ(ヒストリカルデータ)は購読しているマーケット・データによって取得できないものがあります。

IB証券のマーケットデータの購読は以下を参照してください。
IB証券 マーケットデータの購読

ニュースの取得手順

ヘッドラインを取得後、ニュースの本文を取得します。

ニュース関連の関数

似たような関数が多いので、リストアップしてみました。

  • reqNewsProviders:ニュースプロバイダーを取得
  • newsTicks:ニュースティックスを取得
  • newsBulletins:IBニュース速報のヘッドラインを取得
  • reqHistoricalNews:過去ニュースのヘッドラインを取得
  • reqNewsBulletins:IBニュース速報を購読
  • cancelNewsBulletins:IBニュース速報の購読を停止
  • reqNewsArticle:ニュースの本文を取得
  • reqNewsProvidersAsyncreqNewsProvidersと同じ?
  • reqNewsArticleAsyncreqNewsArticleと同じ?
  • reqHistoricalNewsAsyncreqHistoricalNewsと同じ?

ドキュメント

ライブラリ ib_insync

Introduction — ib_insync 0.9.83 documentation

IB証券の公式

私が利用しているライブラリのib_insyncと少し異なりますが参考になります。

TWS API v9.72+: News

ニュースのヘッドラインを取得

ヘッドラインニュースには以下の3種類があります。

  • 過去のニュース
  • ティック・ニュース
  • IB速報ニュース

過去のニュース

ib.reqHistoricalNews(銘柄ID, ニュース社コード, 開始日時, 終了日時,件数, オプション)

  • 銘柄ID:(必須)下記で別途説明します。
  • ニュース社コード:(必須)下記で別途説明します。
  • 開始日時、終了日時:(必須)必要に応じ、datetime形式の日時を指定します。不要な場合は""とします。
    (注意)期間を指定してもその範囲で取得できません。たぶんバグです。
  • 件数:(必須)最大300件まで指定できます。
  • オプション:*詳細な情報が見つかりませんでした。

銘柄ID

  1. contractを以下のように設定します。
    contract = Stock('TSLA', 'SMART', 'USD')
  2. 銘柄のIDは以下のように指定します。
    contract.conId

ニュース社コード

公式サイトにあるように以下の3つからニュースを取得することができます。
カッコ内がコードになります。

  • Briefing.com General Market Columns (BRFG)
  • Briefing.com Analyst Actions (BRFUPDN)
  • Dow Jones Newsletters (DJNL)

以下のように取得すればいいようなことがib_insyncに書いてありますがBLが含まれているためエラーになります。

newsProviders = ib.reqNewsProviders()
codes = '+'.join(np.code for np in newsProviders)

ですので、以下のように設定し、ib.reqHistoricalNewsのニュース社コードにcodesとします。。
codes = 'BRFG+BRFUPDN+DJNL'

まとめ

テスラ(TSLA)のニュースのヘッドラインを10件取得します。

codes = 'BRFG+BRFUPDN+DJNL'

contract = Stock('TSLA', 'SMART', 'USD')

ib.qualifyContracts(contract)
headlines = ib.reqHistoricalNews(contract.conId, codes,'', '', 10)

df = util.df(headlines)
df

詳細情報の取得はページ後半で。

ティック・ニュース

あまり理解できていませんが、以下のようにすれば取得はできます。
しかし、TWSに表示されているような最新ニュースを思ったように取得できず、更に、同じニュースを取得して蓄積するようです。

news = Contract('NEWS', symbol="BRFG:BRFG_ALL", exchange="BRFG")
# news = Contract('NEWS', symbol="DJNL:DJNL_ALL", exchange="DJNL")

ib.reqMktData(news, 'mdoff,292')
    
ib.sleep(1)

df = util.df(ib.newsTicks())
df["datetime"] = pd.to_datetime(df["timeStamp"],unit='ms')
df

IB速報ニュース

なんのニュースを指しているのかもわかりませんが、以下で取得できると書いています。
しかし、ニュースのデータはいつも空です。

ib.reqNewsBulletins(True)
ib.sleep(5)
print(ib.newsBulletins())

力になれず、申し訳ないです。。。

Code recipes — ib_insync 0.9.83 documentation

ニュースの詳細データを取得

基本

ib.reqNewsArticle("ニュース社コード", "記事コード")

article = ib.reqNewsArticle("BRFG", "BRFG$0584b4cb")

print(article)

ヘッドラインからの取得

ニュース履歴などで得たヘッドライン(headlines)の0番目からproviderCodeとarticleIdを取得できます。

latest = headlines[0]

article = ib.reqNewsArticle(latest.providerCode, latest.articleId)

print(article)

取得したニュースの詳細情報

  • article.articleType:記事のタイプ*意味はわかりませんが。。。
  • article=articleText:記事の詳細情報。HTML形式になっています。

最後に

ニュースに関して、APIで取得できるのはとてもいいのですが、仕様なのか、不具合なのか、小難しいのかわかりませんが、あまりいい感じに取得できなかったです。

ご存知の方がいらっしゃいましたら、是非、教えて下さい。

 

コメント

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