UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY36 めちゃくちゃ下げた米国の個別株の理由をニュースで知るアプリを作る!

DAY35抜かしちゃったけどAPIの呼び出しの練習なので、

DAY36に飛んで実践。

 

後日やるけど試したかったのでスクレイピングもつけています。

今回はスクレイピング部分の説明はなしでやります。

 

米国株の値動きがわかるAPIから今日と昨日の価格を取得して、

暴落していたらその理由がないかニュースAPIでニュースを検索して表示する、

というようなツールを作ります。

 

暴落しても全体の地合いで個別でニュースがない場合もありますが。。。

 

 

では始めます。

 

from get_company_name import get_company_name
import requests
#dotenv-templete
import os
import datetime as dt
from dotenv import load_dotenv
from os.path import join, dirname
load_dotenv(verbose=True)
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
#dotenv-templete

STOCK_NAME = input("Type Company Code eg.TSLA : ")
STOCK_API = os.getenv("STOCK_API")
STOCK_ENDPOINT = "https://www.alphavantage.co/query"
NEWS_API = os.getenv("NEWS_API")
NEWS_ENDPOINT = "https://newsapi.org/v2/everything"

today_news = dt.datetime.today()
today_news = today_news.strftime("%Y-%m-%d")

company_name = get_company_name(STOCK_NAME)
print(company_name)

 

最初の2行はAPIjsonを取得するためのrequestsと、

yahooファイナンスから英語の企業名を取得するスクレイピングの自作コードをインポートしてます。

 

次はAPI関連の情報で、STOCK_NAMEはinputで自分が気になる会社コードを

入れられるようにしています。

 

today_news部分は今日の日付を取得してNEWS APIのパラメータに合わせたフォーマットに変換しています。

 

 

APIで株価データを取得するコーディング

def get_stock_price():
params = {
"function": "TIME_SERIES_DAILY",
"symbol": STOCK_NAME,
"apikey": STOCK_API,
}
url = STOCK_ENDPOINT
r = requests.get(url, params=params)
data = r.json()["Time Series (Daily)"]
data_list = [value for (key,value) in data.items()]
today_data = float(data_list[0]["4. close"])
yesterday_data = float(data_list[1]["4. close"])

if today_data <= yesterday_data * 0.9:
print("OMG! why?")
get_stock_news()
else:
print("Keep it!")

 

url=をエンドポイントとしてリクエストし、paramsに必要事項を入力して

データをもらっています。

パラーメーターはAPIのドキュメントに書いてあります。

 

www.alphavantage.co

とりあえずrequiredだけやっとけば最低限の価格は取得できます。

取得したjsonを内包記述でリスト変換し、今日と機能の終値だけを取得します。

 

今回は今日の終値が昨日の終値より10%以上下げた時に、

ニュースを取得するという機能を実装しています。

 

ニュースを取得する機能の実装

def get_stock_news():

params = {
"q": company_name,
"from": today_news,
"apikey": NEWS_API,
"language": "en",
"searchIn": "title",
}
response = requests.get(NEWS_ENDPOINT, params=params)
response.raise_for_status()
data = response.json()
if data["articles"] == []:
print("no news...")
else:
article_source = data["articles"][0]["source"]["name"]
article_title = data["articles"][0]["title"]
article_url = data["articles"][0]["url"]
print(f"{article_source} : {article_title} - {article_url}")

get_stock_price()

 

こちらはNEWS APIを使います。

newsapi.org

 

同じようにドキュメントを見てパラメータをparamsにいれていきます。

入力例を見た方がわかりやすいかと思います。

sourcesではニュースサイトの指定もできるので、たとえばCNNだけから取得するということも可能。

 

取得がもしできなかったり空の場合は no news...と表示し、

あった場合は取得したjsonからメディア名・ニュースタイトル・リンク先を

アウトプットするようにしています。

 

 

クラッチにしてはちゃんと機能したものが作れたので気分がいいです笑

 

APIを使ったデータ解析になれてきたら、

yahooファイナンス日本株apiでfor で全部の株のデータ取得して

解析とかしてみたいな。

 

Gitはこちら。

 

github.com