Files
kis_trader/scripts/_diag_mom_tick_today.py
Your Name fc27e726f9 feat: 새로운 안전 규칙 및 최적화 적용을 통한 트레이딩 시스템 개선
변경 사항 (Changes):

구문 오류(Syntax error) 및 토큰 낭비를 방지하기 위해 에이전트 쉘(Agent shell)과 파이썬 코드 스니펫에 다수의 신규 안전 규칙(Safety rules)을 추가함.

스키마 검증 및 적절한 SQL 포맷팅을 보장하기 위해 임시(Ad-hoc) 데이터베이스 쿼리 작성 가이드라인을 도입함.

코드 수정 후 UI 기능이 정상 작동하는지 확인하기 위해, 백테스트 웹 서비스 재시작 및 브라우저 검증에 대한 새로운 규칙을 구현함.

시스템 전반의 무결성(Integrity)을 유지하기 위해 실전 매매(Live trading), 웹 백테스팅, 파라미터 탐색(Parameter searches) 간의 일관성 검사(Consistency checks) 체계를 확립함.

기대 효과 (Impact):

이러한 개선 사항들은 트레이딩 시스템의 견고성(Robustness)과 신뢰성을 향상시키며, 에러 발생을 최소화하고 다양한 시스템 컴포넌트 간의 원활한 상호작용을 보장함.
2026-07-17 01:09:09 +09:00

100 lines
3.3 KiB
Python

#!/usr/bin/env python3
"""오늘 모멘텀 거래종목 vs 유니버스 틱 커버 진단 (adhoc)."""
from __future__ import annotations
from database import TradeDB
DAY = "20260713"
CODES = ["475150", "039340", "241710"]
TRADE_MINS = [
"202607130930",
"202607130931",
"202607130943",
"202607130944",
"202607130952",
"202607130953",
"202607130959",
"202607131014",
"202607131019",
"202607131020",
"202607131026",
"202607131027",
"202607131032",
"202607131033",
"202607131036",
"202607131038",
"202607131101",
"202607131102",
"202607131116",
"202607131118",
]
def main() -> None:
db = TradeDB()
try:
cols = [r["Field"] for r in db.conn.execute("SHOW COLUMNS FROM ws_ticks").fetchall()]
print("ws_ticks sample cols:", cols[:12])
for code in CODES:
rows = db.conn.execute(
"SELECT COUNT(*) n, MIN(tick_time) mn, MAX(tick_time) mx "
"FROM ws_ticks WHERE code=%s AND tick_time LIKE %s",
(code, DAY + "%"),
).fetchone()
print(f"ticks {code}: n={rows['n']} range={rows['mn']}~{rows['mx']}")
sk = db.conn.execute(
"SELECT LEFT(tick_time,12) m, COUNT(*) n FROM ws_ticks "
"WHERE code=%s AND tick_time >= %s AND tick_time <= %s "
"GROUP BY LEFT(tick_time,12) ORDER BY m",
("475150", DAY + "090000", DAY + "113059"),
).fetchall()
have = {r["m"]: int(r["n"]) for r in sk}
print(f"SK minutes with ticks 09:00-11:30: {len(have)}")
print("trade-related minutes tick count:")
for m in TRADE_MINS:
print(f" {m[8:]} n={have.get(m, 0)}")
nc = db.conn.execute(
"SELECT COUNT(DISTINCT code) c FROM ws_ticks WHERE tick_time LIKE %s",
(DAY + "%",),
).fetchone()
print("distinct codes with ticks today:", nc["c"])
try:
cc = db.conn.execute(
"SELECT COUNT(DISTINCT code) c FROM ws_candles "
"WHERE candle_time LIKE %s AND timeframe=%s",
(DAY + "%", 1),
).fetchone()
print("distinct codes with 1m candles today:", cc["c"])
except Exception as e:
print("candles query skip:", e)
# 30% coverage 의미: 유니버스 전종목 전분봉 중 틱 있는 분 비율
# 거래 3종만 보면?
for code in CODES:
bars = db.conn.execute(
"SELECT COUNT(DISTINCT LEFT(candle_time,12)) n FROM ws_candles "
"WHERE code=%s AND candle_time LIKE %s AND timeframe=%s "
"AND LEFT(candle_time,12) BETWEEN %s AND %s",
(code, DAY + "%", 1, DAY + "0900", DAY + "1530"),
).fetchone()
tmin = db.conn.execute(
"SELECT COUNT(DISTINCT LEFT(tick_time,12)) n FROM ws_ticks "
"WHERE code=%s AND tick_time LIKE %s "
"AND LEFT(tick_time,12) BETWEEN %s AND %s",
(code, DAY + "%", DAY + "0900", DAY + "1530"),
).fetchone()
bn = int(bars["n"] or 0)
tn = int(tmin["n"] or 0)
pct = (100.0 * tn / bn) if bn else 0.0
print(f"cover {code}: tick_mins={tn} candle_mins={bn} pct={pct:.1f}%")
finally:
db.close()
if __name__ == "__main__":
main()