feat(tests): 신규 키움 웹소켓 조건검색 및 실시간 조건검색 테스트 추가

변경 사항
----
- _test_kiwoom_condition_list.py: 키움 웹소켓 조건검색 '목록조회' 기능을 단독으로 테스트하는 스크립트 추가
- _test_kiwoom_condition_realtime.py: 'momentum' 조건식을 실시간으로 등록하고 초기 매칭 종목 리스트 및 실시간 편입/이탈을 수신하는 테스트 스크립트 추가
- _verify_columnar_bitid.py, _verify_shared_e2e_breakout.py, _verify_shared_e2e.py: 공유 메모리 및 dict 간의 데이터 일관성을 검증하는 테스트 추가

영향
----
- 신규 테스트 스크립트 추가로 키움 웹소켓 API의 기능 검증 및 안정성을 높임
- 기존 기능에 대한 영향 없음

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-06 01:27:00 +09:00
parent d8ba01afa4
commit 61c72a8a4c
171 changed files with 176914 additions and 7329 deletions

View File

@@ -71,15 +71,40 @@ STRATEGY_SCALP_ENABLED=true STRATEGY_SHORT_ENABLED=false python -m kis_trader.ma
STRATEGY_SCALP_ENABLED=false STRATEGY_SHORT_ENABLED=true python -m kis_trader.main
```
## DB 설정 테이블 (2026-05 분리)
| 테이블 | 내용 |
|--------|------|
| `env_config` | 공통 — KIS/키움 API, MM, WS, 전략 ON/OFF, 수수료, `SLOT_MONEY_DEFAULT` 등 |
| `config_scalp` | 스캘핑 `SCALP_*` |
| `config_short` | 꼬리 `SHORT_*` / `TAIL_*` / `SHOULDER_*` / 익절 호가 `SELL_ORDERBOOK_*` |
| `config_momentum` | 모멘텀 `MOMENTUM_*` |
| `config_breakout` | 돌파 `BREAKOUT_*` |
| `config_updow` | 하락매수 `UPDOW_*` |
- 코드는 `get_latest_env()` / `get_env_from_db()`**병합 flat dict** 를 그대로 씁니다 (하위 호환).
- 최초 분리·재마이그레이션: `python3 -m kis_trader.scripts.migrate_split_env_config`
- 키 분류 규칙: 프로젝트 루트 `config_schema.py`
## 주요 환경변수
이름 | 기본 | 설명
-- | -- | --
`STRATEGY_SCALP_ENABLED` | `true` | 스캘핑 전략 활성화
`STRATEGY_SHORT_ENABLED` | `true` | 꼬리잡기 전략 활성화
`STRATEGY_SAME_CODE_POLICY` | `block` | 같은 종목을 다른 전략이 이미 보유 중일 때 `block`(차단) / `allow`(허용)
`REAL_BALANCE_VERIFY_BEFORE_BUY` | `true` | 매수 전 실 잔고 재조회
`STRATEGY_SAME_CODE_POLICY` | `allow` | 같은 종목을 다른 전략이 `active_trades`에 있어도 `allow`(허용) / `block`(차단)
`REAL_BALANCE_VERIFY_BEFORE_BUY` | `false` | `false`=타 전략·수동 보유 있어도 매수 가능 / `true`+`MODE=strategy`면 동일 전략 DB만 차단
`REAL_BALANCE_VERIFY_BEFORE_BUY_MODE` | `strategy` | `strategy` \| `global`(실계좌 1주라도 있으면 매수 차단, 레거시)
`REAL_BALANCE_VERIFY_BEFORE_SELL` | `true` | 매도 전 실 잔고 재조회 (0주면 active_trades 정리)
`ORDER_CASH_PCT` | `0.95` | 예수금 부족 시에만 가용금×N%÷MAX_STOCKS 로 qty 축소 (기존 산식 우선)
`ORDER_CASH_FEE_BUFFER` | `1.01` | 주문금액 대비 수수료 여유 (1.01=1%)
`ORDER_CASH_DIVIDE_BY_MAX_STOCKS` | `1` | 1=종목당 예수금÷MAX_STOCKS, 0=나누지 않음
`ACCOUNT_CASH_PERSIST_SEC` | `60` | 예수금 캐시 kv_store 저장 주기(체결 시 즉시 저장)
`SCALP_LIVE_BACKTEST_ALIGN` | `true` | 스캘핑: 신호봉(직전 확정) → 진입봉(현재 확정)=백테 다음봉 시가
`SHORT_LIVE_BACKTEST_ALIGN` | `true` | 꼬리(3분): 동일 패턴
`MOMENTUM_LIVE_BACKTEST_ALIGN` | `true` | 모멘텀(1분): 동일 패턴
`BREAKOUT_LIVE_BACKTEST_ALIGN` | `true` | 돌파(1분): 동일 + 진입가 진입봉 시가 우선
`*_LIVE_SIGNAL_LOOKBACK_BARS` | `1` | 직전 N개 신호봉까지 소급 검사
`MAX_STOCKS` | `3` | 전략당 동시 보유 최대 종목 수
`REENTRY_COOLDOWN_SEC` | `300` | 매도 후 같은 종목 재진입 쿨다운(초)
`WS_TIMEFRAMES` | `1,3,15,60` | WS 봉 집계 타임프레임(분)
@@ -103,8 +128,14 @@ STRATEGY_SCALP_ENABLED=false STRATEGY_SHORT_ENABLED=true python -m kis_trader.ma
python -m kis_trader.backtest.backtest_web
```
엔진(`scalping_engine.py`, `tail_engine.py`) 자체를 공유하므로 백테스트와 실매매
신호는 100% 동일 로직이다.
엔진별로 백테·실매가 동일 함수를 호출한다 (체결·유니버스는 별도).
| 전략 | 엔진 | 청산 |
|------|------|------|
| SCALP reversal | `scalping_engine` | 어깨 → 익절 → 손절 |
| MOMENTUM | `momentum_engine` | 어깨·트레일 → 손절 → tp_max 상한 |
| SHORT(꼬리) | `tail_engine` | ATR·어깨·EOD |
| BREAKOUT | `breakout.py` | 익절 우선 (돌파 전용) |
## 주의사항