환율 정보는 경제에서 매우 중요한 지표이며, 다양한 서비스 및 시스템에서 수집 활용이 되는 데이터이다. 파이썬을 이용하여 간단한 환율 정보 데이터 수집하는 방법을 제공하고자 한다.
요즘에는 경제 지표 데이터에 관심이 많아 간단하게 파이썬을 이용하여 수집해 활용해 보려고 한다. 파이썬을 이용하여 수집하려면 FinanceDataReader 라이브러리를 활용하면 간단하게 수집을 할 수 있다.
FinanceDataReader 라이브러리 소개
FinanceDataReader 라이브러리는 한국, 미국의 주식 가격, 금리, 지수, 환율, 원자재 등 경제 지표 데이터들을 간편하게 수집할 수 있는 라이브러리이다. 이번에 경제 지표 데이터를 수집하면서 처음 사용하게 됐는데, 정말 간단하고 활용성이 높은 라이브러리이다. 굉장히 많은 곳에 활용하기 좋을 것 같다.
간단하게 사용 방법을 먼저 보면...
import FinanceDataReader as finance_date_reader
# 달러/원 환율 정보 조회
df = finance_date_reader.DataReader('USD/KRW', '2024-01-01', '2024-01-03')
FinanceDataReader 라이브러리 설치 후 import를 시켜주고 위의 소스 코드와 같이 사용을 하면 끝이다.
위의 코드에서 중요한 부분은 'USD/KRW'와 날짜가 들어가는 부분이다.
먼저 첫 번째 인자가 들어가는 'USD/KRW' 값은 환율타입이라고 생각하면 된다.
위의 예시 코드에서 넣은 값은 달러/원 환율 정보의 타입 값이며, 그 외의 다른 환율 값으로 조회하고 싶다면 아래 내용을 참고하면 된다.
- USD/KRW (미국 달러 / 대한민국 원)
- JPY/KRW (일본 엔 / 대한민국 원)
- EUR/KRW (유럽 유로 / 대한민국 원)
- CNY/KRW (중국 위안 / 대한민국 원)
- GBP/KRW (영국 파운드 / 대한민국 원)
- AUD/KRW (호주 달러 / 대한민국 원)
위의 타입 값 말고도 다양한 환율 타입이 있으며, 국적별로 코드값만 알고 있으면 조회가 가능하다.
FinanceDataReader의 수집 유형
FinanceDataReader 라이브러리를 통해서 어떤 데이터를 수집할 수 있을까?
- 환율 데이터
- 주식 데이터
- 국제 지수 데이터
- 암호화폐 데이터
- ETF 데이터
- 원자재 데이터
- 채권 금리 데이터
- 지수 선물 데이터
현재 정리한 내용 외에도 더 다양한 데이터를 수집할 수 있으며, 많이 사용할 것 같은 데이터 위주로 정리해 봤다.
내가 만들고자 하는 서비스에서는 환율 정보, 금리 정보, 원자재 정보, 주식 정보 이렇게 4종류다. 물론 이 밖에도 더 많은 데이터를 수집하여 서비스의 퀄리티를 올리고 싶지만 처음부터 목표가 너무 크면 도착하기도 전에 지칠것 같아 조금씩 개발하면서 진행해보려고 한다.
FinanceDataReader를 이용한 환율 정보 수집
아래의 코드는 직접 환율 데이터를 수집하기 위해 만든 소스 코드다. FinanceDataReader 라이브러리를 이용해서 수집하는 코드 작업은 간단한데, 부가적인 작업이 오히려 더 많이 걸린 듯하다 ...
1. 환율 정보 코드
# 환율 유형 정보
rate_type_maps = {
'usd': 'USD', # 달러 인덱스
'usd_krw': 'USD/KRW', # 달러/원
'jpy_krw': 'JPYKRW', # 엔/원
'cny_krw': 'CNYKRW', # 위안/원
}
가장 먼저 수집하고자 하는 환율 정보 코드 map 정보를 세팅하였다. 해당 map을 기준으로 loop를 돌면서 수집을 하려고 한다.
2. rate_type_maps 기준으로 환율 정보 수집
# 오늘 날짜 가져오기
today_date = datetime.today().strftime('%Y-%m-%d')
for rate_type in rate_type_maps.keys():
# 환율 코드 가져오기
rate_value = rate_type_maps.get(rate_type)
# 환율 정보 수집
df = finance_date_reader.DataReader(rate_value, today_date)
1번에서 작성한 환율 코드 유형별로 for문을 작성하였고, 환율 코드마다 FinanceDataReader의 DataReader를 이용해서 데이터를 수집한다.
DataReader 함수 호출시 날짜는 현재 날짜 기준으로 조회할 수 있도록 설정하였다.
3. 수집한 환율 데이터 추출
for index, row in df.iterrows():
rate_date = index.strftime('%Y%m%d')
close = row.get('Close')
open = row.get('Open')
high = row.get('High')
low = row.get('Low')
# 추출한 데이터 출력 또는 다른 작업 수행
print(f"날짜: {date}, 종가: {close},open: {open}, high: {high}, low: {low}")
2번에서 FinanceDataReader를 통해서 수집한 환율 정보 데이터에서 iterrows() 함수를 제공하며, 해당 함수를 통해 loop를 돌며 필요한 환율 데이터를 수집할 수 있다.
내가 필요한 데이터는 위와 같이 조회 날짜, 종가 환율, 시작 환율, 고가 환율, 저가 환율 데이터다.
위의 코드와 같이 수집을 한다면 이제 수집하고자 하는 DB나 파일로 수집을 하면 된다.
나는 보통 데이터를 mariadb로 수집을 하기 때문에 mysql 라이브러리를 이용해 수집 코드를 작성하였다.
예전부터 mariadb가 편하고 관리하기 편하다보니 선택을 하게 됐는데, 다음에 수집하는 데이터는 다른 DB로 수집하고 정리해 봐야겠다..
4. 환율 데이터 DB 저장
query = """
INSERT INTO ExchangeRateRealTime
(
OpenRate,
HighRate,
LowRate,
CloseRate,
RateDate,
RateType
)
VALUES
(
%s,
%s,
%s,
%s,
'%s',
'%s'
)
""" % (open, high, low, close, rate_date, rate_type)
mysql_manage.execute(query)
3번에서 정리한 것과 같이 DB에 저장하는 코드이다. 준실시간으로 수집을 하려고 테이블 명은 ExchangeRateRealTime로 생성하였다.
Insert문을 실제 mariadb로 저장하기 위해 마지막 코드의 mysql_manage.execute(query)를 실행해주면 끝!
mysql_manage는 현재 개발하고 있는 개인 프로젝트 내에서 공통으로 사용하기 위해 만든 mysql 연동 및 관리를 위한 소스파일이다.
위의 소스코드도 아래에서 간략하게 정리해보려고 한다.
5. mysql_manage
import mysql.connector
def connect_to_mysql():
return mysql.connector.connect(
host="xx.xx.xx.xx",
user="xxxx",
password="xxxx",
database="xxxx"
)
def select_one(query):
"""
Execute Select Query
:param query:
:return:
"""
return execute_query(query, 'SO')
def execute(query):
"""
Execute Query (Insert, Update, Delete)
:param query:
:return:
"""
return execute_query(query, 'I')
def execute_query(query, exe_type):
cursor = None
result = None
connection = None
try:
# MySQL 서버에 연결
connection = connect_to_mysql()
if connection.is_connected():
# 커서 생성
cursor = connection.cursor()
# 쿼리 실행
cursor.execute(query)
# 등록, 수정, 삭제시 commit
if exe_type == 'I' or exe_type == 'U' or exe_type == 'D':
connection.commit()
# 결과 단건 조회
if exe_type == 'SO':
result = cursor.fetchone()
# 결과 목록 조회
if exe_type == 'SA':
result = cursor.fetchall()
except mysql.connector.Error as e:
print(f"Error: {e}")
finally:
# 연결 종료
if connection:
connection.close()
print("Connection closed")
# 커서와 연결 종료
if cursor:
cursor.close()
return result
5번에서 설명한 것과 같이 위의 코드는 mysql_manage 소스 코드이다.
- connect_to_mysql : mysql connection을 위한 함수
- select_one : 단일건 조회를 위한 함수
- execute : 등록, 수정, 삭제 쿼리를 공통으로 처리하기 위한 함수
- execute_query: 모든 쿼리를 공통으로 처리하기 위한 함수
* 전체 소스 코드
해당 소스 코드는 서버에서 10분 간격으로 수집하기 위해 함수명을 get_exchange_rate_realtime()로 작성하였다.
import FinanceDataReader as finance_date_reader
from manage.mysql import mysql_manage
from datetime import datetime
# 환율 유형 정보
rate_type_maps = {
'usd': 'USD', # 달러 인덱스
'usd_krw': 'USD/KRW', # 달러/원
'jpy_krw': 'JPYKRW', # 엔/원
'cny_krw': 'CNYKRW', # 위안/원
}
def get_exchange_rate_realtime():
"""
환율 정보 실시간 수집 서비스
- 10분 간격 ExchangeRateRealTime 수집 작업
:return:
"""
# 오늘 날짜 가져오기
today_date = datetime.today().strftime('%Y-%m-%d')
# yesterday_date = (datetime.today() - timedelta(days=3)).strftime('%Y-%m-%d')
for rate_type in rate_type_maps.keys():
rate_value = rate_type_maps.get(rate_type)
try:
df = finance_date_reader.DataReader(rate_value, today_date)
for index, row in df.iterrows():
rate_date = index.strftime('%Y%m%d')
close = row.get('Close')
open = row.get('Open')
high = row.get('High')
low = row.get('Low')
# 추출한 데이터 출력 또는 다른 작업 수행
# print(f"날짜: {date}, 종가: {close},open: {open}, high: {high}, low: {low}")
query = """
SELECT * FROM ExchangeRateRealTime
WHERE RateDate = '%s'
AND RateType = '%s'
""" % (rate_date, rate_type)
# 중복 데이터 조회
same_item = mysql_manage.select_one(query)
# 날짜, 유형 중복 없는 경우 신규 저장
if same_item is None:
query = """
INSERT INTO ExchangeRateRealTime
(
OpenRate,
HighRate,
LowRate,
CloseRate,
RateDate,
RateType
)
VALUES
(
%s,
%s,
%s,
%s,
'%s',
'%s'
)
""" % (open, high, low, close, rate_date, rate_type)
mysql_manage.execute(query)
except Exception as e:
print(f"Error: {e}")
위의 코드 중간에 중복 처리하는 코드를 추가하였다. 중복 상관없이 모든 데이터를 저장해야 한다면 해당 부분은 생략해도 무방하다.
마무리
경력이 쌓여가면서 개발 시간이 많이 줄어들고 새로운 분야에 관심이 많이 가고 있는데, 요즘에는 경제 분야에 많은 관심을 가지고 있다.
어떻게 하면 개발 공부를 꾸준히 하면서 새로운 분야를 공부할까 생각하다가... 경제 분야의 지표 데이터를 수집하면서 서비스를 만들어 보면 어떨까 하면서 시작하게 됐다.
위의 정리한 소스 코드는 아직 미흡하지만 언제나 그렇듯이 일단 만들어가면서 소스의 퀄리티를 올려가는 것이기 때문에 ... 경제 공부를 천천히 하면서 하나씩 만들어 보려고 한다.
다음 포스팅에서는 오늘 만들고 정리한 소스코드를 서버에 올려 스케쥴링되는 내용을 정리해 봐야겠다.
'Python > python' 카테고리의 다른 글
파이썬 subprocess.Popen() 함수를 활용하여 프로세스 관리하기 (1) | 2024.01.22 |
---|---|
파이썬 subprocess.run() 함수로 외부 명령어 실행하기 (0) | 2023.11.01 |
파이썬 subprocess 모듈을 이용해서 외부 프로그램 실행하기 (1) | 2023.10.31 |
파이썬 requests 모듈을 활용한 HTTP 요청 통신하기 (0) | 2023.10.30 |
파이썬 time.sleep() 함수를 활용해서 시간 지연하기 (0) | 2023.10.29 |