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:

JoshuaChung93/MarketTimer (github.com)