변경 사항 (Changes): 구문 오류(Syntax error) 및 토큰 낭비를 방지하기 위해 에이전트 쉘(Agent shell)과 파이썬 코드 스니펫에 다수의 신규 안전 규칙(Safety rules)을 추가함. 스키마 검증 및 적절한 SQL 포맷팅을 보장하기 위해 임시(Ad-hoc) 데이터베이스 쿼리 작성 가이드라인을 도입함. 코드 수정 후 UI 기능이 정상 작동하는지 확인하기 위해, 백테스트 웹 서비스 재시작 및 브라우저 검증에 대한 새로운 규칙을 구현함. 시스템 전반의 무결성(Integrity)을 유지하기 위해 실전 매매(Live trading), 웹 백테스팅, 파라미터 탐색(Parameter searches) 간의 일관성 검사(Consistency checks) 체계를 확립함. 기대 효과 (Impact): 이러한 개선 사항들은 트레이딩 시스템의 견고성(Robustness)과 신뢰성을 향상시키며, 에러 발생을 최소화하고 다양한 시스템 컴포넌트 간의 원활한 상호작용을 보장함.
100 lines
3.3 KiB
Python
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()
|