-
MarketTimer_1.0: making noteService developing 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: