본문 바로가기
Quant

주식 목표 주가 알림(알람) 프로그램 - 소스 코드 공유

by 인천고래 2024. 6. 7.
반응형

안녕하세요. 인천고래입니다. 편리하고 스마트한 투자를 위한 프로그램을 공유하고자 글을 작성합니다.
 
각 증권사가 제공하고 있는 주가 알림(알람) 서비스가 있는 것으로 알고 있지만 종목 수의 제한이 걸려 있는 것으로 알고 있습니다. 그리고 사용자 입맛에 맞게 구성을 할 수 없다는 단점들이 있는데 이에 특정 가격대 이상으로 주가가 올라온 경우 종목수에 관계없이 등록해서 텔레그램으로 알람을 받아 볼 수 있는 스마트하고 간편한 사용법을 반영한 프로그램을 만들었고 이에 해당 프로그램을 공유합니다.
 
아래의 내용을 살펴보시고 원하시는 추가 기능이 있다면 말씀해 주세요.
해당 기능을 반영하여 재 배포하도록 하겠습니다.
 
※ 주식 투자자 모두의 성공적인 투자를 위해 소스까지 공유를 하오니 유용하게 사용하시기를 바라겠습니다.
※ 소스 코드는 해당 글의 하단에 있습니다.
 

'목표 주가 알림(알람)'이란?

보유종목이 지정한 목표 가격에 도달한 경우 텔레그램으로 알림(알람)을 발생하여, 손쉽게 매수, 혹은 매도 타이밍을 판단할 수 있도록 도와주는 서비스 프로그램입니다.

텔레그램 목표 주가 알림 서비스

 
해당 프로그램은 무료로 제공되는 프로그램이며 자체 제작한 프로그램입니다.
물론 피싱과 같은 것은 전혀 없다는 것을 말씀드리며 이에 코드까지 오픈하여 제공합니다.
 
소스가 제공된다는 것은
여러분들의 컴퓨터에서 해당 소스(파이썬 코드)를 실행하는 것을 의미합니다.
 
혹여라도 목표 주가 알림 코드를 직접 실행 못하시는 분들은 댓글을 달아주시면 컴파일된 파일(exe)을 보내드리도록 하겠습니다.
 
 

'목표 주가 알림(알람)' 프로그램 사용 방법

목표 주가 알림을 사용하기 위해서는 아래와 같이 총 3 단계로 나뉩니다.

  1. 텔레그램 접속 설정 (봇 토근 및 채팅방 아이디)
  2. 목표주가 설정 알림 (종목 코드 및 목표 주가 입력)
  3. 알림 설정 시작(버튼을 클릭 시 실행됩니다.)

그리고 각 단계별로는 아래와 같은 이미지 순서를 가집니다.

목표 주가 알림 3단계

 
그러면 단계별로 사용법에 대해 설명을 드리도록 하겠습니다.
 

텔레그램 접속 설정 (1 단계)

텔레그램으로 알림을 받기 위해서는 두 가지가 준비되어 있어야 합니다.

  1. 텔레그램 봇 생성
  2. 채팅방 아이디 찾기 (다수의 사람들이 이용할 계획이면 채널로 채팅방을 만드시면 됩니다.)

 

 

텔레그램 봇 생성: Token 및 Chat ID 확인 방법

안녕하세요. 주식 관련 프로그램을 제작하는 인천고래입니다. 텔레그램은 다양한 기능을 제공하는 인기 있는 메신저로 수많은 주식 정보가 가득한 플랫폼이라고 봐도 과언이 아닙니다.최근에

i-whale.com

위와 같이 준비가 되어 있다면 봇(bot) 아이디도 알 수 있고, 채팅방 아이디도 알 수 있습니다.
아래와 같이 Step 1 단계에서 텔레그램 관련된 설정 값을 입력해 줍니다.
 

목표 주가 알림 설정 1단계

 


목표 주가 종목 설정 (2 단계)

2 번째 단계로 목표 주가 알림을 받기 위한 종목의 목표 주가를 입력하시면 됩니다.

1단계를 완성한 경우 2단계 화면이 자동적으로 오픈이 되면서 1단계의 값(Bot Token, Chat D)이 출력되며 
Stock Code 값에 원하시는 종목의 종목 코드를 입력하신 후 "Get Current Price"를 클릭하면 해당 종목의 현재가를 알 수 있습니다.

이미지에서는 현재가가 1694원인데 목표가를 1650원으로 입력을 했습니다.
이유는 목표가보다 현재가가 높은 경우 정상적으로 알림이 발생하는지 확인하기 위해 목표가를 현재가보다 아래에 설정을 해 뒀습니다.
 
만약 여러분들이 1800원이 목표라면 1800원을 입력하신 뒤 "Add Watch" 버튼을 클릭하시면 다음 단계로 넘어갑니다.

목표 주가 알림 2단계

 
 

텔레그램 알림(알람) 시작 (3 단계)

2 단계에서 정상적으로 관련 내용을 입력한 후 "Add Watch"버튼을 클릭한 경우라면 아래와 같이 1, 2단계에서 입력한 값들을 확인할 수 있습니다.
 
설정한 값을 다시 한번 체크하신 후에 알림 버튼("Start Alerts")을 클릭하면 플라스크(파이썬 코드)에서 관련 명령이 실행이 되며 조건이 맞을 경우 텔레그램으로 메시지를 전송하게 됩니다. (이 글의 맨 위의 텔레그램 메시지 이미지 참조)

목표 주가 알림 3단계

 
현재 버전은 현재가 보다 목표가가 위에 있는 경우만 메시지가 발생되도록 되어 있는데
추가적인 기능을 생각해 본다면 특정 가격대에 진입했을 때 알림이 뜨는 방식도 생각을 해 봤습니다.
 
예를 들어 현재 주가는 75000원이지만 상승했을 때의 가격이 아닌 하락을 염두한 경우라면 위의 버전으로는 해결이 안 됩니다. 그러므로 특정 가격대(범위)를 지정한다면 주가가 아래에 있던 위에 있던 현재 주가와 관계없이 메시지가 발생할 수 있기 때문입니다.
 
이와 같은 버전은 위의 버전을 먼저 사용해 보시고 필요하시다고 생각이 드신다면 말씀해 주세요.
바로 반영하여 업로드하도록 하겠습니다.
 
그럼 다시 한번 알림 설정 방법에 대해 정리를 해 보도록 하죠.

  1. 텔레그램 Bot Token 입력, Chat ID 입력
  2. 종목 코드 입력, 현재가 확인, 목표가 입력
  3. 입력 항목 확인 후 알림 버튼 클릭

 

'목표 주가 알림(알람)' 확인 방법

위의 내용에서 공유를 하였습니다만 알림은 텔레그램을 통해서 알림이 발생됩니다.
텔레그램에 접속하여 Chat ID에 해당하는 채팅방을 확인해 보시면 해당 채팅방에 알림 내용이 발생되어 있을 것입니다.
 

'목표 주가 알림(알람)' 설정 시 유의사항

  1. 플라스크 코드를 (파이참에서) 실행 하신 후 브라우져를 열어서 http://127.0.0.1:5000 입력하시면 화면을 볼 수 있습니다.
  2. 현재의 버전은 한 종목씩 알림을 추가할 수 있습니다.
  3. 지수 흐름에 따라 종목의 목표 알림이 바뀔 수 있기 때문에 일별로 생각하시는 주가를 입력하시면 됩니다.
  4. 알림 설정 종목은 개수 제한은 없으나 수 많은 종목은 컴퓨터 성능에 따라 좌우될 수 있으니 이용에 참고하시기 바랍니다.
  5. 동일종목의 중복 알림 설정은 불가하오니, 유의하여 주세요.
  6. 알림은 60초 단위로 발생이 되도록 되어 있는데 짧은 시간 안에 호출하고 싶으시면 코드를 임의로 수정하셔도 됩니다.
  7. 본 서비스는 투자자 분들의 투자편의를 위해 무료로 제공되는 서비스로, 오류 및 착오에 대해서는 당사가 책임지지 않으니 유의하시기 바랍니다.

 

목표 주가 소스 코드 구조

소스 코드는 4개로 나뉘며 구조는 아래와 같습니다.

flask_app/
│
├── 목표가_도달_알림.py
├── static/
│   ├── styles.css
│   └── script.js
└── templates/
    └── index.html
  1. 플라스크 코드
  2. 클라이언트 파일(HTML&Javascript)에서 온 요청을 받아서 텔레그램으로 전송하는 역할을 합니다.
  3. HTML
  4. 클라이언트(투자자)분들에게 UI&UX를 제공하는 파일입니다.
  5. 스타일시트
  6. HTML의 겉 옷 역할로 이쁘게(?) 보여주는 역할을 합니다.
  7. 자바스크립트
  8. 투자자가 입력한 내용을 플라스크에 전달하는 역할을 합니다.

 

목표 주가 소스 코드 (플라스크:Flask)

HTML 파일과 css, js 파일들에 대해서는 지면을 할애하지 않고 파일로만 제공하도록 하겠습니다.
아래는 피싱의 위험이 전혀 없음을 알려드리는 주가를 가져오고 텔레그램에 알림을 발생시키는 서버 측 코드입니다.

'''
# 인천고래 : 2024-06-07 배포
# 주식정보 사이트 : https://i-whale.com
# 프로그래밍 사이트 : https://quant.i-whale.com
# 유튜브 : https://www.youtube.com/@i-whale_com
# 배포의 성격이 있으니 많은 사람들이 해당 프로그램을 배포한 사람이 누구인지 알 수 있도록 '인천고래' 관련 내용은 삭제하지 말아주세요.

my_flask_app/
│
├── app.py
├── static/
│   ├── styles.css
│   └── script.js
└── templates/
    └── index.html
'''

from flask import Flask, request, jsonify, render_template
import FinanceDataReader as fdr
import threading
import time
from telegram import Bot, error

app = Flask(__name__)

# 전역 변수 설정
bot_token = ''
chat_id = ''
watch_list = {}

# KRX 상장 종목 목록 가져오기
krx_stock_list = fdr.StockListing('KRX')

# 종목 코드로 종목명 찾기
def get_stock_name(stock_symbol):
    stock_info = krx_stock_list[krx_stock_list['Code'] == stock_symbol]
    if not stock_info.empty:
        return stock_info.iloc[0]['Name']
    else:
        return 'Unknown Code'

# 텔레그램 메시지 보내기 함수
def send_telegram_message(message):
    bot = Bot(token=bot_token)
    print("bot_token", bot_token)
    print("chat_id", chat_id)
    print("message", message)
    try:
        bot.send_message(chat_id=chat_id, text=message)
        print("Message sent successfully")
    except error.BadRequest as e:
        print(f"Failed to send message: {e}")

# 주가 확인 및 알림 함수
def check_stock_price():
    while True:
        for stock_symbol, alarm_price in watch_list.items():
            stock = fdr.DataReader(stock_symbol)
            current_price = stock['Close'][-1]
            print(f"현재 {stock_symbol} 주가: {current_price} 목표주가: {alarm_price}")

            if current_price >= alarm_price:
                message = f"{stock_symbol} 주가가 목표가 {alarm_price}에 도달했습니다. 현재 주가: {current_price}"
                send_telegram_message(message)

        time.sleep(60)  # 60초마다 확인

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/setup', methods=['POST'])
def setup():
    global bot_token, chat_id
    data = request.json
    bot_token = data['bot_token']
    chat_id = data['chat_id']
    return jsonify({'status': 'success'})

@app.route('/add_watch', methods=['POST'])
def add_watch():
    data = request.json
    stock_symbol = data['stock_symbol']
    alarm_price = int(data['alarm_price'])  # alarm_price를 정수로 변환
    watch_list[stock_symbol] = alarm_price
    return jsonify({'status': 'success'})

@app.route('/get_price', methods=['GET'])
def get_price():
    stock_symbol = request.args.get('stock_symbol')
    stock = fdr.DataReader(stock_symbol)
    current_price = stock['Close'][-1]
    stock_name = get_stock_name(stock_symbol)  # 종목 이름 가져오기
    return jsonify({'current_price': int(current_price), 'stock_name': stock_name})

@app.route('/start_alerts', methods=['POST'])
def start_alerts():
    alert_thread = threading.Thread(target=check_stock_price)
    alert_thread.daemon = True
    alert_thread.start()
    return jsonify({'status': 'alerts_started'})

if __name__ == '__main__':
    app.run(debug=True)

 
아래는 전체 소스 코드를 압축한 파일입니다.

2024-06-07 텔레그램 목표가 알람.zip
0.01MB

 

정리

이것으로 "목표 주가 알림(알람)" 프로그램에 대한 설명 및 소스 코드에 대한 설명 및 공유를 완료하였습니다.
혹여라도 원하시는 기능이 있거나 변경이 되었으면 하는 내용이 있으면 댓글로 공유해주세요. 의견을 취합하여 좀 더 좋은 프로그램으로 반영하여 재 배포하도록 하겠습니다.
 
제가 처음으로 공유하는 "목표 주가 알림" 프로그램이 여러분들의 투자를 좀 더 편하게 해 주기를 바라는 마음에 공유를 한 것이니 유용하게 사용해 주시면 고맙겠습니다.
 
감사합니다.


 
ps. 위의 소스는 1.0 버전이고 현재는 3.0 버전으로 업데이트 하였으며 아래와 같이 1회당 5개의 종목을 추가할 수 있도록 되어 있습니다.

목표 주가 알림 프로그램 v3

 

반응형
-

댓글