주식공부/파이썬 주식

파이썬으로 코스피,코스닥 시세 모니터링 알림(추가업데이트)

일찍자요 2023. 1. 4. 21:25
반응형

 

어제 포스팅했던 것이 단순히 현재값 출력에 그쳤다면 이번에는 아래 내용이 추가되었습니다.

 

1. 원하는 보조지표 데이터 계산

2. 데이터 가져온 시간 기록

3. 1분마다 데이터를 데이터프레임 저장하고 엑셀로 남기기

 

 

첫번째 : 원하는 보조지표 데이터 계산

데이터프레임에 넣고 엑셀로 저장하기 위해서 원하는 보조지표들을 미리 만들어 둘 필요가 있습니다.

본 포스팅 예시에는 스토캐스틱 지표와 볼린저밴드 그리고 가격이동평균선만 만들어 놓았습니다.

해당 함수들은 다음과 같습니다.

 

종가데이터만 가지고 와서 아래 함수에 넣으면 해당 값을 리턴시켜주게 됩니다.

 

스토캐스틱, 볼린저밴드

 

 

가격이동평균

 

그리고 나중에 1분마다 이 해당 데이터들을 담을 리스트를 미리 만들어 주었습니다.

이렇게 담긴 리스트들은 나중에 데이터프레임에 칼럼으로 들어가게 됩니다.

 

두번째 : 데이터 가져온 시간 기록하기

현재시간을 불러오기 위해 datetime.datetime.now().time() 으로 생성해주고 time_data 리스트에 1분마다 추가해 줍니다.

while 문에서 돌고 있으므로 1분마다 추가가 됩니다.

 

그 외에 앞서 만들었던 보조지표들도 append를 활용해서 모두 넣어줍니다.

 

 

 

세번째 : 데이터프레임 완성 후 엑셀로 저장하기

 

위에서 만들어진 데이터들을 코스피, 코스닥 각각의 데이터프레임을 만들어놓고 원하는 칼럼 이름에다 집어 넣어 줍니다.

 

 

 

 

그리고 아래와 같이 원하는 엑셀파일을 생성해주고, 코스피, 코스닥 각각 시트 하나씩 만들어 넣어주면 완성됩니다.

 

 

 

 

 

결과물 확인하기

현재 작성시간이 밤이라 종가만 기록되고 있어서 변화되는 내용이 없습니다.

스토캐스틱 값이 NaN이 뜨는 것은 현재 수식상 종가의 최저 최고 값의 차이가 분모로 들어가게 되어 있는데,

종가의 최저 최고 데이터가 동일하다보니 분모를 0으로 나누게 되어 발생한 것입니다.

장중에 돌리면 값이 제대로 나타나게 됩니다.

 

 

위 내용이 엑셀로도 잘 들어 가 있음을 확인할 수 있습니다.

 

 

전체코드를 아래에 유첨 해 놓았으니 참고하세요:)

 

 

 

※ 전체코드 

import datetime 
today = datetime.date.today()
today = today.strftime("%Y-%m-%d")


import pandas as pd
import numpy as np


#Calculate Stochastic Buy Point
def stochastic_buy_point(close_data):
    lowest = min(close_data)
    highest = max(close_data)
    current = close_data[-1]
    stochastic_buy_point = (current - lowest) / (highest - lowest)
    return stochastic_buy_point

#Calculate Bollinger Lower Band
def bollinger_lower_band(close_data):
    middle_band = sum(close_data) / len(close_data)
    std_dev = 0
    for i in range(len(close_data)):
        std_dev += (close_data[i] - middle_band)**2
    std_dev = (std_dev / len(close_data))**0.5
    bollinger_lower_band = middle_band - std_dev * 2
    return bollinger_lower_band

#Calculate 3MA, 20MA and 60MA
def ma_calc(close_data):
    three_ma = 0
    twenty_ma = 0
    sixty_ma = 0
    if len(close_data) < 3:
        three_ma = sum(close_data) / len(close_data)
    else:
        three_ma = sum(close_data[-3:]) / 3
    if len(close_data) < 20:
        twenty_ma = sum(close_data) / len(close_data)
    else:
        twenty_ma = sum(close_data[-20:]) / 20
    if len(close_data) < 60:
        sixty_ma = sum(close_data) / len(close_data)
    else:
        sixty_ma = sum(close_data[-60:]) / 60
    return round(three_ma,2), round(twenty_ma,2), round(sixty_ma,2)

import FinanceDataReader as fdr
import time

ks_data = []
kq_data = []
ks_rate = []
kq_rate = []
ks_stck = []
kq_stck = []
ks_bbl = []
kq_bbl = []
ks_ma_3 = []
ks_ma_20 = []
ks_ma_60 = []
kq_ma_3 = []
kq_ma_20 = []
kq_ma_60 = []
time_data = []


while True:
    kospi = fdr.DataReader('KS11', today)
    kosdaq = fdr.DataReader('KQ11', today)    

    kospi_rate = round((kospi['Close'][-1] - kospi['Open'][-1])*100/kospi['Open'][-1],2)
    kosdaq_rate = round((kosdaq['Close'][-1] - kosdaq['Open'][-1])*100/kosdaq['Open'][-1],2)

    ks_data.append(round(kospi['Close'][-1],2))
    kq_data.append(round(kosdaq['Close'][-1],2))
    ks_rate.append(kospi_rate)
    kq_rate.append(kosdaq_rate)    

    ks_stck.append(round(stochastic_buy_point(ks_data),2))
    kq_stck.append(round(stochastic_buy_point(kq_data),2))
    ks_bbl.append(round(bollinger_lower_band(ks_data),2))
    kq_bbl.append(round(bollinger_lower_band(kq_data),2))
    ks_ma = ma_calc(ks_data)
    kq_ma = ma_calc(kq_data)
    ks_ma_3.append(ks_ma[0])
    ks_ma_20.append(ks_ma[1])
    ks_ma_60.append(ks_ma[2])
    kq_ma_3.append(kq_ma[0])
    kq_ma_20.append(kq_ma[1])
    kq_ma_60.append(kq_ma[2])
    time_data.append(datetime.datetime.now().time())

    
    #Creating an empty DataFrame
    df_ks = pd.DataFrame()
    df_kq = pd.DataFrame()

    # Add the list to DataFrame
    df_ks['time'] = time_data
    df_ks['Close'] = ks_data
    df_ks['Rate'] = ks_rate
    df_ks['MA3'] = ks_ma_3
    df_ks['MA20'] = ks_ma_20
    df_ks['MA60'] = ks_ma_60
    df_ks['Stockastic'] = ks_stck
    df_ks['Bollinger_lower'] = ks_bbl

    df_kq['time'] = time_data
    df_kq['Close'] = kq_data
    df_kq['Rate'] = kq_rate
    df_kq['MA3'] = kq_ma_3
    df_kq['MA20'] = kq_ma_20
    df_kq['MA60'] = kq_ma_60
    df_kq['Stockastic'] = kq_stck
    df_kq['Bollinger_lower'] = kq_bbl


    # Print the DataFrame
    print("KOSPI data")
    print(df_ks.tail(10))

    print("KOSDAQ data")
    print(df_kq.tail(10))

     
    #1. 파일 생성
    with pd.ExcelWriter('market_df.xlsx') as writer:    
        
        #2. 생성 파일에 시트명 지정 후 dataframe에 저장한 결과값 넣기

        df_ks.to_excel(writer, sheet_name='ks')
        df_kq.to_excel(writer, sheet_name='kq')


    time.sleep(60)

 

반응형