모든 NSE 트레이더에게 필요한 10가지 Python 스크립트 (코드 포함)DOYR | 금융/법률/세무 자문이 아닙니다. 교육 목적으로만 사용하세요.---2026년에 NSE 개인 트레이더이면서 Python을 사용하지 않고 있다면, 당신은 수익을 놓치고 있는 것입니다. Python이 마법 같아서가 아닙니다. Python은 당신이 수동으로 2시간 동안 할 일을 2초 만에 해낼 수 있기 때문입니다. 저는 지난 2년 동안 Termux/Android에서 트레이딩 도구들을 구축해 왔습니다. 제가 매일 사용하는 10가지 Python 스크립트를 소개합니다. 모든 코드는 무료입니다. 모든 도구는 무료입니다. 당신의 휴대폰에서 실행할 수 있습니다.
왜 Python + Termux = 초능력인가
대부분의 트레이더들은 코딩이 "기술 전문가"나 "전문가"들만을 위한 것이라고 생각합니다. 그것은 거짓말입니다. Python은서:
- 배우기 쉬움 (Easy to learn) — 영어처럼 읽기 쉬움
- 무료 (Free) — 라이선스나 구독료 없음
- 강력함 (Powerful) — 데이터 가져오기, 분석, 알림 전송 가능
- 휴대성 (Portable) — 휴대폰, 노트북, 클라우드에서 실행 가능
Termux는 당신의 Android 휴대폰을 완전한 Linux 머신으로 바꿔줍니다. 다음과 같은 것들을 사용할 수 있습니다:
- Python 3.13
- pip 패키지 매니저 (package manager)
- Git, curl, wget
- 스케줄링을 위한 cron
- 전체 파일 시스템 액세스 (Full filesystem access)
결합하면, Python + Termux = 당신의 주머니 속에 있는 **완전한 트레이딩 워크스테이션 (trading workstation)**이 됩니다.
이 스크립트들이 당신을 위해 해줄 일
| 절약된 시간 | 스크립트 | 수동 소요 시간 | 자동화 소요 시간 |
|---|
| 매일 | 가격 가져오기 (Price fetcher) | 5분 | 5초 |
| 매일 | 상위 상승/하락 종목 (Top gainers/losers) | 15분 | 10초 |
| 매일 | FII/DII 추적기 (FII/DII tracker) | 10분 | 5초 |
| 매주 | 주식 스크리너 (Stock screener) | 2시간 | 30초 |
| 매일 | 옵션 체인 분석기 (Option chain analyzer) | 10분 | 2초 |
| 매일 | Telegram 알림 (Telegram alerts) | 수동 확인 | 즉시 |
| 매주 | 백테스트 실행기 (Backtest runner) | 4시간 | 1분 |
| 매일 | 포트폴리오 추적기 (Portfolio tracker) | 30분 | 5초 |
| 매일 | 뉴스 감성 분석 (News sentiment) | 20분 | 10초 |
| 매일 | 보고서 생성기 (Report generator) | 30분 | 2초 |
총 절약 시간: 주당 6시간 이상
가치:
- 시간당 ₹500로 계산할 경우 월 ₹10,000 이상의 가치
사전 요구 사항
이 스크립트들을 실행하기 전에 다음 사항을 확인하세요:
- Termux 설치 (Play Store가 아닌 F-Droid에서 설치)
- Python 3.9+ 설치 (
pkg install python)
pip 작동 확인 (pip install pandas numpy requests xgboost)
4. 인터넷 연결 (4G/WiFi)
이것으로 끝입니다. 화려한 하드웨어도, 비싼 구독 서비스도 필요 없습니다.
이 가이드 사용법
순서대로 읽는 것을 권장합니다. 스크립트 1번부터 시작하여 숙달한 다음, 스크립트 2번으로 넘어가세요. 하루 만에 10개를 모두 구현하려고 하지 마세요.
1주 차: 스크립트 1-3 (기본 데이터 가져오기)
2주 차: 스크립트 4-6 (분석 + 알림)
3주 차: 스크립트 7-9 (백테스팅 (Backtesting) + 감성 분석 (Sentiment))
4주 차: 스크립트 10 + 자동화 (Automation)
한 달이 지나면, 당신은 완벽한 트레이딩 툴킷을 갖게 될 것입니다.
시작 전 중요 사항
- API 제한 사항: NSE API는 Termux로부터의 요청을 차단할 수 있습니다. 항상 대체 수단(Yahoo Finance, 웹 스크래핑 (Web Scraping))을 마련해 두세요.
- 속도 제한 (Rate limits): 스크립트를 5초마다 실행하지 마세요. 지연 시간 (Delays)을 추가하고, API를 존중하세요.
- 데이터 정확성: 무료 API는 지연이 발생할 수 있습니다. 중요한 거래를 할 때는 브로커 앱을 통해 확인하세요.
- 면책 조항 (Disclaimer): 이 스크립트들은 교육 목적으로만 제공됩니다. 금융 자문이 아닙니다. 실제 거래를 하기 전에 반드시 테스트하세요.
- 백업: 항상 코드를 백업하세요. Git을 사용하세요. 20시간의 작업물을 잃지 마세요.
일반적인 문제 해결 (Troubleshooting)
*문제 1: NSE API 차단
- NSE가 알 수 없는 IP로부터의 요청을 차단함
- 해결책: 헤더 (Headers)를 추가하거나, 세션 쿠키 (Session cookies)를 사용하거나, Yahoo Finance로 전환하세요.
문제 2: 모듈을 찾을 수 없음 (Module not found)
- 실행: pip install module_name
- 또는 pip가 작동하지 않으면 pip3를 사용하세요.
문제 3: 스크립트 실행 속도가 느림
- 캐싱 (Caching) 추가 (데이터를 파일에 저장하여 매번 가져오지 않도록 함)
- 비동기 요청 (Async requests) 사용
- 데이터 빈도 감소 (1분 대신 5분 단위 사용)
문제 4: 텔레그램 (Telegram) 봇이 작동하지 않음
- @BotFather를 통해 봇 토큰을 확인하세요.
- 채팅 ID (Chat ID)를 확인하세요 (@getidsbot 사용).
- 봇이 그룹/채널에 추가되었는지 확인하세요.
다음 단계
이 10개의 스크립트를 모두 구현했다면, 다음 단계는 다음과 같습니다:
- 스크립트 결합 — 10개 모두를 실행하는 마스터 스크립트를 만드세요.
- 데이터베이스 추가 — SQLite3에 과거 데이터를 저장하세요.
- 웹 UI 구축 — Flask를 사용하여 로컬 대시보드를 만드세요.
- 클라우드 배포 — Heroku/Render에서 스크립트를 24/7 실행하세요.
머신러닝 (Machine Learning) 추가 — 예측을 위해 scikit-learn/XGBoost를 사용하세요.
"코딩을 못해요"에서 "나만의 트레이딩 시스템을 구축했습니다"로 가는 여정은 약 3개월이 소요됩니다. 오늘 시작하세요.
스크립트 1: 실시간 Nifty 가격 가져오기
사용 용도:
- 5개의 앱을 열지 않고 실시간 Nifty 50 가격을 가져옵니다.
`python
import urllib.request, json
def get_nifty():
url = "https://query1.finance.yahoo.com/v8/finance/chart/%5ENSEI"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
r = urllib.request.urlopen(req, timeout=10)
data = json.loads(r.read())
price = data['chart']['result'][0]['meta']['regularMarketPrice']
print(f"Nifty 50: {price}")
return price
get_nifty()
`
필요한 이유: 3개의 서로 다른 앱을 확인할 필요가 없습니다. 하나의 스크립트로 하나의 가격만 확인하세요.
스크립트 2: 상위 상승/하락 종목 스크리너 (Screener)
사용 용도:
- 오늘 어떤 Nifty 50 종목이 가장 많이 움직이는지 찾습니다.
`python
import urllib.request, json
def get_nifty50():
url = "https://www.nseindia.com/api/equity-stockIndices?index=NIFTY%2050"
req = urllib.request.Request(url, headers={ "User-Agent": "Mozilla/5.0", "Accept": "application/json" })
try:
r = urllib.request.urlopen(req, timeout=10)
data = json.loads(r.read())
stocks = data['data']
# 등락률(percent change) 기준 정렬
sorted_stocks = sorted(stocks, key=lambda x: x.get('pChange', 0), reverse=True)
print("TOP 5 GAINERS:")
for s in sorted_stocks[:5]:
print(f"{s['symbol']}: {s['pChange']:.2f}%")
print("\nTOP 5 LOSERS:")
for s in sorted_stocks[-5:]:
print(f"{s['symbol']}: {s['pChange']:.2f}%")
except Exception as e:
print(f"NSE API가 차단되었습니다. Yahoo Finance 폴백(fallback)을 사용하세요: {e}")
get_nifty50()
`
필요한 이유: NSE API는 때때로 Termux에서 접속을 차단합니다. Yahoo Finance로의 폴백(fallback)이 작동합니다.
스크립트 3: FII/DII 데이터 가져오기
사용 용도:
- 기관 자금 흐름을 추적합니다. FII 매수는 강세 신호(bullish signal)입니다.
import urllib.request, json
from datetime import date
timedef get_fii_dii():
url = "https://www.nseindia.com/api/fiidiiTrade"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
try:
r = urllib.request.urlopen(req, timeout=10)
data = json.loads(r.read())
for entry in data.get('data', []):
date = entry.get('date', '')
fii = entry.get('fii', {}).get('net', 0)
dii = entry.get('dii', {}).get('net', 0)
print(f"{date}: FII={fii}, DII={dii}")
except Exception as e:
print(f"NSE API error: {e}")
get_fii_dii()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
이 스크립트가 필요한 이유: 기관 자금 흐름은 시장을 움직입니다. 개인 트레이더가 이를 무시하는 것은 위험합니다.
Script 4: 주식 스크리너 (PE + ROE + 부채)
사용법: Nifty 50에서 근본적으로 강한(fundamentally strong) 종목을 필터링합니다.
import urllib.request, json
def screen_nifty50():
screened = []
nifty50 = ['RELIANCE', 'TCS', 'INFY', 'HDFCBANK', 'ICICIBANK']
try:
url = f"https://query1.finance.yahoo.com/v10/finance/quoteSummary/{stock}.NS?modules=summaryDetail,financialData"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
r = urllib.request.urlopen(req, timeout=5)
data = json.loads(r.read())
pe = data['quoteSummary']['result'][0]['summaryDetail']['trailingPE']['raw']
roe = data['quoteSummary']['result'][0]['financialData']['returnOnEquity']['raw']
if pe < 30 and roe > 0.15:
screened.append(f"{stock}: PE={pe:.1f}, ROE={roe:.1%}")
except:
continue
print("SCREENED STOCKS (PE<30, ROE>15%):")
for s in screened:
print(s)
screen_nifty50()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
이 스크립트가 필요한 이유: 가치 투자가 간단해집니다. 10초 만에 50개 종목을 필터링하세요.
Script 5: 옵션 체인 분석기
사용법:
옵션 체인 데이터에서 최대 고점(max pain), 지지선(support), 저항선(resistance)을 찾습니다.
import urllib.request, json
def analyze_option_chain(symbol="NIFTY", expiry="2026-08-28"):
url = f"https://www.nseindia.com/api/option-chain-indices?symbol={symbol}"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
try:
r = urllib.request.urlopen(req, timeout=10)
data = json.loads(r.read())
calls = {}
puts = {}
for record in data['records']['data']:
strike = record.get('strikePrice')
if 'CE' in record: calls[strike] = record['CE']['openInterest']
if 'PE' in record: puts[strike] = record['PE']['openInterest']
max_pain = max(calls, key=lambda k: calls.get(k, 0) + puts.get(k, 0))
support = max(puts, key=puts.get)
resistance = max(calls, key=calls.get)
print(f"Max Pain: {max_pain}")
print(f"Support: {support} (Put OI: {puts[support]})")
print(f"Resistance: {resistance} (Call OI: {calls[resistance]})")
except Exception as e:
print(f"NSE API error: {e}")
analyze_option_chain()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
필요한 이유: 옵션 체인을 수동으로 읽는 데 5분이 걸립니다. 이 스크립트는 2초 만에 처리합니다.
Script 6: Telegram 알림 봇 (Telegram Alert Bot)
사용법:
Nifty가 주요 레벨을 돌파할 때 알림을 받습니다.
import urllib.request, json
def send_telegram(message, bot_token="YOUR_TOKEN", chat_id="-1004486524686"):
url = f"https://api.telegram.org/bot{bot_token}/sendMessage"
payload = json.dumps({ "chat_id": chat_id, "text": message, "parse_mode": "HTML" }).encode()
req = urllib.request.Request(url, data=payload, headers={"Content-Type": "application/json"})
try:
r = urllib.request.urlopen(req, timeout=10)
print("Alert sent!")
except Exception as e:
print(f"Error: {e}")
send_telegram("Nifty가 24,500 저항선을 돌파했습니다! 다음 목표는 24,600입니다.")
필요한 이유: 하루 24시간 내내 차트를 모니터링할 수는 없습니다. Python이 대신 지켜보게 하세요.
Script 7: 일일 백테스트 실행기 (Daily Backtest Runner)
사용법:
Nifty 과거 데이터를 사용하여 단순 이동 평균(simple moving average) 교차 전략을 테스트합니다.
import urllib.request, json
import pandas as pd
def backtest_ma_crossover():
url = "https://query1.finance.yahoo.com/v8/finance/chart/%5ENSEI?range=1y&interval=1d"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
r = urllib.request.urlopen(req, timeout=10)
data = json.loads(r.read())
timestamps = data['chart']['result'][0]['timestamp']
closes = data['chart']['result'][0]['indicators']['quote'][0]['close']
df = pd.DataFrame({'close': closes})
df['ma20'] = df['close'].rolling(20).mean()
df['ma50'] = df['close'].rolling(50).mean()
df['signal'] = 0
df.loc[df['ma20'] > df['ma50'], 'signal'] = 1
df.loc[df['ma20'] < df['ma50'], 'signal'] = -1
print("Last signal:", df['signal'].iloc[-1])
return df
backtest_ma_crossover()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
필요한 이유: 배포하기 전에 백테스팅을 하세요. 테스트하지 않은 것은 거래하지 마십시오.
스크립트 8: 포트폴리오 추적기 (Portfolio Tracker)
사용법:
여러 주식에 걸친 P&L(Profit and Loss)을 추적합니다.
import json
from datetime import date
timedef track_portfolio():
portfolio = { "RELIANCE": {"qty": 10, "buy_price": 2800}, "TCS": {"qty": 5, "buy_price": 4200}, "INFY": {"qty": 20, "buy_price": 1600} }
total_pnl = 0
print("PORTFOLIO TRACKER")
print("="*50)
for stock, data in portfolio.items():
live_price = 2900
pnl = (live_price - data['buy_price']) * data['qty']
pnl_pct = (live_price - data['buy_price']) / data['buy_price'] * 100
total_pnl += pnl
print(f"{stock}:")
print(f" Qty: {data['qty']}, Buy: {data['buy_price']}, Live: {live_price}")
print(f" P&L: ₹{pnl:.0f} ({pnl_pct:.1f}%%)")
print("="*50)
print(f"Total P&L: ₹{total_pnl:.0f}")
track_portfolio()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
필요한 이유: Excel은 느립니다. Python은 즉각적입니다. 하나의 스크립트로 50개 주식을 추적하세요.
스크립트 9: 뉴스 감성 분석기 (News Sentiment Analyzer)
사용법:
시장 뉴스가 강세(bullish)인지 약세(bearish)인지 확인합니다.
분석기 (News Sentiment Analyzer)
사용법:
시장 뉴스가 강세(bullish)인지 약세(bearish)인지 확인합니다.
pythonimport urllib.request, jsondef analyze_sentiment(): # Fetch Google News RSS for NSE url = "https://news.google.com/rss/search?q=NSE+market&hl=en-IN&gl=IN&ceid=IN:en" req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"}) r = urllib.request.urlopen(req, timeout=10) # Simple keyword-based sentiment bullish_words = ['surge', 'rally', 'gain', 'up', 'bullish', 'positive'] bearish_words = ['fall', 'drop', 'loss', 'down', 'bearish', 'negative'] bullish_count = 0 bearish_count = 0 # Count keywords (simplified) content = r.read().decode() for word in bullish_words: bullish_count += content.lower().count(word) for word in bearish_words: bearish_count += content.lower().count(word) if bullish_count > bearish_count: sentiment = "BULLISH" elif bearish_count > bullish_count: sentiment = "BEARISH" else: sentiment = "NEUTRAL" print(f"Market Sentiment: {sentiment}") print(f"Bullish: {bullish_count}, Bearish: {bearish_count}")analyze_sentiment()
필요한 이유: 뉴스는 시장을 움직입니다. 거래하기 전에 심리를 파악하세요.
스크립트 10: 자동 보고서 생성기 (Auto-Report Generator)
사용법:
매일의 트레이딩 보고서를 자동으로 생성합니다.
`pythonfrom datetime import datetimedef generate_daily_report(): report = f"""DAILY TRADING REPORT - {da"