見出し画像

【プログラミング】【Python】昨晩のNYマーケット情報をメールで通知する

日本時間で生活していると、朝起きてすぐ前日のNYマーケットがどうだったかを知りたいと思ったことはありませんか?

できるだけ手短に知りたいけど、朝からテレビのニュースを見るほどの時間はないし…

そんな時にメールでサマリーを通知してくれるとしたら便利だと思いませんか?

そこで今回は昨晩のNYマーケット情報をメールで通知してくれるプログラムの作成方法を紹介します。

1.概要

今回作成するプログラムの概要は、ニュース記事を取得してユーザーにメールで送信するまでの部分をPythonで実装し、それをタスクスケジューラ(クラウドでも可)で定期実行させるというものです。

システム概念図

ユーザーには以下のように通知されます。

2.前提条件

  • Python実行環境(今回はAnacondaを使用)

  • Windows(タスクスケジューラを使用するため)

  • Outlookを使用できること。

3.コーディング

3.1.ニュース記事取得

まずはインターネットでニュース記事を取得します。

ニュース記事として便利なのが、Bloombergが日本時間で毎朝出している米国市況という記事です。米国株だけでなく、債券や為替、原油、金についての市況を手短に、かつ海外アナリストのコメント付きで伝えてくれます。

まずは必要なライブラリをインポートします。

newspaperはニュース記事を取得するためのライブラリです。win32com.clientはOutlookでメールを送信するためのライブラリになります。

# Import libraries
import datetime
from datetime import datetime
import newspaper
import win32com.client

Bloombergのニュース記事一覧の中から米国市況の記事を特定するために、キーワード(key_title)に「【米国市況】」を入れます。

# Provide article source
url = 'https://www.bloomberg.co.jp/'
website = newspaper.build(url,memoize_articles = False)

# Set article title
key_title = '【米国市況】'

繰り返し処理で記事のタイトルを1つずつ取得し、キーワードを含んでいるかどうかを判定します。米国市況の記事が見つかるか、または閾値に達した場合に繰り返し処理を脱します。※Bloombergに掲載されている記事数が18前後なので、閾値には18を指定します。

# Getting article...
for i, article in enumerate(website.articles):
    article.download()
    article.parse()
    article.nlp()
    if key_title in article.title:
        
       # Send article if found.
       break
        
    elif i > 18:
        
       # Send empty mail if not found.
       break

3.2.メールで通知

メールを送信する処理を組み込んでいきます。

まずはOutlookでメールを送信するための関数を定義します。

def send_mail(mail_to, mail_cc = '', mail_bcc = '', mail_subject = '', mail_body = '', mail_format=1, mail_attachment=''):
    outlook = win32com.client.Dispatch("Outlook.Application")
    mail = outlook.CreateItem(0)
    mail.to = mail_to
    mail.cc = mail_cc
    mail.bcc = mail_bcc
    mail.subject = mail_subject
    mail.bodyFormat = mail_format
    mail.body = mail_body
    mail.Send()

通知先のメールアドレスを設定します。またシステム日付を取得する処理を追加します。

# Provide mail address
mail_to = "sample@gmail.com"

# Get system date
today = datetime.today()
today_str = today.strftime('%Y/%m/%d')

3.1.のコードに、米国市況の記事が見つかった場合は記事タイトルと本文をメールで送信する処理を組み込みます。

# Getting article...
for i, article in enumerate(website.articles):
    article.download()
    article.parse()
    article.nlp()
    if key_title in article.title:
        
       # Send article if found.
       mail_subject = '【Bloomberg】' + article.title + ' (' + today_str +')' 
       mail_body = article.text
       send_mail(mail_to, mail_subject = mail_subject, mail_body = mail_body)

       break
        
    elif i > 18:
        
       # Send empty mail if not found.
       break

一方でNYマーケットが休日のために記事が見つからなかった場合は、記事なしの空メールを送信する処理を組み込みます。

# Getting article...
for i, article in enumerate(website.articles):
    article.download()
    article.parse()
    article.nlp()
    if key_title in article.title:
        
       # Send article if found.
       mail_subject = '【Bloomberg】' + article.title + ' (' + today_str +')' 
       mail_body = article.text
       send_mail(mail_to, mail_subject = mail_subject, mail_body = mail_body)

       break
        
    elif i > 18:
        
       # Send empty mail if not found.
       mail_subject = '【Bloomberg】' + '記事なし' + ' (' + today_str +')' 
       send_mail(mail_to, mail_subject = mail_subject)
       
       break

3.3.全体コード

# Import libraries
import datetime
from datetime import datetime
import newspaper
import win32com.client

# Provide article source
url = 'https://www.bloomberg.co.jp/'
website = newspaper.build(url,memoize_articles = False)

# Set article title
key_title = '【米国市況】'

def send_mail(mail_to, mail_cc = '', mail_bcc = '', mail_subject = '', mail_body = '', mail_format=1, mail_attachment=''):
    outlook = win32com.client.Dispatch("Outlook.Application")
    mail = outlook.CreateItem(0)
    mail.to = mail_to
    mail.cc = mail_cc
    mail.bcc = mail_bcc
    mail.subject = mail_subject
    mail.bodyFormat = mail_format
    mail.body = mail_body
    mail.Send()

# Provide mail address
mail_to = "sample@gmail.com"

# Get system date
today = datetime.today()
today_str = today.strftime('%Y/%m/%d')

# Getting article...
for i, article in enumerate(website.articles):
    article.download()
    article.parse()
    article.nlp()
    if key_title in article.title:
        
       # Send article if found.
       mail_subject = '【Bloomberg】' + article.title + ' (' + today_str +')' 
       mail_body = article.text
       send_mail(mail_to, mail_subject = mail_subject, mail_body = mail_body)

       break
        
    elif i > 18:
        
       # Send empty mail if not found.
       mail_subject = '【Bloomberg】' + '記事なし' + ' (' + today_str +')' 
       send_mail(mail_to, mail_subject = mail_subject)
       
       break

4.コマンドプロンプトで実行

コーディングが終わったら、Pythonファイルをコマンドプロンプトで実行するバッチファイルを作成します。

ここではファイル名を、Bloomberg Notification.batとします。

rem Pythonファイルの格納場所に移動します。
cd C:\Users\$UserName$\PycharmProjects\Training\Investment\010_Bloomberg Notification

rem 仮想環境をActivateします。
call C:\Users\$UserName$\anaconda3\Scripts\activate.bat
call activate Training

rem Pythonファイルを実行します。
python BloombergNotification_v1.0.py

rem コマンドプロンプトを終了します。
exit

5.タスクスケジューラで定期実行

作成したバッチファイルをタスクスケジューラで実行する設定を行います。

操作タブで、プログラムの開始を選択し、バッチファイルを指定します。

トリガータブで、以下のように設定します。

  • 毎週、火曜~土曜、8時開始 ※NY市場が冬時間の時は7時に変更します。

以上で設定完了です。翌朝、ちゃんと通知が届くか確認しましょう。

ここまで、昨晩のNYマーケット情報をメールで通知してくれるプログラムの作成方法を説明してきました。参考になれば幸いです。

この記事が気に入ったらサポートをしてみませんか?