Files
kis_bot/update_env_simple.py
2026-03-17 12:33:30 +09:00

213 lines
12 KiB
Python

#!/usr/bin/env python3
"""
환경변수 DB 업데이트 스크립트 (간단 버전)
- 딕셔너리로 직접 값을 넣어서 업데이트
"""
import sys
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(SCRIPT_DIR))
from database import TradeDB
def update_env(updates):
"""
환경변수 업데이트
Args:
updates: 업데이트할 환경변수 딕셔너리
예: {
"KIS_APP_KEY": "your_app_key",
"KIS_APP_SECRET": "your_app_secret",
"MM_BOT_TOKEN_": "your_token",
...
}
"""
db_path = SCRIPT_DIR / "quant_bot.db"
db = TradeDB(db_path=str(db_path))
# 기존 최신 설정 불러오기
latest = db.get_latest_env()
if latest and latest.get("snapshot"):
current = latest["snapshot"]
print(f"📋 기존 설정 불러옴 (ID: {latest['id']})")
else:
current = {}
print("⚠️ 기존 설정 없음 - 새로 생성")
# 기존 값과 병합
new_snapshot = {**current, **updates}
# 새 스냅샷 저장
env_id = db.insert_env_snapshot(new_snapshot)
if env_id:
print(f"✅ 환경변수 저장 완료! (새 스냅샷 ID: {env_id})")
print(f" 업데이트된 키: {', '.join(updates.keys())}")
else:
print("❌ 저장 실패!")
db.close()
return env_id
if __name__ == "__main__":
# 여기에 업데이트할 값들을 딕셔너리로 넣으세요
my_updates = {
# 한투 API 설정
#"KIS_MOCK": "true",
#"KIS_APP_KEY_REAL": "PSUT2l4CO94DjrwDa2EAnEl639YXnWHdbbkN", # 여기에 앱키 입력
#"KIS_APP_SECRET_REAL": "2SkPBKrztpBomcR+pYNEBuVa5/iSqYLQxsDn/YqJuQ0dULp/GqTAePhe4czJHuf/1XBUd18KDV6ZTrmxfI8eTiCfIEaO6jMKSq0u+CoUkHTrO9TfliYtxsNbl43jL+rokLB54V2VmHrlqM4WCF+54bMWhzzSE7z3OOl67V9yWKCWIoTrcYg=",
#"KIS_APP_KEY_MOCK": "PSdfKtsMihgC9tLiUr2XISscuR3fHxl6kvmV", # 여기에 앱키 입력`
# 리스크매니저: 종목당 원화 상한(50만) + 종목당 최대 비중(1.5%)
# "SLOT_BASE_AMOUNT_CAP": "500000",
# "MAX_POSITION_PCT": "0.05",
#"KIS_APP_SECRET_MOCK": "Ip+XZrZcoz11thgDD40XS8i6R1AalYkKFZwg2w8+ZMulVKN8rJVXiqGONxc4EYxw1S3TgOcx7fSldDc6EGq63bprfbgHwKfalse29Zm "USE_MARKET_IOC": "false",ovmza9+Ylqd8/EtjFGNmhQHWocyTAm8kdp5IG6tFtc=", # 여기에 앱시크릿 입력
# "FORCE_BUY_TEST": "false",
# "USE_MARKET_IOC": "false",
# "KIS_ACCOUNT_NO_REAL": "44030801",
# "KIS_ACCOUNT_NO_MOCK": "50166974",
# "KIS_ACCOUNT_NO_MOCK": "44030801",
# "KIS_ACCOUNT_NO_MOCK": "50169256",
# "KIS_ACCOUNT_CODE_REAL": "01",
# "KIS_ACCOUNT_CODE_MOCK": "01",
#"MM_BOT_TOKEN_": "5o4bfsqo97dedyq7599wz6joie",
#"TAKE_PROFIT_PCT_LONG": "0.010",
#"MIN_DROP_RATE": "0.015",
#"MIN_RECOVERY_RATIO": 0.35,
#"MIN_DROP_RATE": 0.02
# "TAIL_RATIO_MIN": "0.85",
#"TAIL_PCT_MIN": "0.002"
# "TAKE_PROFIT_PCT":"0.012",
# "SHOULDER_CUT_PCT":"0.009",
# "MIN_RECOVERY_RATIO":"0.5",
# "MIN_RECOVERY_RATIO_SHORT" : "0.10",
# "MIN_DROP_RATE":"0.003",
# "SHOULDER_CUT_PCT":"0.012",
# "TAKE_PROFIT_PCT":"0.018",
# "SHOULDER_MIN_HIGH_PCT":"0.2",
# "MIN DROP_RATE":"0.015"
# "STOP_LOSS_PCT":"0.007",
# "MIN_DROP_RATE":"0.008",
# "MIN_RECOVERY_RATIO_SHORT":"0.30",
# "SHOULDER_MIN_HIGH_PCT":"0.2",
# "MAX_LOSS_PER_TRADE_KRW":"150000",
# # STOP_LOSS_PCT를 음수로 사용하면 '손실일 때만' 칼손절이 걸립니다.
# # 예: -0.007 → 수익 구간(+0.x%)에서는 칼손절이 아니라 다른 익절/보호 로직이 우선 적용되고,
# # 손실이 -0.7% 이하로 커졌을 때만 profit_pct <= STOP_LOSS_PCT 조건이 발동합니다.
# "STOP_LOSS_PCT":"-0.007",
# "TAIL_RATIO_MIN":"0.8",
# "SHOULDER_CUT_PCT":"0.018",
# # 작은수익보호 완화: 고점이 매수가 대비 1.2% 이상 올랐을 때만,
# # 현재가가 매수가 대비 +0.05% 이하로 되밀리면 보호 매도.
# # (이전 기본: 고점 +0.5% / 현재가 +0.15% → 너무 빨리 잘려 나가던 구간을 완화)
# "QUICK_PROFIT_PROTECT_HOURS":"0.5",
# "QUICK_PROFIT_MAX_RATIO":"1.012",
# "QUICK_PROFIT_CURRENT_MIN":"1.0005"
# "ANTHROPIC_API_KEY":"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"
# "KIS_WS_URL_REAL":"ws://ops.koreainvestment.com:21000",
# "KIS_WS_URL_MOCK":"ws://ops.koreainvestment.com:31000",
# "KIS_WS_MOCK_ENABLED":"true",
# "REENTRY_COOLDOWN_SEC":"300",
# "SELL_FAILURE_BACKOFF_SEC":"1800",
# "LONG_NEWS_ENABLED":"true",
# "SCALP_ATR_UP_MULT": "2.0",
# "SCALP_ATR_DOWN_MULT": "0.8",
# "SCALP_ATR_DROP_MULT": "1.5",
# ── 스캘핑봇 전용 ──────────────────────────────────────────────
# "SCALP_RSI_OVERSOLD": "25.0", # 과매도 임계값 (기본 25)
# "SCALP_RSI_OVERBOUGHT": "75.0", # 과매수 진입 금지 임계값
# "SCALP_CANDLE_TIMEFRAME": "1", # 봉 단위(분): 1 또는 3 권장
# "SCALP_MARKET_OPEN_WAIT_MIN": "5", # 장 시작 후 대기(분)
# "SCALP_GAP_FILL_LIMIT": "100", # WS 재접속 후 갭보정 캔들 수
# "SCALP_MIN_VOLUME": "1000", # 봉당 최소 거래량
# "KIS_SCALP_MM_CHANNEL": "kis-scalping", # 스캘핑봇 MM 채널
# "SCALP_CANDLE_KEEP_DAYS": "3", # ws_candles 보존 일수
# ── 스캘핑 전용 손익절/낙폭 (꼬리잡기와 완전 분리) ──────────────
# 1분봉 초단타: 손절-4%/익절+5%는 도달 불가 → 박리다매로 빠르게 끊어냄
# SCALP_STOP_LOSS_PCT : 손절 % (양수 입력, 기본 1.5%)
# SCALP_TAKE_PROFIT_PCT: 익절 % (양수 입력, 기본 1.5%)
# SCALP_MIN_DROP_RATE : 당일 낙폭 필터 % (기본 1.5%, 꼬리잡기 3%보다 완화)
# "SCALP_STOP_LOSS_PCT": "0.015", # 1.5% 손절
# "SCALP_TAKE_PROFIT_PCT": "0.015", # 1.5% 익절
# "SCALP_MIN_DROP_RATE": "0.015", # 1.5% 낙폭 이상만 진입
# ── 단타봇(kis_short_ver2) 전용 ────────────────────────────────
# "USE_KELLY_FORMULA": "true", # 켈리 공식 사용 여부
# "KELLY_MULTIPLIER": "0.25", # 켈리 25% (보수적)
# "USE_MARKET_IOC": "true", # 시장가 IOC 주문
# "KIS_PRICE_CACHE_TTL_SEC": "1.0", # 실시간 가격 캐시 유효기간(초)
# "SHORT_GAP_FILL_LIMIT": "100", # 갭보정 분봉 캔들 수
# "MIN_HOLD_AFTER_BUY_SEC": "30.0", # 매수 직후 최소 보유(초)
# "MIN_HOLD_HOURS": "24.0", # 최소 보유(시간)
# "MAX_RECOVERY_RATIO_3M": "0.8", # 3개월 회복 80% 이하만 편입
# "CANDIDATE_LIST_TOP_N_LIGHT": "20", # 1차 경량 체크 상위 N개
# "SCAN_UNIVERSE_MAX_CODES": "150", # 유니버스 최대 종목 수
# "TAIL_CANDLE_LOOKBACK": "5", # 꼬리 패턴 인식 lookback 봉수
# ── 공통 자산/슬롯 ───────────────────────────────────────────────
# "TOTAL_DEPOSIT": "500000000", # 총 입금액 (원) → 누적손익% 계산에 사용
# "SLOT_MONEY_DEFAULT": "300000", # 슬롯당 기본 투자금 (원)
# "ROUND_TRIP_COST_PCT": "0.003", # 왕복 수수료 0.3%
# "POP_NET_PCT": "0.005", # 익절 보호 0.5%
# "LOCK_NET_PCT": "0.010", # 잠금 수익 1.0%
# ── mm_butler / AI ──────────────────────────────────────────────
# "GEMINI_MODEL_ID": "gemini-2.5-flash", # Gemini 모델 ID
# "MM_BUTLER_POLL_SEC": "15", # MM 폴링 주기(초)
# "AI_SOURCE_MAX_CHARS": "120000", # AI 입력 최대 문자 수
# ── 유니버스 스캐너 ─────────────────────────────────────────────
# "UPDATE_UNIVERSE_TOP_N": "20", # 저장할 상위 N개
# "UPDATE_UNIVERSE_MIN_SCORE": "4.0", # 최소 강도 점수
# "SCAN_INTERVAL_SEC": "300", # 스캔 주기(초)
# ── 수수료·거래세 (전략 공통) ────────────────────────────────────
# 위탁수수료: 매수·매도 각각 0.015% (KIS 온라인 기본)
# 증권거래세: 2025년 기준 코스피·코스닥 공통 0.18% (매도 시만 부과)
# 왕복 총비용 = 0.015%(매수) + 0.015%(매도) + 0.18%(거래세) = 약 0.21%
"FEE_RATE_PCT": "0.015",
"SELL_TAX_RATE_PCT": "0.18",
# ── 스캘핑 본절 방어 ─────────────────────────────────────────────
# 트레일링 발동 최소 수익률(%): 고점이 매수가 대비 이만큼 올라야 트레일링 활성화
# 수수료(~0.21%) + 마진(0.2%) + 트레일링폭(0.8%) = 최소 1.2% 이상 권장
"SCALP_TRAIL_TRIGGER_PCT": "1.5",
# 본절사수 시 최소 순이익(%): 수수료+세금 위에 추가 확보 (0이면 본절, 0.2면 +0.2%)
"SCALP_MIN_PROFIT_PCT": "0.2",
# 스캘핑 전용 재진입 쿨다운(초): 매도 후 같은 종목 N초 동안 재매수 차단 (600=10분, 백테스트 cooldown_min과 동일하게)
"SCALP_COOLDOWN_SEC": "600",
# 키움증권 REST API 키 — 실전/모의 분리 (KIS_MOCK 설정에 따라 자동 선택)
"KIWOOM_APP_KEY_REAL": "2HX8cA7AkrZsF7zBrMQXbFASvkKOkHtxh4-eia56hjo",
"KIWOOM_APP_SECRET_REAL": "XaNENlYjQrwhT18h-EwKGonq-R4PpW-sT7s_-F9q3Nk",
# 모의 키가 있으면 아래 주석 해제 후 입력
# "KIWOOM_APP_KEY_MOCK": "모의앱키입력",
# "KIWOOM_APP_SECRET_MOCK": "모의시크릿입력",
# 레거시 키 (이전 버전 호환, REAL/MOCK 키 없을 때 폴백)
"KIWOOM_APP_KEY": "2HX8cA7AkrZsF7zBrMQXbFASvkKOkHtxh4-eia56hjo",
"KIWOOM_APP_SECRET": "XaNENlYjQrwhT18h-EwKGonq-R4PpW-sT7s_-F9q3Nk",
# ── 영구 구독 ETF (시장 방향 필터) ────────────────────────────────
# 스캘핑/꼬리잡기 봇이 이 ETF를 항상 구독 → 60분봉 RSI로 상승장/하락장 판단
# KODEX200(069500) = 코스피 대표, KODEX KOSDAQ150(229200) = 코스닥 대표
# 콤마 구분, 추가하려면 섹터 ETF 코드도 넣으면 됨 (예: 반도체 ETF 091160)
"PERMANENT_WS_CODES": "069500,229200",
}
if not my_updates:
print("⚠️ 업데이트할 값이 없습니다.")
print(" update_env_simple.py 파일을 열어서 my_updates 딕셔너리에 값을 입력하세요.")
sys.exit(1)
update_env(my_updates)