Files
kis_trader/docs/옵투나.md
Your Name 36a3e2b4a1 feat: Enhance trading system with new permanent subscription features and order book management
Changes:
- Added a new API endpoint for managing permanent subscriptions, allowing users to enable or disable subscriptions dynamically.
- Implemented a function to fill candle data from Kiwoom, ensuring that only relevant data is inserted into the database.
- Introduced a mechanism to handle master subscription states, improving the management of subscription statuses.
- Updated the database schema to include new fields for managing subscription states and order book filtering.

Impact:
- These enhancements improve the flexibility and reliability of the trading system, allowing for better management of subscriptions and order book data, while reducing the risk of data inconsistencies.

히스토리 align 제거 븅신같은 초기설계 아예 제거
진입모드에 구멍메움
호가진입을 켜도 호가가 안들어올때 호가 안보고 그냥 사버림
2026-08-15 23:01:14 +09:00

85 lines
3.5 KiB
Markdown

# Optuna 파라미터 탐색 및 호가 수급 최적화 구조 가이드 (옵투나.md)
이 문서는 백테스트 웹·CLI의 **Optuna 2단계**와, 호가 후처리 격자·적용 분리를 정리한다.
관련: `docs/호가.md` §8 · `kis_trader/backtest/optuna_postprocess_topn.py` · `optuna_orderbook_recommend.py` · `optuna_rerun_postprocess.py`
최종 갱신: 2026-08-15
---
## 1. 투-스테이지
```
Stage 1 캔들 TPE (param_search_optuna.py)
RSI·손익·트레일 등 차트 축. 호가 ON/OFF는 넣지 않음.
Stage 2 후처리 (attach_topn_postprocess)
gated TopN(+mode/live) 체결을 호가 스냅으로 재생.
진입 스프/잔량/매도벽 · EXIT_OB · STOP_OB · 휩쏘.
```
Stage 2는 **이미 난 체결 + 근처 `ws_orderbook`/`ls_ws_orderbook`**.
실매 “호가 RAM 없음 → 필터 ON인데 통과” 는 `WS_ORDERBOOK_FILTER_REJECT_IF_EMPTY`(기본 true) + `WS_ORDERBOOK_FILTER_MAX_AGE_SEC` (B안, `docs/호가.md`). 1과목 차트 TPE와 별개.
구 JSON만 Stage 2 다시:
```bash
python3 -u kis_trader/backtest/optuna_rerun_postprocess.py \
--result-json kis_trader/backtest/results/optuna_<전략>_tpe_<TS>.json
# --apply-best 없음. 실매 DB 안 바뀜.
```
웹 Optuna 버튼도 완료 시 후처리를 붙인다 (`optuna_postprocess_topn`).
`orderbook_recommend` 블록 + `postprocess_topn` 이 JSON에 실림.
---
## 2. 진입 후처리 격자 (env_config_ext)
`ensure_optuna_gate_env_defaults``OPTUNA_OB_*`.
`OPTUNA_OB_AXIS_TRIALS=0` 이면 `OPTUNA_OB_RECOMMEND_TRIALS`(기본 1000)/축.
| 키 | 널널 검사 기본 (2026-08-15) |
|----|------------------------------|
| `OPTUNA_OB_ENTRY_SPREAD_MIN` / `MAX` | 0.1 ~ 8.0 |
| `OPTUNA_OB_ENTRY_RATIO_MIN` / `MAX` | 0.05 ~ 1.5 |
| `OPTUNA_OB_ENTRY_ASK_MULT_MIN` / `MAX` | 1.0 ~ 80.0 (매도벽, L3 `ask_qty_l3`) |
| `OPTUNA_OB_LOOKBACK_MIN` | 30 (분) |
잔여 체결 &lt; 원본 **30%** → trial 무효. 너무 센 컷은 고르지 못하게 하는 가드.
결과는 `orderbook_filter_enabled=True` 고정(후처리가 “끌지”를 탐색하지 않음).
apply 패치에 벽이 있으면 `{전략}_ORDERBOOK_ENTRY_ASK_MAX_MULT`.
---
## 3. 꼬리 TPE 진입모드 (웹 체크)
엔진 실매 기본은 `TAIL_ENTRY_MODE`**`limit_atr`** (`limit_entry_common.short_entry_mode`).
웹 꼬리 탭 셀렉트 기본도 limit_atr. **Optuna TPE는 예외: 진입을 탐색하지 않고 스터디마다 고정.** 예전 코드는 **`align` 하드코딩**.
웹 Optuna 탭: **align** / **limit_atr** 체크.
- 기본: align만 (기존 TPE와 동일).
- 둘 다: **스터디 2개 순차** (한 TPE에 categorical 혼입 없음). `--apply-best` 없음.
CLI: `--entry-mode align|limit_atr` · 순차 스크립트 `TAIL_OPTUNA_ENTRY_MODES="align limit_atr"`.
---
## 4. 실매 DB 적용 분리
| 구분 | 차트 캔들 | 호가 후처리 숫자 |
|------|-----------|------------------|
| `--apply-best` (기본 미사용) | 차트 축 | 호가 합의 **자동 각인 아님** |
| 웹 Optuna 「적용」 `upto` | 차트 + 선택 시 entry/exit/stop (`build_upto_env_patch`) | `upto=entry` 이상이면 호가 패치가 **들어갈 수 있음** |
| 전용 스크립트 | — | `scripts/apply_optuna_ob_consensus.py --strategy MOMENTUM` |
후처리 **재실행만** 하면 JSON만 갱신. DB는 안 바뀜. 1일 best는 과적합 가능.
---
## 5. 웹 표기
`out_data["orderbook_recommend"]` · `postprocess_topn.postprocess_by_anchor`.
진입 합의 예: `orderbook_max_spread_pct` / `orderbook_min_bid_ask_ratio` / `orderbook_entry_ask_max_mult`.