Service developing
MarketTimer_1.0: making note
Hiru_93
2022. 9. 8. 13:49
- Service link(텔레그램 채널):
https://t.me/MarketTimer_alarm_bot
- Intro
주식 퀀트투자 플랫폼 '젠포트' 단톡방에서 수요조사를 한 결과 실시간 코스닥 마켓타이밍 알람이 있었으면 좋겠다고 생각해서 개발하게 되었다. 사용한 주요 라이브러리는 FinanceDataReader, telegram, schedule, time, datetime 등이 있다.
- Service
현재 제공하고 있는 기본기능으로는 코스닥 현재가와 3,5,10 이동평균선을 비교하여 현재가가 3,5,10 이동평균 중 하나라도 높으면 매수타이밍, 현재가가 3,5,10 이동평균 전부보다 낮다면 매도타이밍 알람을 보내준다. 알람 시각은 10시, 12시, 14시(KST한국시각)이다.
서비스 예:
완성 코드:
#!/usr/bin/env python
# coding: utf-8
# In[ ]:
import FinanceDataReader as fdr
import matplotlib.pyplot as plt
# get_ipython().run_line_magic('matplotlib', 'inline')
import numpy as np
import pandas as pd
import datetime
from datetime import date
import sys
fdr.__version__
import schedule
import time
import pytz
from numpyencoder import NumpyEncoder
import telegram
import json
def job():
# 한국시각, 주말 설정
# now = datetime.datetime.now(pytz.timezone('Asia/Seoul'))
today = date.today()
weekend = today.weekday()
# 예외시간 설정. 주말에는 알람을 보내지 않음
while weekend >= 5:
print(weekend)
# 봇 설정
API_KEY = 'api key를 넣어준다'
bot = telegram.Bot(token=API_KEY)
bot.get_updates()
public_chat_name = '@텔레그램 채팅방 주소'
# for i in updates:
# print(i.message['chat']['id'])
# 코스닥지수
code = 'KQ11'
df = fdr.DataReader('KQ11','2022-08').reset_index()
# 3,5,10 이동평균 딕셔너리에 할당
df['close_sma3d'] = df['Close'].rolling(3).mean()
df['close_sma5d'] = df['Close'].rolling(5).mean()
df['close_sma10d'] = df['Close'].rolling(10).mean()
# dataframe 재구성
df2 = df.loc[: ,['Date','Close', 'close_sma3d','close_sma5d','close_sma10d']].iloc[-1:]
alerts = df2[(df2['Close'] > df2['close_sma3d']) | (df2['Close'] > df2['close_sma5d']) | (df2['Close'] > df2['close_sma10d'])]
alerts2 = df2[(df2['Close'] < df2['close_sma3d']) & (df2['Close'] < df2['close_sma5d']) & (df2['Close'] < df2['close_sma10d'])]
for index, row in alerts.iterrows():
z = row['Close']
a = round(row['close_sma3d'], 2)
b = round(row['close_sma5d'], 2)
c = round(row['close_sma10d'], 2)
# telegram 알람에서 출력하기 위해 datetime64만 json str 형식으로 변환
row['Date'] = row['Date'].date()
jsonstr1 = json.dumps(str(row['Date']))
Market_timing = (f"{jsonstr1} 현재가가 3 or 5 or 10 단순이동평균보다 높습니다 코스닥_현재가 {z} 3일이동평균 {a} 5일이동평균 {b} 10일이동평균 {c}")
bot.sendMessage(chat_id = public_chat_name, text=Market_timing).chat_id
for index, row in alerts2.iterrows():
z2 = row['Close']
a2 = round(row['close_sma3d'], 2)
b2 = round(row['close_sma5d'], 2)
c2 = round(row['close_sma10d'], 2)
# telegram 알람에서 출력하기 위해 datetime64만 json str 형식으로 변환
row['Date'] = row['Date'].date()
jsonstr2 = json.dumps(str(row['Date']))
Market_timing2 = (f"{jsonstr2} 현재가가 3 and 5 and 10 단순이동평균보다 낮습니다 코스닥_현재가 {z2} 3일이동평균 {a2} 5일이동평균 {b2} 10일이동평균 {c2}")
bot.sendMessage(chat_id = public_chat_name, text=Market_timing2).chat_id
# 2 시간 마다 실행
# schedule.every(2).hours.do(job)
schedule.every().day.at("10:00").do(job)
schedule.every().day.at("12:00").do(job)
schedule.every().day.at("14:00").do(job)
print('Start App..')
while True:
schedule.run_pending()
time.sleep(1)
- 활용방안
- 전략1: 전날 종가배팅한 종목을 들고 코스닥 마켓타이밍이 10시에 매수신호일 경우 홀딩, 매도신호일 경우 청산
- 전략2: 10시에 코스닥 지수가 매도신호일 경우 눌림목 매수, 12시 매수신호일 경우 홀딩, 반대의 경우 청산, 14-15시 매도
- 개선방안
- 이후 공시 키워드 알람 등 기능을 추가해도 좋을 듯 싶다. '제3자유상증자' '액면분할' '수주' '인수합병' 같은 키워드를 실시간 포착, 재료에 따른 매매를 할 수 있다면 큰 도움이 될 것으로 보인다.
- 클래스를 이용하여 코드를 줄일 수 있다면 더 좋을 듯 싶다.
Github link: