์ธ์Šคํƒ€ ๋Œ€๊ฒฉ๋ณ€] ํ˜ธ๋‚ ๋‘·์นด๋‹ค์‹œ์•ˆ ํŒ”๋กœ์›Œ ์ˆ˜๋ฐฑ๋งŒ ๋ช… ์ฆ๋ฐœํ•œ ์ด์œ  (์ˆ˜์ตํ˜• ๊ณ„์ • ํ‚ค์šฐ๋Š” ๋ฒ•)

์ด๋ฏธ์ง€
  [์ธ์Šคํƒ€ ๋Œ€๊ฒฉ๋ณ€] ํ˜ธ๋‚ ๋‘·์นด๋‹ค์‹œ์•ˆ ํŒ”๋กœ์›Œ ์ˆ˜๋ฐฑ๋งŒ ๋ช… ์ฆ๋ฐœํ•œ ์ด์œ  (์ˆ˜์ตํ˜• ๊ณ„์ • ํ‚ค์šฐ๋Š” ๋ฒ•) ์ตœ๊ทผ ์ธ์Šคํƒ€๊ทธ๋žจ์„ ํ•˜๋‹ค๊ฐ€ ๋‚ด ํŒ”๋กœ์›Œ๊ฐ€ ๊ฐ‘์ž๊ธฐ ์ค„์–ด๋“ค์—ˆ๊ฑฐ๋‚˜, ์ „ ์„ธ๊ณ„์ ์ธ ์…€๋Ÿฝ๋“ค์˜ ํŒ”๋กœ์›Œ ์ˆ˜๊ฐ€ ์ˆ˜๋ฐฑ๋งŒ ๋ช…์”ฉ ๊ธ‰๊ฐํ–ˆ๋‹ค๋Š” ๋‰ด์Šค๋ฅผ ๋ณด์‹  ์ ์ด ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํฌ๋ฆฌ์Šคํ‹ฐ์•„๋ˆ„ ํ˜ธ๋‚ ๋‘(Cristiano Ronaldo), ํ‚ด ์นด๋‹ค์‹œ์•ˆ(Kim Kardashian) ๋“ฑ ์ดˆํŠน๊ธ‰ ์ธํ”Œ๋ฃจ์–ธ์„œ๋“ค์˜ ๊ณ„์ •์—์„œ ํŒ”๋กœ์›Œ๊ฐ€ ๊ทธ์•ผ๋ง๋กœ '์ฆ๋ฐœ'ํ•˜๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ์š”. ์ด๊ฑฐ ์‹œ์Šคํ…œ ์˜ค๋ฅ˜์ผ๊นŒ์š”? ์•„๋‹™๋‹ˆ๋‹ค. ๋ฉ”ํƒ€(Meta)๊ฐ€ ์นผ์„ ๋นผ ๋“ค๊ณ  ์‹น ๋‹ค ์ •๋ฆฌ ์ค‘์ธ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์™œ ์ด๋Ÿฐ ํ˜„์ƒ์ด ์ผ์–ด๋‚ฌ์œผ๋ฉฐ, ์•ž์œผ๋กœ SNS๋กœ ๋ˆ์„ ๋ฒŒ๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๊ฐ€ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•  ํ•ต์‹ฌ ์ „๋žต์„ ๋น ๋ฅด๊ฒŒ ์ •๋ฆฌํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. 1. ํ˜ธ๋‚ ๋‘·์นด๋‹ค์‹œ์•ˆ ํŒ”๋กœ์›Œ๋Š” ์™œ ๊ฐ‘์ž๊ธฐ ๋‚ ์•„๊ฐ”์„๊นŒ? ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด '๊ฐ€์งœ ํŒ”๋กœ์›Œ(์œ ๋ น ๊ณ„์ • ๋ฐ ๋ด‡)'๊ฐ€ ํ„ธ๋ฆฐ ๊ฒƒ ์ž…๋‹ˆ๋‹ค. ํ˜„์žฌ ์ธ์Šคํƒ€๊ทธ๋žจ์„ ์šด์˜ํ•˜๋Š” ๋ฉ”ํƒ€(Meta Platforms)๋Š” ๊ณ ๋„ํ™”๋œ AI ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ ํ”Œ๋žซํผ ๋‚ด์˜ ๊ฐ€์งœ ๊ณ„์ •๋“ค์„ ๋Œ€๋Œ€์ ์œผ๋กœ ์ˆ™์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ ์ฃผ๊ณ  ์‚ฐ ์œ ๋ น ๊ณ„์ • ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋Œ๋ฆฌ๋Š” ๋ด‡(Bot) ๊ณ„์ • ๊ฐ€์ž…๋งŒ ํ•ด๋‘๊ณ  ์ˆ˜๋…„๊ฐ„ ํ™œ๋™์ด ์—†๋Š” ํœด๋ฉด ๊ณ„์ • ๊ณผ๊ฑฐ์—๋Š” ์ด๋Ÿฌํ•œ ๊ฐ€์งœ ๊ณ„์ •๋“ค์„ ์žก์•„๋‚ด๋Š” ๊ธฐ์ˆ ์ด ๋А์Šจํ–ˆ์ง€๋งŒ, ์ง€๊ธˆ์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. AI๊ฐ€ ๋กœ๊ทธ์ธ ํŒจํ„ด, IP ์ฃผ์†Œ, ํ™œ๋™ ์ฃผ๊ธฐ, ๋Œ“๊ธ€์˜ ์ง„์œ„ ์—ฌ๋ถ€ ๊นŒ์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ถ„์„ํ•˜์—ฌ "์‚ฌ๋žŒ์ด ์•„๋‹Œ ๊ณ„์ •"์„ ์นผ๊ฐ™์ด ๊ฑธ๋Ÿฌ๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์ฒœ๋งŒ, ์ˆ˜์–ต ๋ช…์˜ ํŒ”๋กœ์›Œ๋ฅผ ๊ฐ€์ง„ ์…€๋Ÿฝ๋“ค์ผ์ˆ˜๋ก ์œ ๋ น ๊ณ„์ •์ด ์œ ์ž…๋  ํ™•๋ฅ ์ด ๋†’์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฒˆ ์กฐ์น˜๋กœ ์ˆ˜๋ฐฑ๋งŒ ๋ช…์ด ํ•œ ๋ฒˆ์— ๋‚ ์•„๊ฐ„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. 2. ํŒ”๋กœ์›Œ๊ฐ€ ์ค„์—ˆ๋Š”๋ฐ ์˜คํžˆ๋ ค ๊ณ„์ •์— ์ข‹๋‹ค? (์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๋น„๋ฐ€) ๋‚ด๊ฐ€ ๋ˆ์„ ๋“ค์—ฌ ํŒ”๋กœ์›Œ๋ฅผ ์ƒ€๊ฑฐ๋‚˜, ๋งžํŒ” ์ž‘์—…์œผ๋กœ ์–ต์ง€๋กœ ์ˆซ์ž๋ฅผ ๋Š˜๋ ค๋†“์€ ๋ถ„๋“ค์ด๋ผ๋ฉด ์ง€๊ธˆ ๋น„์ƒ์ด ๊ฑธ๋ ธ์„ ๊ฒ๋‹ˆ๋‹ค. "ํ•œ ๋ฒˆ์— ํ›… ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค"๋Š” ๋ง์ด ํ˜„์‹ค์ด ๋˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ . ๊ทธ๋Ÿฐ๋ฐ ํฅ๋ฏธ๋กœ์šด ์‚ฌ์‹ค์€, ๊ฐ€์งœ ํŒ”๋กœ์›Œ๊ฐ€ ๋น ์ ธ๋‚˜๊ฐ€๋ฉด ์˜คํžˆ๋ ค ๋‚ด ๊ณ„์ •์˜ ์ง€์ˆ˜๊ฐ€ ...

์•ˆ๋ณด๋ฉด ๋‹น์‹ ๋งŒ ์†ํ•ด Telegram ๋ด‡ ์ฃผ์‹ ์•Œ๋ฆผ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ

 



์ •๋ฆฌํ•ด์ฃผ๋ฉด:

  • ๐Ÿ“ˆ ๋ชฉํ‘œ๊ฐ€ ๋ŒํŒŒ ์•Œ๋ฆผ ๋ด‡ → Python

  • ๐Ÿš€ ๊ธ‰๋“ฑ/๊ธ‰๋ฝ ํผ์„ผํŠธ ์•Œ๋ฆผ → Python

  • ๐ŸŒŸ ์ด๋™ํ‰๊ท  ๊ณจ๋“ ํฌ๋กœ์Šค ์•Œ๋ฆผ → Python

  • ๐Ÿค– ํ…”๋ ˆ๊ทธ๋žจ ๋ช…๋ น์–ด๋กœ ์ข…๋ชฉ ์ถ”๊ฐ€/์‚ญ์ œ → Python

  • ๐Ÿ” ์ฆ๊ถŒ์‚ฌ API ์—ฐ๋™ ์ž๋™๋งค๋งค ๋ผˆ๋Œ€ → Python

๋ชจ๋‘ ์ด๋Ÿฐ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์•ผ:

  • ์–ธ์–ด: Python 3.x

  • ์‹คํ–‰: python bot.py

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ:

    • python-telegram-bot

    • yfinance

    • pandas

    • requests (์ฆ๊ถŒ์‚ฌ API์šฉ)

์ฆ‰, ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด์„œ ํŒŒ์ด์ฌ ํŒŒ์ผ(.py) ๋กœ ์ €์žฅํ•ด์„œ ๋Œ๋ฆฌ๋ฉด ๋œ๋‹ค.

========

ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ (REST API / Open API)

  • ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ ์˜คํ”ˆAPI ๊ฐœ๋ฐœ์ž์„ผํ„ฐ (KIS Developers)
    ๐Ÿ‘‰ https://apiportal.koreainvestment.com/ — API ๋ฌธ์„œ, ์‹ ์ฒญ, ์ƒ˜ํ”Œ ์ฝ”๋“œ ์ œ๊ณต

    ์ด๊ณณ์—์„œ REST API & WebSocket ๊ธฐ๋ฐ˜ ์ž๋™๋งค๋งค API, ์‹œ์„ธ์กฐํšŒ, ์ฃผ๋ฌธ/๊ณ„์ขŒ ๊ธฐ๋Šฅ ๋“ฑ์„ ์‹ ์ฒญ ๋ฐ ๋ฌธ์„œ ํ™•์ธ ๊ฐ€๋Šฅ

๐Ÿฅˆ ํ‚ค์›€์ฆ๊ถŒ (Open API+ / REST API)

  • ํ‚ค์›€์ฆ๊ถŒ REST API / Open API ๊ณต์‹ ํŽ˜์ด์ง€
    ๐Ÿ‘‰ https://openapi.kiwoom.com/ — REST API ์„œ๋น„์Šค ์†Œ๊ฐœ ๋ฐ ์‹ ์ฒญ

    ๊ธฐ๋ณธ HTS ๊ธฐ๋ฐ˜ Open API+ ๋ชจ๋“ˆ๊ณผ ์ตœ๊ทผ REST API ์„œ๋น„์Šค๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ณ„์ขŒ·์‹œ์„ธ·์ฃผ๋ฌธ ์—ฐ๋™ ๊ฐ€๋Šฅ

๐Ÿ“Œ ์ฐธ๊ณ :

  • ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ์€ REST API + Websocket ๊ณต์‹ ์ง€์›์œผ๋กœ ์ž๋™๋งค๋งค ๊ตฌํ˜„์— ๋งŽ์ด ํ™œ์šฉ๋จ (OS/ํ™˜๊ฒฝ ์ œ์•ฝ ์ ์Œ)

  • ํ‚ค์›€์ฆ๊ถŒ ์ปค๋ฎค๋‹ˆํ‹ฐ๋‚˜ ์ž๋ฃŒ์‹ค์—์„œ HTS Open API+ ๋‹ค์šด๋กœ๋“œ ๋ฐ ๊ฐœ๋ฐœ ๊ฐ€์ด๋“œ๋„ ์ œ๊ณต๋จ


๐Ÿง  API ํ™œ์šฉ ํŒ

✔ API ๋“ฑ ์‹ ์ฒญ ์ „์— ์ฆ๊ถŒ ๊ณ„์ขŒ ๊ฐœ์„ค์€ ํ•„์ˆ˜
✔ REST API๋Š” ์›น ๊ธฐ๋ฐ˜ ์„œ๋ฒ„/ํด๋ผ์šฐ๋“œ์—์„œ๋„ ์—ฐ๋™ ๊ฐ€๋Šฅ
✔ HTS ๊ธฐ๋ฐ˜ API(Open API+)๋Š” Windows ํ™˜๊ฒฝ + HTS ์„ค์น˜ ํ•„์š”

์›ํ•˜๋ฉด ํ•œ๊ตญํˆฌ์ž์ฆ๊ถŒ API๋ฅผ Python์œผ๋กœ ์—ฐ๋™ํ•˜๋Š” ์ƒ˜ํ”Œ ์ฝ”๋“œ๋„ ๋ฐ”๋กœ ์ œ๊ณตํ•ด์ค„๊นŒ? (์˜ˆ: ํ† ํฐ ๋ฐœ๊ธ‰ → ์‹œ์„ธ์กฐํšŒ → ์ฃผ๋ฌธ๊นŒ์ง€) ๐Ÿง‘‍๐Ÿ’ป

========================

(ํ•œ๊ตญ ์ฃผ์‹๋„ ๊ฐ€๋Šฅ, ์ผ์ • ๊ฐ€๊ฒฉ ๋„๋‹ฌ ์‹œ ์•Œ๋ฆผ)

1. ์ค€๋น„๋ฌผ

  1. ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡ ์ƒ์„ฑ (BotFather)

  2. ๋ด‡ ํ† ํฐ

  3. ๋ณธ์ธ Chat ID

  4. Python ์„ค์น˜

  5. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ: python-telegram-bot, yfinance

---------------------------

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜ 

pip install python-telegram-bot yfinance

=========================
A-1.  ํ…”๋ ˆ๊ทธ๋žจ ์ฃผ์‹ ์•Œ๋žŒ๋ด‡ ์ฝ”๋“œ

import time
import yfinance as yf
from telegram import Bot

TOKEN = "์—ฌ๊ธฐ์—_๋ด‡ํ† ํฐ"
CHAT_ID = "์—ฌ๊ธฐ์—_๋ณธ์ธ_CHAT_ID"

bot = Bot(token=TOKEN)

# ๊ฐ์‹œํ•  ์ข…๋ชฉ
stocks = {
    "005930.KS": 70000,  # ์‚ผ์„ฑ์ „์ž ๋ชฉํ‘œ๊ฐ€
    "035420.KS": 200000 # ๋„ค์ด๋ฒ„ ๋ชฉํ‘œ๊ฐ€
}

def send_message(text):
    bot.send_message(chat_id=CHAT_ID, text=text)

def check_price():
    for ticker, target in stocks.items():
        stock = yf.Ticker(ticker)
        price = stock.history(period="1d")["Close"].iloc[-1]

        if price >= target:
            msg = f"๐Ÿšจ {ticker} ๋ชฉํ‘œ๊ฐ€ ๋„๋‹ฌ!\nํ˜„์žฌ๊ฐ€: {int(price):,}์›\n๋ชฉํ‘œ๊ฐ€: {target:,}์›"
            send_message(msg)
            print(msg)

while True:
    try:
        check_price()
        time.sleep(300)  # 5๋ถ„๋งˆ๋‹ค ์ฒดํฌ
    except Exception as e:
        print("์—๋Ÿฌ:", e)
        time.sleep(60)
===============================

======================

 ๋ŒํŒŒ ์•Œ๋ฆผ ์ „์šฉ ํ…”๋ ˆ๊ทธ๋žจ ๋ด‡


pip install python-telegram-bot yfinance


A-2 .๋ŒํŒŒ ์•Œ๋ฆผ๋ด‡ ์ฝ”๋“œ

import time
import yfinance as yf
from telegram import Bot

TOKEN = "์—ฌ๊ธฐ์—_ํ…”๋ ˆ๊ทธ๋žจ_๋ด‡_ํ† ํฐ"
CHAT_ID = "์—ฌ๊ธฐ์—_๋ณธ์ธ_CHAT_ID"

bot = Bot(token=TOKEN)

# ์ข…๋ชฉ : ๋ชฉํ‘œ๊ฐ€
targets = {
    "005930.KS": 70000,   # ์‚ผ์„ฑ์ „์ž
    "000660.KS": 150000,  # SKํ•˜์ด๋‹‰์Šค
    "AAPL": 200          # ์• ํ”Œ
}

sent = set()  # ์ด๋ฏธ ์•Œ๋ฆผ ๋ณด๋‚ธ ์ข…๋ชฉ ์ค‘๋ณต ๋ฐฉ์ง€

def check_targets():
    for code, target_price in targets.items():
        stock = yf.Ticker(code)
        price = stock.history(period="1d")["Close"].iloc[-1]

        if price >= target_price and code not in sent:
            message = f"""
๐Ÿ“ˆ ๋ชฉํ‘œ๊ฐ€ ๋ŒํŒŒ ์•Œ๋ฆผ!

์ข…๋ชฉ: {code}
ํ˜„์žฌ๊ฐ€: {int(price):,}
๋ชฉํ‘œ๊ฐ€: {int(target_price):,}
์ƒํƒœ: ๋ชฉํ‘œ๊ฐ€ ๋ŒํŒŒ ์„ฑ๊ณต ๐Ÿš€
"""
            bot.send_message(chat_id=CHAT_ID, text=message)
            sent.add(code)

while True:
    try:
        check_targets()
        time.sleep(180)  # 3๋ถ„๋งˆ๋‹ค ์ฒดํฌ
    except Exception as e:
        print("์˜ค๋ฅ˜:", e)
        time.sleep(60)


-===============

A-3.๊ธ‰๋“ฑ ๊ธ‰๋ฝ ํผ์„ผํŠธ ์•Œ๋ฆผ๋ด‡

pip install python-telegram-bot yfinance


import time
import yfinance as yf
from telegram import Bot

TOKEN = "์—ฌ๊ธฐ์—_๋ด‡ํ† ํฐ"
CHAT_ID = "์—ฌ๊ธฐ์—_CHAT_ID"

bot = Bot(token=TOKEN)

# ๊ฐ์‹œ ์ข…๋ชฉ
watch_list = ["005930.KS", "000660.KS", "AAPL", "TSLA"]

UP_ALERT = 5     # +5% ์ด์ƒ ๊ธ‰๋“ฑ
DOWN_ALERT = -5  # -5% ์ดํ•˜ ๊ธ‰๋ฝ

alerted = set()

def check_change():
    for code in watch_list:
        stock = yf.Ticker(code)
        data = stock.history(period="2d")

        yesterday = data["Close"].iloc[-2]
        today = data["Close"].iloc[-1]

        change = (today - yesterday) / yesterday * 100

        key = f"{code}_{int(change)}"
        if (change >= UP_ALERT or change <= DOWN_ALERT) and key not in alerted:
            arrow = "๐Ÿš€ ๊ธ‰๋“ฑ" if change >= UP_ALERT else "๐Ÿ”ป ๊ธ‰๋ฝ"
            msg = f"""
{arrow} ํผ์„ผํŠธ ์•Œ๋ฆผ

์ข…๋ชฉ: {code}
์ „์ผ์ข…๊ฐ€: {int(yesterday):,}
ํ˜„์žฌ๊ฐ€: {int(today):,}
๋“ฑ๋ฝ๋ฅ : {change:.2f}%
"""
            bot.send_message(chat_id=CHAT_ID, text=msg)
            alerted.add(key)

while True:
    try:
        check_change()
        time.sleep(180)  # 3๋ถ„๋งˆ๋‹ค ์ฒดํฌ
    except Exception as e:
        print("์—๋Ÿฌ:", e)
        time.sleep(60)
======================================

์ด๋™ํ‰๊ท ์„  ๊ณจ๋“ ํฌ๋กœ์Šค ๋ฐœ์ƒ ์‹œ ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ์•Œ๋ฆผ ์˜ค๋Š” ๋ด‡

pip install python-telegram-bot yfinance pandas


A-4.๊ณจ๋“ ํฌ๋กœ์Šค ์•Œ๋ฆผ ๋ด‡ ์ฝ”๋“œ (5์ผ์„  / 20์ผ์„  ์˜ˆ์‹œ)

import time
import yfinance as yf
import pandas as pd
from telegram import Bot

TOKEN = "์—ฌ๊ธฐ์—_๋ด‡ํ† ํฐ"
CHAT_ID = "์—ฌ๊ธฐ์—_CHAT_ID"

bot = Bot(token=TOKEN)

watch_list = ["005930.KS", "000660.KS", "AAPL", "TSLA"]
SHORT_MA = 5
LONG_MA = 20

alerted = set()

def check_golden_cross():
    for code in watch_list:
        df = yf.download(code, period="3mo", interval="1d")

        df["MA_S"] = df["Close"].rolling(SHORT_MA).mean()
        df["MA_L"] = df["Close"].rolling(LONG_MA).mean()

        prev = df.iloc[-2]
        now = df.iloc[-1]

        # ๊ณจ๋“ ํฌ๋กœ์Šค ์กฐ๊ฑด: ์–ด์ œ๋Š” ์•„๋ž˜, ์˜ค๋Š˜์€ ์œ„
        if prev["MA_S"] < prev["MA_L"] and now["MA_S"] > now["MA_L"]:
            if code not in alerted:
                msg = f"""
๐ŸŒŸ ๊ณจ๋“ ํฌ๋กœ์Šค ๋ฐœ์ƒ!

์ข…๋ชฉ: {code}
๋‹จ๊ธฐ์„ ({SHORT_MA}์ผ): {now["MA_S"]:.2f}
์žฅ๊ธฐ์„ ({LONG_MA}์ผ): {now["MA_L"]:.2f}
ํ˜„์žฌ๊ฐ€: {now["Close"]:.2f}
์‹ ํ˜ธ: ์ƒ์Šน ์ถ”์„ธ ์ „ํ™˜ ๐Ÿš€
"""
                bot.send_message(chat_id=CHAT_ID, text=msg)
                alerted.add(code)

while True:
    try:
        check_golden_cross()
        time.sleep(300)  # 5๋ถ„๋งˆ๋‹ค ์ฒดํฌ
    except Exception as e:
        print("์—๋Ÿฌ:", e)
        time.sleep(60)



=========

ํ…”๋ ˆ๊ทธ๋žจ ์•Œ๋ฆผ → ์ฆ๊ถŒ์‚ฌ API ์—ฐ๋™ → ์ž๋™๋งค์ˆ˜/๋งค๋„๊นŒ์ง€ ํ•˜๋Š” ์™„์ „ ์ž๋™๋งค๋งค ๋ด‡ ๊ตฌ์กฐ

[์‹ค์‹œ๊ฐ„ ์‹œ์„ธ ์ˆ˜์ง‘]
        ↓
[์กฐ๊ฑด ํŒ๋‹จ (๊ณจ๋“ ํฌ๋กœ์Šค, ๋ชฉํ‘œ๊ฐ€, ํผ์„ผํŠธ)]
        ↓
[๋งค์ˆ˜/๋งค๋„ ์‹œ๊ทธ๋„ ๋ฐœ์ƒ]
        ↓
[์ฆ๊ถŒ์‚ฌ REST API ์ฃผ๋ฌธ ์ „์†ก]
        ↓
[์ฒด๊ฒฐ ํ™•์ธ]
        ↓
[ํ…”๋ ˆ๊ทธ๋žจ์œผ๋กœ ๊ฒฐ๊ณผ ํ†ต๋ณด]

==================


pip install requests python-telegram-bot yfinance pandas

A-5. ์ž๋™๋งค๋งค ๊ธฐ๋ณธ์˜ˆ์‹œ ์ฝ”๋“œ

import requests
import time
import yfinance as yf
import pandas as pd
from telegram import Bot

# ===== ํ…”๋ ˆ๊ทธ๋žจ =====
TG_TOKEN = "ํ…”๋ ˆ๊ทธ๋žจ_๋ด‡ํ† ํฐ"
CHAT_ID = "๋ณธ์ธ_CHAT_ID"
bot = Bot(TG_TOKEN)

# ===== ์ฆ๊ถŒ์‚ฌ API (์˜ˆ: ํ•œ๊ตญํˆฌ์ž) =====
APP_KEY = "์ฆ๊ถŒ์‚ฌ_APP_KEY"
APP_SECRET = "์ฆ๊ถŒ์‚ฌ_APP_SECRET"
ACCESS_TOKEN = "๋ฐœ๊ธ‰๋ฐ›์€_ACCESS_TOKEN"
ACCOUNT = "๊ณ„์ขŒ๋ฒˆํ˜ธ"

BASE_URL = "https://openapi.koreainvestment.com:9443"

headers = {
    "authorization": f"Bearer {ACCESS_TOKEN}",
    "appkey": APP_KEY,
    "appsecret": APP_SECRET,
    "tr_id": "TTTC0802U",  # ์ฃผ์‹ ์‹œ์žฅ๊ฐ€ ๋งค์ˆ˜
    "content-type": "application/json"
}

def send_telegram(msg):
    bot.send_message(chat_id=CHAT_ID, text=msg)

# ===== ๋งค์ˆ˜ ํ•จ์ˆ˜ =====
def buy(stock_code, qty):
    url = f"{BASE_URL}/uapi/domestic-stock/v1/trading/order-cash"
    data = {
        "CANO": ACCOUNT[:8],
        "ACNT_PRDT_CD": ACCOUNT[8:],
        "PDNO": stock_code,
        "ORD_DVSN": "01",   # ์‹œ์žฅ๊ฐ€
        "ORD_QTY": str(qty),
        "ORD_UNPR": "0"
    }
    res = requests.post(url, headers=headers, json=data)
    return res.json()

# ===== ๊ณจ๋“ ํฌ๋กœ์Šค ์กฐ๊ฑด =====
def golden_cross(code):
    df = yf.download(code, period="3mo")
    df["MA5"] = df["Close"].rolling(5).mean()
    df["MA20"] = df["Close"].rolling(20).mean()

    prev = df.iloc[-2]
    now = df.iloc[-1]

    return prev["MA5"] < prev["MA20"] and now["MA5"] > now["MA20"]

# ===== ๋ฉ”์ธ ๋ฃจํ”„ =====
watch = ["005930.KS", "000660.KS"]
bought = set()

while True:
    try:
        for stock in watch:
            code = stock.replace(".KS","")
            if golden_cross(stock) and code not in bought:
                result = buy(code, 1)  # 1์ฃผ ๋งค์ˆ˜
                send_telegram(f"๐Ÿš€ ์ž๋™๋งค์ˆ˜ ์‹คํ–‰\n์ข…๋ชฉ: {code}\n๊ฒฐ๊ณผ: {result}")
                bought.add(code)
        time.sleep(60)
    except Exception as e:
        sen. d_telegram(f"⚠ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
        time.sleep(30)
====================

A-6.ํ…”๋ ˆ๊ทธ๋žจ์—์„œ ๋ช…๋ น์–ด๋กœ ์ข…๋ชฉ ์ถ”๊ฐ€/์‚ญ์ œํ•˜๋Š” ์ฃผ์‹ ์•Œ๋ฆผ ๋ด‡

pip install python-telegram-bot yfinance pandas

ํ…”๋ ˆ๊ทธ๋žจ ๋ช…๋ น์–ดํ˜• ์ฃผ์‹ ๊ด€๋ฆฌ ๋ด‡

๊ธฐ๋Šฅ

  • /add 005930 → ์ข…๋ชฉ ์ถ”๊ฐ€

  • /del 005930 → ์ข…๋ชฉ ์‚ญ์ œ

  • /list → ํ˜„์žฌ ๊ฐ์‹œ ์ข…๋ชฉ ๋ณด๊ธฐ

from telegram.ext import Application, CommandHandler
import yfinance as yf
import pandas as pd

TOKEN = "์—ฌ๊ธฐ์—_๋ด‡ํ† ํฐ"

watch_list = set()

async def start(update, context):
    await update.message.reply_text(
        "๐Ÿ“ˆ ์ฃผ์‹ ์•Œ๋ฆผ ๋ด‡ ์‹œ์ž‘!\n\n"
        "/add ์ข…๋ชฉ์ฝ”๋“œ\n"
        "/del ์ข…๋ชฉ์ฝ”๋“œ\n"
        "/list"
    )

async def add_stock(update, context):
    code = context.args[0].upper()
    watch_list.add(code)
    await update.message.reply_text(f"✅ {code} ๊ฐ์‹œ์ข…๋ชฉ์— ์ถ”๊ฐ€๋จ")

async def del_stock(update, context):
    code = context.args[0].upper()
    if code in watch_list:
        watch_list.remove(code)
        await update.message.reply_text(f"❌ {code} ๊ฐ์‹œ์ข…๋ชฉ์—์„œ ์‚ญ์ œ๋จ")
    else:
        await update.message.reply_text("⚠ ๋ชฉ๋ก์— ์—†๋Š” ์ข…๋ชฉ์ž…๋‹ˆ๋‹ค.")

async def list_stock(update, context):
    if not watch_list:
        await update.message.reply_text("ํ˜„์žฌ ๊ฐ์‹œ ์ข…๋ชฉ์ด ์—†์Šต๋‹ˆ๋‹ค.")
    else:
        msg = "๐Ÿ“‹ ํ˜„์žฌ ๊ฐ์‹œ ์ข…๋ชฉ\n\n"
        msg += "\n".join(watch_list)
        await update.message.reply_text(msg)

app = Application.builder().token(TOKEN).build()

app.add_handler(CommandHandler("start", start))
app.add_handler(CommandHandler("add", add_stock))
app.add_handler(CommandHandler("del", del_stock))
app.add_handler(CommandHandler("list", list_stock))

app.run_polling()




====================
์ž๋™๋งค๋งค ์ปจํŠธ๋กค๊ธฐ๋Šฅ ์ถ”๊ฐ€์ œ

/target 005930 72000   → ๋ชฉํ‘œ๊ฐ€ ์„ค์ •
/ma 5 20               → ์ด๋™ํ‰๊ท  ๋ณ€๊ฒฝ
/buy 005930 10         → ์‹ค๋งค์ˆ˜
/sell 005930 10        → ์‹ค๋งค๋„
/on                    → ์ž๋™๋งค๋งค ์‹œ์ž‘
/off                   → ์ž๋™๋งค๋งค ์ค‘์ง€




์ด ๋ธ”๋กœ๊ทธ์˜ ์ธ๊ธฐ ๊ฒŒ์‹œ๋ฌผ

๋ชจ๋ฅด๋ฉด ๋‹น์‹ ๋งŒ ์†ํ•ด! ์“ฐ๋ ˆ๋“œ ํ”„๋กœํ•„ ์ตœ์ ํ™”๋กœ ์ฒซ ์ฃผ ๋งŒ๋ช… ํŒ”๋กœ์›Œ ๋ชจ์œผ๋Š” ์‹ค์ „ ํŒ๊ณผ ์‚ฌ๋ก€

์‰ฌ์›Œ ๊ธˆ๋ฐฉ์ด์•ผ! ์“ฐ๋ ˆ๋“œ ํ•˜๋ฃจ 10ํฌ์ŠคํŒ… ์‹œ๋ฆฌ์ฆˆ ์ฝ˜ํ…์ธ ๋กœ ํŒ”๋กœ์›Œ ๋Œ€๋ฐ• ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฃจํ‹ด