시작하며
오늘은 초미니 프로젝트로 주식 거래를 도와주는 파이썬 프로그램을 만들려고 합니다.
- 관심 주식의 주식 시세를 가져옵니다. API를 활용합니다.
날짜별로 폐장 가격을 가져와 가격을 비교해 얼마나 상승했는지, 하락했는지 보여줄 수 있습니다. - 관심 주식에 관련된 뉴스를 가져옵니다. 왜 지표가 상승했는지, 하락했는지에 대한 정보를 얻을 수 있습니다.
- 이에 대한 중요한 정보를 SMS로 전송합니다.
코드 전문
from dotenv import load_dotenv
import os
import requests
from twilio.rest import Client
load_dotenv()
STOCK = "TSLA"
COMPANY_NAME = "Tesla Inc"
PERSENT_5_UP = False
param = {
'function': 'TIME_SERIES_DAILY',
'symbol': STOCK,
'apikey': os.getenv("STOCK_API_KEY"),
}
url = 'https://www.alphavantage.co/query'
r = requests.get(url, params=param)
data = r.json()['Time Series (Daily)']
iter_data = iter(data.values())
# 전날과 전전날 가져오기
yesterday = float(next(iter_data)['4. close'])
before_yesterday = float(next(iter_data)['4. close'])
diff = yesterday - before_yesterday
UP_DOWN = None
if diff > 0:
UP_DOWN = "⬆️"
else:
UP_DOWN = "⬇️"
persent = round(diff / before_yesterday * 100, 2)
# 뉴스 출력을 위한 뉴스 Flag 변경
if abs(persent) >= 5:
PERSENT_5_UP = True
# 뉴스 API 받아오기
if PERSENT_5_UP:
news_param = {
'q': COMPANY_NAME,
'apikey': os.getenv('STOCK_NEWS_API_KEY'),
}
news_url = 'https://newsapi.org/v2/everything'
news_r = requests.get(news_url, params=news_param)
news_data = news_r.json()['articles']
articles = news_data[:3]
formatted_articles = [f"{STOCK}: {UP_DOWN}{diff} \nHeadline: {article['title']}. \nBrief: {article['description']}" for article in articles]
# print(formatted_articles)
# SMS 보내기
account_sid = os.getenv('ACCOUNT_SID')
auth_token = os.getenv('AUTH_TOKEN')
client = Client(account_sid, auth_token)
for article in formatted_articles:
message = client.messages.create(
to=os.getenv("MY_PHONE_NUMBER"),
from_=os.getenv("MY_TO_NUMBER"),
body=article)
코드 해석
먼저 제 코드에서는 이전 강의에서 언급했던 환경 변수를 사용하기 위한 모듈들과 request, twilio 모듈을 불러옵니다.
from dotenv import load_dotenv
import os
import requests
from twilio.rest import Client
load_dotenv()
사용된 API는 아래와 같습니다.
주식가격 변동 : Free Stock APIs in JSON & Excel | Alpha Vantage
주식 뉴스 : News API – Search News and Blog Articles on the Web
SMS 전송 : Communication APIs for SMS, Voice, Video & Authentication
{: .prompt-info }
Step 1 : 등락률 확인하기
param = {
'function': 'TIME_SERIES_DAILY',
'symbol': STOCK,
'apikey': os.getenv("STOCK_API_KEY"),
}
url = 'https://www.alphavantage.co/query'
r = requests.get(url, params=param)
data = r.json()['Time Series (Daily)']
iter_data = iter(data.values())
r
에param
과url
을 이용해 API를 불러와 저장합니다. 데이터는 아래와 같습니다.- json을 뜯어보면
Time Series (Daily)
에 그날 해당 주식의 종가가 적혀 있습니다. 이를 가져오기 위해data
에 저장합니다. data
의 값들을 이터레이터에 넣어줘 이를iter_data
에 저장합니다.
# 전날과 전전날 가져오기
yesterday = float(next(iter_data)['4. close'])
before_yesterday = float(next(iter_data)['4. close'])
diff = yesterday - before_yesterday
UP_DOWN = None
위 사진을 보면 4. close
에 종가가 저장되어 있으므로, 이를 가져옵니다. yesterday
변수에는 바로 전날의 종가를, before_yesterday
에는 전전날의 종가를 저장합니다. 이는 이터레이터를 next로 넘어가며 접근할 수 있습니다.
이제 등락률을 구하기 위해 diff
변수에 종가의 차를 집어넣습니다.
if diff > 0:
UP_DOWN = "⬆️"
else:
UP_DOWN = "⬇️"
persent = round(diff / before_yesterday * 100, 2)
# 뉴스 출력을 위한 뉴스 Flag 변경
if abs(persent) >= 5:
PERSENT_5_UP = True
만약 diff가 0보다 크다면 종가가 오른 것이므로 ⬆️
기호를, 아니라면 ⬇️
기호를 넣어줍니다. 등락률을 정확하게 계산하기 위해 persent
변수에 저장한 다음, 등락률이 5를 넘었다면 뉴스를 가져오고, 이를 SMS로 보내야 하므로 FLAG
를 True
로 변경합니다.
Step 2 : 주식 뉴스 가져오기
if PERSENT_5_UP:
news_param = {
'q': COMPANY_NAME,
'apikey': os.getenv('STOCK_NEWS_API_KEY'),
}
news_url = 'https://newsapi.org/v2/everything'
news_r = requests.get(news_url, params=news_param)
news_data = news_r.json()['articles']
articles = news_data[:3]
formatted_articles = [f"{STOCK}: {UP_DOWN}{diff} \nHeadline: {article['title']}. \nBrief: {article['description']}" for article in articles]
위 코드랑 이어집니다. 위에서 FLAG
가 True
라면 주식 뉴스를 가져오기 위한 API를 실행합니다.
formatted_articles
는 SMS에 보낼 때, 사용자가 더 편하게 볼 수 있도록 문장을 변형시켜줍니다.
Step 3 : SMS 보내기
# SMS 보내기
account_sid = os.getenv('ACCOUNT_SID')
auth_token = os.getenv('AUTH_TOKEN')
client = Client(account_sid, auth_token)
for article in formatted_articles:
message = client.messages.create(
to=os.getenv("MY_PHONE_NUMBER"),
from_=os.getenv("MY_TO_NUMBER"),
body=article)
SMS 보내는 API는 많이 사용해봤으므로 생략하겠습니다.
결과물
부록
참고문헌
주식가격 변동 : Free Stock APIs in JSON & Excel | Alpha Vantage
주식 뉴스 : News API – Search News and Blog Articles on the Web
SMS 전송 : Communication APIs for SMS, Voice, Video & Authentication
'◎ Python > Udemy Python' 카테고리의 다른 글
Day 038 - 구글 시트에 운동 기록 (1) | 2024.03.08 |
---|---|
Day 037 - 습관 추적기 프로젝트 (0) | 2024.03.08 |
Day 033 - API 활용 (1) | 2024.03.08 |
Day 032 - SMTP와 Datetime 활용 (2) (0) | 2024.03.08 |
Day 032 - SMTP와 Datetime 활용 (0) | 2024.03.08 |
자기계발 블로그