# kis_bot 코드 아키텍처 & 의존성 맵 > **자동 생성 문서** — AST 기반 import 정적 분석 결과 > DB 스키마는 [db_erd.md](./db_erd.md) 를 함께 참조하세요. --- ## 📊 프로젝트 통계 | 항목 | 값 | |------|-----| | 총 Python 파일 수 | **372** 개 | | 총 코드 라인 수 | **164,876** 줄 | | DB 테이블 수 | **50** 개 (→ [db_erd.md](./db_erd.md)) | | DB 참조 파일 수 | **94** 개 | ### 주요 외부 라이브러리 의존성 | 라이브러리 | 사용 파일 수 | |------------|------------| | `utils` | 78 | | `kiwoom_rest_api` | 67 | | `PySide2` | 52 | | `tr` | 52 | | `argparse` | 50 | | `requests` | 32 | | `engine` | 26 | | `optuna` | 20 | | `dotenv` | 19 | | `pandas` | 18 | | `pythoncom` | 16 | | `win32com` | 16 | | `websocket` | 13 | | `asyncio` | 13 | | `google` | 11 | | `ws` | 11 | | `holding_bot` | 10 | | `signal` | 10 | | `base` | 10 | | `atexit` | 9 | --- ## 🏗️ 레이어 아키텍처 (계층도) ```mermaid graph TD subgraph "🏠 진입점 (Entry Points)" A[holding_bot.py] A2[scalping_bot.py] A3[momentum_bot.py] end subgraph "⚙️ 전략 엔진 (kis_trader/engine)" B[momentum_engine.py] B2[tail_engine.py] B3[scalping_engine.py] B4[momentum_hts_logic.py] end subgraph "🔬 백테스트 (kis_trader/backtest)" C[momentum_backtest_common.py] C2[param_search_momentum.py] C3[optuna_momentum.py] C4[bt_candle_source.py] end subgraph "🗄️ 데이터 레이어" D[(kis_quant_db)] D2[database.py] D3[kis_trader/utils/env.py] end subgraph "📡 실시간 데이터" E[ws_candles] E2[ws_ticks] E3[ls_ws_*] end A --> B A2 --> B3 B --> B4 B --> C C2 --> C3 C --> C4 C --> D2 B --> D2 D2 --> D D3 --> D2 D --> E D --> E2 ``` --- ## 🔗 핵심 허브 파일 (많이 import 되는 모듈 Top 20) > 이 파일들을 수정할 때 가장 많은 사이드 이펙트가 발생합니다. | 순위 | 모듈 | 의존하는 파일 수 | 주요 의존자 | |------|------|-----------------|------------| | 1 | `database` | 97 | `_test_ls_condition_realtime.py`, `_verify_shared_e2e.py`, `_verify_shared_e2e_breakout.py` 외 94개 | | 2 | `kis_trader.utils.env` | 89 | `_test_kiwoom_condition_list.py`, `_test_kiwoom_condition_realtime.py`, `_test_ls_condition_realtime.py` 외 86개 | | 3 | `kis_trader.backtest` | 31 | `_verify_shared_e2e.py`, `_verify_shared_e2e_breakout.py`, `backtest_web.py` 외 28개 | | 4 | `kis_trader.backtest.backtest_portfolio_common` | 31 | `backtest_web.py`, `breakout_backtest_common.py`, `breakout_portfolio_backtest.py` 외 28개 | | 5 | `kis_trader.engine` | 26 | `backtest_web.py`, `diag_backtest_4_30.py`, `dart_backtest_common.py` 외 23개 | | 6 | `kis_trader.backtest.shared_ticks` | 17 | `_verify_columnar_bitid.py`, `_verify_shared_e2e.py`, `_verify_shared_e2e_breakout.py` 외 14개 | | 7 | `kis_trader.ws.kis_ws` | 15 | `_test_kiwoom_condition_list.py`, `_test_kiwoom_condition_realtime.py`, `etf_ver1.py` 외 12개 | | 8 | `kis_trader.utils.trade_time` | 14 | `backtest_web.py`, `backtest_portfolio_common.py`, `dbband_backtest_common.py` 외 11개 | | 9 | `kis_trader.engine.indicator_cache` | 14 | `database.py`, `breakout_backtest_common.py`, `breakout_portfolio_backtest.py` 외 11개 | | 10 | `kis_trader.engine.tail_tick_replay` | 13 | `_verify_columnar_bitid.py`, `param_search_optuna.py`, `scalping_portfolio_backtest.py` 외 10개 | | 11 | `kis_trader.backtest.universe_history_source` | 13 | `backtest_web.py`, `breakout_backtest_common.py`, `momentum_backtest_common.py` 외 10개 | | 12 | `kis_trader.backtest.param_search_momentum` | 12 | `_verify_shared_e2e.py`, `backtest_web.py`, `diag_momentum_backtest.py` 외 9개 | | 13 | `kis_trader.backtest.breakout_tick_loader` | 12 | `_verify_shared_e2e_breakout.py`, `backtest_web.py`, `breakout_backtest_common.py` 외 9개 | | 14 | `kis_trader.backtest.backtest_env_timeline` | 12 | `backtest_web.py`, `breakout_backtest_common.py`, `breakout_portfolio_backtest.py` 외 9개 | | 15 | `kis_trader.database.db_manager` | 12 | `backtest_web.py`, `breakout_backtest_common.py`, `dbband_backtest_common.py` 외 9개 | | 16 | `kis_trader.engine.momentum_engine` | 12 | `backtest_web.py`, `backtest_env_timeline.py`, `momentum_backtest_common.py` 외 9개 | | 17 | `kis_trader.strategies.breakout` | 12 | `backtest_web.py`, `backtest_env_timeline.py`, `breakout_backtest_common.py` 외 9개 | | 18 | `kis_trader.backtest.trigger_snapshot_loader` | 12 | `backtest_portfolio_common.py`, `breakout_portfolio_backtest.py`, `momentum_portfolio_backtest.py` 외 9개 | | 19 | `kis_trader.utils.logger` | 12 | `breakout_backtest_common.py`, `ls_history_loaders.py`, `momentum_backtest_common.py` 외 9개 | | 20 | `kis_trader.backtest.optuna_common` | 12 | `optuna_breakout.py`, `optuna_dart.py`, `optuna_momentum.py` 외 9개 | --- ## 🗄️ DB 테이블 ↔ 코드 파일 연관 맵 > [db_erd.md](./db_erd.md) 의 각 테이블을 실제로 읽고/쓰는 파일 목록입니다. > DB 스키마를 변경하면 아래 파일들을 반드시 확인하세요. | DB 테이블 | 참조 파일들 | ERD 링크 | |-----------|------------|---------| | `active_trades` | `backtest_web.py`, `database.py`, `etf_ver1.py`, `holding_bot.py` 외 15개 | [ERD](./db_erd.md#active_trades) | | `active_trades_paper` | `backtest_web.py`, `us_momentum.py` | [ERD](./db_erd.md#active_trades_paper) | | `ai_analysis_log` | `database.py`, `mm_butler.py` | [ERD](./db_erd.md#ai_analysis_log) | | `buy_execution_log` | `database.py`, `kis_long_ver1.py` | [ERD](./db_erd.md#buy_execution_log) | | `config_breakout` | `backtest_web.py`, `database.py`, `param_search_breakout.py`, `apply_unified_risk_env.py` 외 2개 | [ERD](./db_erd.md#config_breakout) | | `config_dart` | `backtest_web.py`, `database.py` | [ERD](./db_erd.md#config_dart) | | `config_dbband` | `database.py`, `dbband_engine.py`, `prune_env_config_strategy_columns.py` | [ERD](./db_erd.md#config_dbband) | | `config_momentum` | `backtest_web.py`, `database.py`, `backtest_portfolio_common.py`, `param_search_momentum.py` 외 5개 | [ERD](./db_erd.md#config_momentum) | | `config_range_break` | `backtest_web.py`, `database.py`, `range_break_engine.py`, `prune_env_config_strategy_columns.py` | [ERD](./db_erd.md#config_range_break) | | `config_scalp` | `backtest_web.py`, `database.py`, `param_search_apply_snapshot.py`, `param_search_scalping.py` 외 5개 | [ERD](./db_erd.md#config_scalp) | | `config_short` | `backtest_web.py`, `database.py`, `tail_env_keys.py`, `apply_unified_risk_env.py` 외 3개 | [ERD](./db_erd.md#config_short) | | `config_updow` | `database.py`, `apply_unified_risk_env.py`, `migrate_split_env_config.py`, `prune_env_config_strategy_columns.py` | [ERD](./db_erd.md#config_updow) | | `config_us_momentum` | `database.py`, `optuna_momentum.py`, `param_search_momentum.py`, `prune_env_config_strategy_columns.py` | [ERD](./db_erd.md#config_us_momentum) | | `daily_summary` | `database.py` | [ERD](./db_erd.md#daily_summary) | | `dart_disclosures` | `backtest_web.py`, `database.py`, `dart_backtest_common.py`, `dart_engine.py` 외 1개 | [ERD](./db_erd.md#dart_disclosures) | | `dart_watchlist` | `backtest_web.py`, `database.py`, `dart_engine.py`, `dart_order_tracker.py` | [ERD](./db_erd.md#dart_watchlist) | | `env_config` | `_test_ls_condition_realtime.py`, `backtest_web.py`, `check_account_config.py`, `copy_env_row_to_latest.py` 외 48개 | [ERD](./db_erd.md#env_config) | | `env_config_ext` | `backtest_web.py`, `database.py`, `optuna_common.py`, `migrate_split_env_config.py` 외 1개 | [ERD](./db_erd.md#env_config_ext) | | `holding_candles` | `backtest_web.py`, `holding_bot.py`, `kis_holding_ver1.py` | [ERD](./db_erd.md#holding_candles) | | `holding_min_candles` | `backtest_web.py`, `holding_bot.py`, `dbband_backtest_common.py`, `dbband_param_search.py` 외 4개 | [ERD](./db_erd.md#holding_min_candles) | | `holding_stock_config` | `holding_bot.py`, `kis_holding_ver1.py` | [ERD](./db_erd.md#holding_stock_config) | | `kv_store` | `database.py` | [ERD](./db_erd.md#kv_store) | | `ls_candidates_history` | `backtest_web.py`, `database.py`, `param_search_optuna.py`, `db_manager.py` 외 2개 | [ERD](./db_erd.md#ls_candidates_history) | | `ls_universe_history` | `database.py`, `collect_ls_condition_history.py`, `collect_ls_universe_history.py` | [ERD](./db_erd.md#ls_universe_history) | | `ls_ws_candles` | `backtest_web.py`, `database.py`, `breakout_backtest_common.py`, `scalping_backtest_common.py` 외 2개 | [ERD](./db_erd.md#ls_ws_candles) | | `ls_ws_orderbook` | `database.py`, `ls_ws.py` | [ERD](./db_erd.md#ls_ws_orderbook) | | `ls_ws_ticks` | `database.py`, `breakout_backtest_common.py`, `optuna_breakout.py`, `optuna_scalping.py` 외 2개 | [ERD](./db_erd.md#ls_ws_ticks) | | `ls_ws_vi` | `database.py`, `ls_ws.py` | [ERD](./db_erd.md#ls_ws_vi) | | `order_execution_history` | `database.py` | [ERD](./db_erd.md#order_execution_history) | | `orders` | `backtest_web.py`, `db_manager.py`, `us_momentum.py`, `kiwoom_trader_ver2.py` | [ERD](./db_erd.md#orders) | | `permanent_subscriptions` | `us_momentum.py`, `test_ls_ws.py` | [ERD](./db_erd.md#permanent_subscriptions) | | `stock_meta` | `backtest_web.py`, `database.py`, `fetch_stock_meta.py`, `param_search_apply_snapshot.py` 외 8개 | [ERD](./db_erd.md#stock_meta) | | `stock_share_meta` | `database.py`, `param_search_breakout.py`, `fill_stock_share_meta.py`, `test_kiwoom_ws_sub_limit.py` | [ERD](./db_erd.md#stock_share_meta) | | `target_candidates` | `backtest_web.py`, `database.py`, `diag_backtest_4_30.py`, `param_search_momentum.py` 외 26개 | [ERD](./db_erd.md#target_candidates) | | `target_candidates_history` | `backtest_web.py`, `database.py`, `diag_backtest_4_30.py`, `param_search_momentum.py` 외 17개 | [ERD](./db_erd.md#target_candidates_history) | | `trade_history` | `backtest_web.py`, `database.py`, `kis_long_ver1.py`, `kis_long_ver2.py` 외 15개 | [ERD](./db_erd.md#trade_history) | | `trade_history_paper` | `backtest_web.py` | [ERD](./db_erd.md#trade_history_paper) | | `ws_candles` | `backtest_web.py`, `database.py`, `diag_backtest_4_30.py`, `breakout_backtest_common.py` 외 24개 | [ERD](./db_erd.md#ws_candles) | | `ws_orderbook` | `database.py`, `backtest_portfolio_common.py`, `optuna_scalping.py`, `param_search_breakout.py` 외 6개 | [ERD](./db_erd.md#ws_orderbook) | | `ws_program` | `database.py`, `backtest_portfolio_common.py`, `optuna_scalping.py`, `param_search_breakout.py` 외 3개 | [ERD](./db_erd.md#ws_program) | | `ws_ticks` | `_verify_shared_e2e.py`, `_verify_shared_e2e_breakout.py`, `backtest_web.py`, `database.py` 외 21개 | [ERD](./db_erd.md#ws_ticks) | | `ws_ticks_us` | `backtest_web.py`, `database.py`, `breakout_tick_loader.py`, `momentum_backtest_common.py` 외 2개 | [ERD](./db_erd.md#ws_ticks_us) | --- ## 📂 전략별 파일 분류 ### DART공시 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `dart_backtest_common.py` | 142 | 🔬 백테스트 | `database`, `backtest`, `engine` +1 | | `optuna_dart.py` | 104 | 🔬 백테스트 | `database`, `optuna_common`, `param_search_dart` +1 | | `param_search_dart.py` | 95 | 🔬 백테스트 | `database`, `dart_backtest_common`, `engine` +1 | | `dart_engine.py` | 380 | ⚙️ 엔진 | `database`, `scalping_engine`, `env` | | `dart_order_tracker.py` | 642 | 📦 kis_trader | `database`, `db_manager`, `dart_watchlist` +3 | | `dart_watchlist.py` | 168 | 📦 kis_trader | `env`, `logger` | | `dart_strategy.py` | 248 | 📦 kis_trader | | ### 공매도/숏 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `kis_short_ver1.py` | 3,826 | 🏠 루트 | `database` | | `kis_short_ver2.py` | 3,885 | 🏠 루트 | `database` | | `kis_short_ver3.py` | 3,610 | 🏠 루트 | `database` | | `update_env_short.py` | 140 | 🏠 루트 | `database` | ### 공통 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `_test_kiwoom_condition_list.py` | 180 | 🏠 루트 | `env`, `kis_ws` | | `_test_kiwoom_condition_realtime.py` | 228 | 🏠 루트 | `env`, `kis_ws` | | `_test_ls_condition_realtime.py` | 693 | 🏠 루트 | `database`, `ls_token`, `env` | | `_verify_columnar_bitid.py` | 236 | 🏠 루트 | `shared_ticks`, `momentum_tick_replay`, `tail_tick_replay` +1 | | `_verify_shared_e2e.py` | 152 | 🏠 루트 | `database`, `backtest`, `momentum_backtest_common` +3 | | `auto_ai_reporter.py` | 263 | 🏠 루트 | | | `backtest_web.py` | 9,455 | 🔬 백테스트 | `database`, `backtest`, `backtest_env_timeline` +43 | | `carrot_region_sel.py` | 366 | 🏠 루트 | | | `check_account_config.py` | 103 | 🏠 루트 | `database` | | `check_db.py` | 28 | 🏠 루트 | | | `config_schema.py` | 150 | 🏠 루트 | | | `copy_env_row_to_latest.py` | 40 | 🏠 루트 | `database` | | `database.py` | 5,014 | 🗄️ DB 레이어 | `paper_store`, `indicator_cache`, `env` +1 | | `diag_backtest_4_30.py` | 198 | 🔬 백테스트 | `database`, `engine` | | `etf_backtest.py` | 404 | 🔬 백테스트 | | | `etf_ver1.py` | 887 | 🏠 루트 | `database`, `kis_ws` | | `export_sniper.py` | 132 | 🏠 루트 | | | `fetch_stock_meta.py` | 327 | 🏠 루트 | `database`, `kis_ws` | | `holding_bot.py` | 2,577 | 🏠 루트 | `database`, `kis_ws` | | `init_db.py` | 78 | 🏠 루트 | `database` | | `kis_approval_manager.py` | 404 | 🏠 루트 | | | `kis_holding_ver1.py` | 492 | 🏠 루트 | `database` | | `kis_long_alert.py` | 267 | 🏠 루트 | `database` | | `kis_long_ver1.py` | 1,953 | 🏠 루트 | `database` | | `kis_long_ver2.py` | 1,008 | 🏠 루트 | `database` | | `kis_token_manager.py` | 466 | 🏠 루트 | `database` | | `__init__.py` | 3 | 📦 kis_trader | | | `__init__.py` | 1 | 🔬 백테스트 | | | `backtest_env_timeline.py` | 158 | 🔬 백테스트 | `breakout_backtest_common`, `env_timeline`, `dbband_engine` +5 | | `backtest_portfolio_common.py` | 919 | 🔬 백테스트 | `database`, `trigger_snapshot_loader`, `daily_profit_halt` +5 | | `backtest_web.py` | 49 | 🔬 백테스트 | | | `bt_web_jobs.py` | 443 | 🔬 백테스트 | `kr_trading_day` | | `env_timeline.py` | 106 | 🔬 백테스트 | | | `ls_history_loaders.py` | 228 | 🔬 백테스트 | `logger` | | `optuna_briefing.py` | 432 | 🔬 백테스트 | `database`, `env` | | `optuna_common.py` | 672 | 🔬 백테스트 | `database`, `optuna_briefing`, `env` | | `optuna_daily_trail_recommend.py` | 315 | 🔬 백테스트 | `param_search_apply_snapshot`, `env` | | `optuna_mode_combo.py` | 278 | 🔬 백테스트 | `optuna_postprocess_topn`, `optuna_tpe_common`, `env` | | `optuna_post_progress.py` | — | 🔬 백테스트 | (후처리 진행 로그, 웹 바) | | `optuna_postprocess_topn.py` | — | 🔬 백테스트 | `optuna_orderbook_recommend`, `optuna_whipsaw_recommend`, `optuna_post_progress` | | `optuna_rerun_postprocess.py` | — | 🔬 백테스트 | `optuna_postprocess_topn`, `optuna_momentum` | | `optuna_search_space.py` | 89 | 🔬 백테스트 | `param_search_breakout`, `param_search_momentum`, `param_search_scalping` +1 | | `optuna_tpe_common.py` | 218 | 🔬 백테스트 | | | `optuna_web_jobs.py` | 1,121 | 🔬 백테스트 | `backtest_portfolio_common`, `optuna_common`, `optuna_study_store` +6 | | `optuna_study_store.py` | — | 🔬 백테스트 | `optuna_study_result` 테이블 (JSON 대체, 총 횟수 후처리 게이트) | | `param_apply_ai.py` | 314 | 🔬 백테스트 | `database`, `backtest_portfolio_common` | | `param_search_apply_snapshot.py` | 648 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +4 | | `param_search_cli_common.py` | 110 | 🔬 백테스트 | | | `param_search_dates.py` | 94 | 🔬 백테스트 | `env`, `kr_trading_day` | | `param_search_optuna.py` | 1,033 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +21 | | `param_search_pool.py` | 711 | 🔬 백테스트 | `env` | | `shared_ticks.py` | 507 | 🔬 백테스트 | `whipsaw_filter` | | `trigger_snapshot_loader.py` | 564 | 🔬 백테스트 | `orderbook_filter`, `program_filter`, `env` +3 | | `universe_history_source.py` | 81 | 🔬 백테스트 | `env` | | `universe_timeline.py` | 271 | 🔬 백테스트 | `universe_history_source`, `db_manager`, `env` | | `__init__.py` | 4 | 🗄️ DB 레이어 | | | `db_manager.py` | 857 | 🗄️ DB 레이어 | `database`, `momentum_universe_timeline`, `universe_history_source` +1 | | `paper_store.py` | 500 | 🗄️ DB 레이어 | `strategy_ids` | | `__init__.py` | 5 | ⚙️ 엔진 | | | `atr_series.py` | 37 | ⚙️ 엔진 | | | `candle_rollup.py` | 158 | ⚙️ 엔진 | | | `daily_profit_halt.py` | 811 | ⚙️ 엔진 | `env`, `logger` | | `ema_trend_filter.py` | 84 | ⚙️ 엔진 | | | `indicator_cache.py` | 412 | ⚙️ 엔진 | `ema_trend_filter`, `momentum_engine`, `env` | | `limit_entry_common.py` | 196 | ⚙️ 엔진 | | | `ls_feed_gate.py` | 20 | ⚙️ 엔진 | `env`, `ls_ws` | | `feed_fallback.py` | — | ⚙️ 엔진 | `env` | | `mid_enroll_entry_gate.py` | 241 | ⚙️ 엔진 | `env` | | `orderbook_env.py` | 187 | ⚙️ 엔진 | `env` | | `orderbook_filter.py` | 276 | ⚙️ 엔진 | `env`, `orderbook_cache`, `trigger_eval_recorder` | | `live_sell_price.py` | — | ⚙️ 엔진 | `env` | | `post_sell_candle_backfill.py` | 439 | ⚙️ 엔진 | `database`, `candle_rollup`, `env` +2 | | `program_filter.py` | 229 | ⚙️ 엔진 | `env`, `program_cache`, `trigger_eval_recorder` | | `strategy_eod.py` | 149 | ⚙️ 엔진 | | | `tick_exit_common.py` | 384 | ⚙️ 엔진 | `shared_ticks`, `scalping_engine`, `whipsaw_filter` +2 | | `trigger_eval_collect.py` | 76 | ⚙️ 엔진 | `env` | | `whipsaw_filter.py` | 570 | ⚙️ 엔진 | `shared_ticks`, `env` | | `__init__.py` | 5 | 📦 kis_trader | | | `account_cash.py` | 174 | 📦 kis_trader | | | `kis_client.py` | 1,553 | 📦 kis_trader | `api_reject_log`, `non_stock` | | `order_manager.py` | 2,381 | 📦 kis_trader | `post_sell_candle_backfill`, `us_momentum_env_keys`, `api_reject_log` | | `orderbook_sell.py` | 131 | 📦 kis_trader | | | `orphan_reconcile.py` | 571 | 📦 kis_trader | | | `main.py` | 2,353 | 📦 kis_trader | | | `__init__.py` | 4 | 📦 kis_trader | | | `condition_manager.py` | 446 | 📦 kis_trader | | | `kiwoom_condition_manager.py` | 790 | 📦 kis_trader | | | `ls_chart.py` | 239 | 📦 kis_trader | `database` | | `ls_condition_manager.py` | 821 | 📦 kis_trader | `ls_token` | | `ls_token.py` | 231 | 📦 kis_trader | `env` | | `ls_ws_validator.py` | 168 | 📦 kis_trader | | | `market_guard.py` | 572 | 📦 kis_trader | | | `ranking_manager.py` | 350 | 📦 kis_trader | | | `ws_manager.py` | 1,849 | 📦 kis_trader | `stock_share` | | `ws_validator.py` | 227 | 📦 kis_trader | | | `__init__.py` | 1 | 📦 kis_trader | | | `__init__.py` | 5 | 📦 kis_trader | | | `apply_unified_risk_env.py` | 81 | 📦 kis_trader | `database` | | `approx_param_search_from_log.py` | 131 | 📦 kis_trader | `db_manager` | | `backfill_trigger_eval_from_log.py` | 318 | 📦 kis_trader | `db_manager` | | `fill_kiwoom_candles.py` | 405 | 📦 kis_trader | `database`, `env`, `kis_ws` | | `fill_stock_share_meta.py` | 190 | 📦 kis_trader | `database`, `stock_share`, `env` +1 | | `migrate_split_env_config.py` | 105 | 📦 kis_trader | `database` | | `prune_env_config_strategy_columns.py` | 188 | 📦 kis_trader | `database`, `env` | | `rebuild_universe_history_from_logs.py` | 418 | 📦 kis_trader | `database`, `db_manager` | | `show_account_snapshot.py` | 323 | 📦 kis_trader | `kis_client`, `env` | | `test_kis_ws_diagnostic.py` | 403 | 📦 kis_trader | `kis_client`, `env` | | `verify_three_paths.py` | 231 | 📦 kis_trader | `param_search_scalping`, `momentum_engine`, `scalping_engine` +3 | | `__init__.py` | 1 | 📦 kis_trader | | | `stock_share.py` | 210 | 📦 kis_trader | `env`, `logger` | | `__init__.py` | 30 | 📦 kis_trader | | | `base.py` | 1,126 | 📦 kis_trader | `ls_feed_gate`, `mid_enroll_entry_gate` | | `__init__.py` | 1 | 🛠️ 유틸 | | | `api_reject_log.py` | 242 | 🛠️ 유틸 | `env` | | `env.py` | 159 | 🛠️ 유틸 | `database` | | `kis_ws_session_windows.py` | 149 | 🛠️ 유틸 | | | `ls_ws_session_windows.py` | — | 🛠️ 유틸 | `env`, `session_hm` | | `kr_trading_day.py` | 232 | 🛠️ 유틸 | `env` | | `live_portfolio_common.py` | 328 | 🛠️ 유틸 | | | `logger.py` | 219 | 🛠️ 유틸 | | | `non_stock.py` | 157 | 🛠️ 유틸 | | | `position_sizing.py` | 41 | 🛠️ 유틸 | | | `request_handler.py` | 208 | 🛠️ 유틸 | | | `session_hm.py` | 26 | 🛠️ 유틸 | | | `stock_name.py` | 97 | 🛠️ 유틸 | | | `strategy_ids.py` | 124 | 🛠️ 유틸 | | | `trade_time.py` | 32 | 🛠️ 유틸 | | | `universe_source.py` | 59 | 🛠️ 유틸 | | | `usd_krw_fx.py` | 410 | 🛠️ 유틸 | `env`, `request_handler` | | `live_config_schema.py` | 915 | 📦 kis_trader | `orderbook_env` | | `__init__.py` | 22 | 📦 kis_trader | | | `kis_ws.py` | 2,656 | 📦 kis_trader | `candle_rollup`, `env`, `kis_ws_session_windows` | | `kis_ws_overseas.py` | 591 | 📦 kis_trader | `env`, `kis_ws_session_windows` | | `kiwoom_ws.py` | 938 | 📦 kis_trader | `env` | | `ls_ws.py` | — | 📦 kis_trader | `database`, `ls_chart`, `ls_token`, `ls_ws_session_windows` | | `orderbook_cache.py` | 287 | 📦 kis_trader | | | `program_cache.py` | 157 | 📦 kis_trader | | | `tick_recorder.py` | 287 | 📦 kis_trader | | | `trigger_eval_recorder.py` | 270 | 📦 kis_trader | | | `trigger_snapshot_recorder.py` | 268 | 📦 kis_trader | | | `kis_ws.py` | 3 | 🏠 루트 | `kis_ws` | | `__init__.py` | 0 | 🏠 루트 | | | `api.py` | 0 | 🏠 루트 | | | `api_async.py` | 0 | 🏠 루트 | | | `__init__.py` | 0 | 🏠 루트 | | | `token.py` | 109 | 🏠 루트 | | | `__init__.py` | 0 | 🏠 루트 | | | `main.py` | 88 | 🏠 루트 | | | `config.py` | 60 | 🏠 루트 | | | `__init__.py` | 0 | 🏠 루트 | | | `async_client.py` | 49 | 🏠 루트 | | | `base.py` | 224 | 🏠 루트 | | | `base_api.py` | 56 | 🏠 루트 | | | `sync_client.py` | 43 | 🏠 루트 | | | `__init__.py` | 0 | 🏠 루트 | | | `account.py` | 2,050 | 🏠 루트 | | | `analysis.py` | 108 | 🏠 루트 | | | `chart.py` | 739 | 🏠 루트 | | | `credit_order.py` | 291 | 🏠 루트 | | | `elw.py` | 1,113 | 🏠 루트 | | | `etf.py` | 621 | 🏠 루트 | | | `foreign_institution.py` | 234 | 🏠 루트 | | | `investor.py` | 115 | 🏠 루트 | | | `market_condition.py` | 1,111 | 🏠 루트 | | | `order.py` | 317 | 🏠 루트 | | | `rank_info.py` | 2,311 | 🏠 루트 | | | `sector.py` | 507 | 🏠 루트 | | | `slb.py` | 287 | 🏠 루트 | | | `stockinfo.py` | 1,608 | 🏠 루트 | | | `theme.py` | 175 | 🏠 루트 | | | `trading.py` | 107 | 🏠 루트 | | | `trader.py` | 325 | 🏠 루트 | | | `websocket.py` | 321 | 🏠 루트 | | | `websocket_constants.py` | 186 | 🏠 루트 | | | `websocket_helper.py` | 283 | 🏠 루트 | | | `kiwoom_trader_dual.py` | 1,131 | 🏠 루트 | | | `kiwoom_trader_ver2.py` | 3,179 | 🏠 루트 | `database` | | `kiwoom_universe_scanner.py` | 684 | 🏠 루트 | `database` | | `kiwoom_ws.py` | 3 | 🏠 루트 | `kiwoom_ws` | | `config.py` | 43 | 🏠 루트 | | | `run.py` | 23 | 🏠 루트 | | | `ws_candle_agg.py` | 122 | 🏠 루트 | | | `balance_window.py` | 135 | 🏠 루트 | | | `button_holder.py` | 15 | 🏠 루트 | | | `main.py` | 303 | 🏠 루트 | | | `main_window.py` | 272 | 🏠 루트 | | | `order_window.py` | 351 | 🏠 루트 | | | `rockwidget.py` | 22 | 🏠 루트 | | | `search_window.py` | 130 | 🏠 루트 | | | `second_window.py` | 31 | 🏠 루트 | | | `slider.py` | 17 | 🏠 루트 | | | `test.py` | 100 | 🏠 루트 | | | `third_window.py` | 31 | 🏠 루트 | | | `k3_real.py` | 63 | 🏠 루트 | | | `s3_real.py` | 63 | 🏠 루트 | | | `tr_0424.py` | 813 | 🏠 루트 | | | `tr_1857.py` | 245 | 🏠 루트 | | | `tr_cancel_order.py` | 118 | 🏠 루트 | | | `tr_kh.py` | 72 | 🏠 루트 | | | `tr_master.py` | 67 | 🏠 루트 | | | `tr_order.py` | 197 | 🏠 루트 | | | `tr_pending.py` | 326 | 🏠 루트 | | | `tr_redo_order.py` | 115 | 🏠 루트 | | | `tr_sc0.py` | 108 | 🏠 루트 | | | `tr_sc1.py` | 97 | 🏠 루트 | | | `tr_sc2.py` | 82 | 🏠 루트 | | | `tr_sc3.py` | 88 | 🏠 루트 | | | `ui_search_window.py` | 67 | 🏠 루트 | | | `ui_second_window.py` | 35 | 🏠 루트 | | | `ui_test.py` | 65 | 🏠 루트 | | | `ui_third_window.py` | 34 | 🏠 루트 | | | `server.py` | 448 | 🏠 루트 | | | `fetch_spec.py` | 269 | 🏠 루트 | | | `server.py` | 417 | 🏠 루트 | | | `ml_predictor.py` | 230 | 🏠 루트 | `database` | | `mm_butler.py` | 1,235 | 🏠 루트 | `database`, `env` | | `mm_remote.py` | 290 | 🏠 루트 | `database` | | `modify_db_schema.py` | 37 | 🏠 루트 | | | `news_analyzer.py` | 215 | 🏠 루트 | | | `permanent_subs.py` | 319 | 🏠 루트 | `env` | | `ai_recommend_notice.py` | 337 | 🏠 루트 | `database` | | `back_test.py` | 164 | 🏠 루트 | | | `risk_manager.py` | 307 | 🏠 루트 | | | `balance_window.py` | 135 | 🏠 루트 | | | `button_holder.py` | 15 | 🏠 루트 | | | `main.py` | 303 | 🏠 루트 | | | `main_window.py` | 272 | 🏠 루트 | | | `order_window.py` | 351 | 🏠 루트 | | | `rockwidget.py` | 22 | 🏠 루트 | | | `search_window.py` | 130 | 🏠 루트 | | | `second_window.py` | 31 | 🏠 루트 | | | `slider.py` | 17 | 🏠 루트 | | | `test.py` | 100 | 🏠 루트 | | | `third_window.py` | 31 | 🏠 루트 | | | `k3_real.py` | 63 | 🏠 루트 | | | `s3_real.py` | 63 | 🏠 루트 | | | `tr_0424.py` | 813 | 🏠 루트 | | | `tr_1857.py` | 245 | 🏠 루트 | | | `tr_cancel_order.py` | 118 | 🏠 루트 | | | `tr_kh.py` | 72 | 🏠 루트 | | | `tr_master.py` | 67 | 🏠 루트 | | | `tr_order.py` | 197 | 🏠 루트 | | | `tr_pending.py` | 326 | 🏠 루트 | | | `tr_redo_order.py` | 115 | 🏠 루트 | | | `tr_sc0.py` | 108 | 🏠 루트 | | | `tr_sc1.py` | 97 | 🏠 루트 | | | `tr_sc2.py` | 82 | 🏠 루트 | | | `tr_sc3.py` | 88 | 🏠 루트 | | | `ui_search_window.py` | 67 | 🏠 루트 | | | `ui_second_window.py` | 35 | 🏠 루트 | | | `ui_test.py` | 65 | 🏠 루트 | | | `ui_third_window.py` | 34 | 🏠 루트 | | | `_diag_mom_2min_gap.py` | 124 | 🏠 루트 | `database` | | `_diag_mom_tick_today.py` | 99 | 🏠 루트 | `database` | | `backfill_trade_candles.py` | 70 | 🏠 루트 | `database`, `post_sell_candle_backfill` | | `collect_ls_condition_history.py` | 654 | 🏠 루트 | `database`, `env` | | `collect_ls_universe_history.py` | 401 | 🏠 루트 | `database` | | `copy_env_row_to_latest.py` | 0 | 🏠 루트 | | | `kis_error_watch_mm.py` | 387 | 🏠 루트 | `env`, `logger` | | `market_open_sim_smoke.py` | 362 | 🏠 루트 | `backtest`, `engine`, `kis_client` +6 | | `post_optuna_mid_enroll_verify.py` | 214 | 🏠 루트 | `database`, `backtest`, `us_momentum_web_backtest` +2 | | `query_kiwoom_condition_snapshot.py` | 454 | 🏠 루트 | `database`, `env`, `kis_ws` | | `run_strategy_backtest_cli.py` | 256 | 🔬 백테스트 | `kr_trading_day` | | `smoke_candle_upsert_rollup.py` | 144 | 🏠 루트 | `candle_rollup`, `kis_ws` | | `verify_live_portfolio_align.py` | 125 | 🏠 루트 | `strategies`, `live_portfolio_common` | | `verify_optuna_tpe_apply_dryrun.py` | 153 | 🏠 루트 | `backtest_portfolio_common`, `param_search_apply_snapshot`, `param_search_scalping` +1 | | `verify_optuna_tpe_parity_checklist.py` | 283 | 🏠 루트 | `backtest_portfolio_common`, `optuna_breakout_tpe_space`, `optuna_briefing` +6 | | `smart_executor.py` | 259 | 🏠 루트 | | | `star.py` | 11 | 🏠 루트 | | | `test_kiwoom_token.py` | 339 | 🏠 루트 | `database` | | `test_kiwoom_ws.py` | 196 | 🏠 루트 | `database`, `kis_ws`, `kiwoom_ws` | | `test_kiwoom_ws_sub_limit.py` | 453 | 🏠 루트 | `database`, `env`, `kis_ws` +1 | | `test_ls_ws.py` | 998 | 🏠 루트 | `database` | | `test_psearch.py` | 299 | 🏠 루트 | `kis_client`, `env` | | `tmp_mom_smoke_web.py` | 46 | 🏠 루트 | | | `trend_divergence.py` | 248 | 🏠 루트 | | | `update_env.py` | 145 | 🏠 루트 | `database` | | `update_env_etf.py` | 61 | 🏠 루트 | `database` | | `update_env_simple.py` | 71 | 🏠 루트 | `database` | ### 꼬리잡기(Tail) | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `optuna_tail_tpe_space.py` | 188 | 🔬 백테스트 | `optuna_tpe_common` | | `tail_backtest_common.py` | 840 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `momentum_backtest_common` +12 | | `tail_bt_web_jobs.py` | 14 | 🔬 백테스트 | `bt_web_jobs` | | `tail_exit_ab_test.py` | 122 | 🔬 백테스트 | `database`, `backtest`, `engine` | | `tail_mfe_analysis.py` | 305 | 🔬 백테스트 | `database`, `backtest`, `engine` +1 | | `tail_param_search.py` | 1,948 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +13 | | `tail_tick_loader.py` | 18 | 🔬 백테스트 | `breakout_tick_loader` | | `tail_engine.py` | 2,788 | ⚙️ 엔진 | `database`, `backtest_env_timeline`, `trigger_snapshot_loader` +15 | | `tail_env_keys.py` | 471 | ⚙️ 엔진 | `database`, `env` | | `tail_tick_replay.py` | 303 | ⚙️ 엔진 | `shared_ticks`, `candle_rollup`, `limit_entry_common` +1 | | `tail_catch.py` | 503 | 📦 kis_trader | `tail_tick_replay` | | `append_tail_optuna_compare.py` | 180 | 🏠 루트 | `database`, `backtest`, `engine` | | `run_tail_backtest_cli.py` | 376 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +4 | | `tail_live_bt_forensics.py` | 158 | 🏠 루트 | `database`, `backtest`, `universe_timeline` +2 | | `tail_symbol_gate_verify_20260709.py` | 126 | 🏠 루트 | `database`, `backtest`, `engine` +1 | | `tail_engine.py` | 3 | ⚙️ 엔진 | `tail_engine` | ### 더블볼린저 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `dbband_backtest_common.py` | 381 | 🔬 백테스트 | `backtest_portfolio_common`, `db_manager`, `dbband_engine` +1 | | `dbband_param_search.py` | 157 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +3 | | `dbband_engine.py` | 972 | ⚙️ 엔진 | `database`, `backtest_env_timeline`, `dbband_env_keys` +3 | | `dbband_env_keys.py` | 212 | ⚙️ 엔진 | | | `dbband_stock_cfg.py` | 343 | 📦 kis_trader | | | `dbband_strategy.py` | 228 | 📦 kis_trader | | ### 레인지브레이크 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `param_search_range_break.py` | 299 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +6 | | `range_break_backtest_common.py` | 239 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `breakout_tick_loader` +5 | | `range_break_portfolio_backtest.py` | 402 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `range_break_engine` +5 | | `range_break_engine.py` | 460 | ⚙️ 엔진 | `database`, `range_break_portfolio_backtest`, `range_break_env_keys` +2 | | `range_break_env_keys.py` | 88 | ⚙️ 엔진 | | | `range_break.py` | 303 | 📦 kis_trader | | ### 모멘텀 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `compare_web_cli_momentum.py` | 62 | 🏠 루트 | | | `diag_momentum_backtest.py` | 173 | 🔬 백테스트 | `database`, `backtest`, `param_search_momentum` | | `momentum_backtest_common.py` | 659 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `breakout_tick_loader` +12 | | `momentum_exit_ab_test.py` | 100 | 🔬 백테스트 | `database`, `backtest`, `engine` | | `momentum_portfolio_backtest.py` | 930 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `momentum_tick_loader` +11 | | `momentum_random_benchmark.py` | 565 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +4 | | `momentum_rr_crossval.py` | 466 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +4 | | `momentum_rr_quick_eval.py` | 113 | 🔬 백테스트 | `backtest`, `backtest_portfolio_common`, `momentum_rr_crossval` +1 | | `momentum_tick_loader.py` | 19 | 🔬 백테스트 | `breakout_tick_loader` | | `momentum_universe_timeline.py` | 125 | 🔬 백테스트 | `momentum_backtest_common`, `universe_history_source`, `universe_timeline` +2 | | `optuna_momentum.py` | 689 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +18 | | `optuna_momentum_tpe_space.py` | 159 | 🔬 백테스트 | `optuna_tpe_common`, `param_search_momentum` | | `param_search_momentum.py` | 2,577 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +17 | | `us_momentum_web_backtest.py` | 400 | 🔬 백테스트 | `backtest`, `us_momentum_env_keys`, `us_momentum_stock_cfg` +2 | | `momentum_chase_patterns.py` | 228 | ⚙️ 엔진 | `env` | | `momentum_engine.py` | 673 | ⚙️ 엔진 | `database`, `momentum_portfolio_backtest`, `momentum_env_keys` +6 | | `momentum_env_keys.py` | 249 | ⚙️ 엔진 | | | `momentum_hts_logic.py` | 587 | ⚙️ 엔진 | `momentum_chase_patterns`, `momentum_env_keys`, `orderbook_filter` +5 | | `momentum_tick_replay.py` | 620 | ⚙️ 엔진 | `shared_ticks`, `momentum_engine`, `whipsaw_filter` +2 | | `us_momentum_env.py` | 193 | ⚙️ 엔진 | `env` | | `us_momentum_env_keys.py` | 296 | ⚙️ 엔진 | `env` | | `compare_momentum_scan_memo.py` | 233 | 📦 kis_trader | `backtest`, `momentum_backtest_common`, `param_search_momentum` | | `momentum.py` | 360 | 📦 kis_trader | `tail_tick_replay` | | `us_momentum.py` | 1,123 | 📦 kis_trader | `database`, `tail_tick_replay` | | `us_momentum_stock_cfg.py` | 378 | 📦 kis_trader | | | `momentum_engine.py` | 3 | ⚙️ 엔진 | `momentum_engine` | | `momentum_ratchet_ab_715.py` | 191 | 🏠 루트 | `optuna_common`, `optuna_momentum`, `param_search_momentum` +1 | ### 미국모멘텀 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `us_momentum_web_backtest.py` | 400 | 🔬 백테스트 | `backtest`, `us_momentum_env_keys`, `us_momentum_stock_cfg` +2 | | `us_momentum_env.py` | 193 | ⚙️ 엔진 | `env` | | `us_momentum_env_keys.py` | 296 | ⚙️ 엔진 | `env` | | `us_momentum.py` | 1,123 | 📦 kis_trader | `database`, `tail_tick_replay` | | `us_momentum_stock_cfg.py` | 378 | 📦 kis_trader | | ### 브레이크아웃 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `_verify_shared_e2e_breakout.py` | 156 | 🏠 루트 | `database`, `backtest`, `breakout_backtest_common` +3 | | `breakout_backtest_common.py` | 624 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `breakout_tick_loader` +9 | | `breakout_portfolio_backtest.py` | 504 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `trigger_snapshot_loader` +10 | | `breakout_tick_loader.py` | 529 | 🔬 백테스트 | `database`, `candle_rollup` | | `optuna_breakout.py` | 524 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +19 | | `optuna_breakout_tpe_space.py` | 96 | 🔬 백테스트 | `optuna_tpe_common` | | `param_search_breakout.py` | 1,587 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +14 | | `breakout.py` | 2,047 | 📦 kis_trader | `breakout_portfolio_backtest`, `shared_ticks`, `tail_tick_replay` +2 | ### 스캘핑 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `holding_param_search.py` | 210 | 🔬 백테스트 | `database` | | `optuna_scalping.py` | 599 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +16 | | `optuna_scalping_tpe_space.py` | 88 | 🔬 백테스트 | `optuna_tpe_common` | | `param_search_scalping.py` | 1,661 | 🔬 백테스트 | `database`, `backtest`, `backtest_portfolio_common` +11 | | `scalping_backtest_common.py` | 408 | 🔬 백테스트 | `backtest`, `backtest_env_timeline`, `backtest_portfolio_common` +9 | | `scalping_portfolio_backtest.py` | 506 | 🔬 백테스트 | `backtest_env_timeline`, `backtest_portfolio_common`, `momentum_portfolio_backtest` +7 | | `scalping_engine.py` | 1,346 | ⚙️ 엔진 | `database`, `scalping_portfolio_backtest`, `momentum_engine` +5 | | `scalping.py` | 434 | 📦 kis_trader | `tail_tick_replay` | | `scalping_bot.py` | 261 | 🏠 루트 | `database` | | `scalping_logic.py` | 45 | 🏠 루트 | `engine` | | `kis_scalping_ver1.py` | 1,658 | 🏠 루트 | `database` | | `kis_scalping_ver2.py` | 1,596 | 🏠 루트 | `database` | | `scalping_engine.py` | 3 | ⚙️ 엔진 | `scalping_engine` | | `_diag_scalp_live_bt_20260716.py` | 317 | 🏠 루트 | `database`, `scalping_backtest_common`, `scalping_engine` | ### 업다운 | 파일 | 라인 수 | 레이어 | 내부 의존 | |------|---------|--------|----------| | `param_search_updow.py` | 409 | 🔬 백테스트 | `database`, `backtest_portfolio_common`, `param_search_apply_snapshot` +3 | | `param_search_updow_us.py` | 284 | 🔬 백테스트 | `database`, `strategies`, `updow_holding_cfg` +1 | | `param_search_updown_box.py` | 276 | 🔬 백테스트 | `database`, `param_search_dates`, `engine` +2 | | `updown_box.py` | 958 | ⚙️ 엔진 | | | `updow_buy.py` | 1,383 | 📦 kis_trader | `scalping_engine` | | `updow_holding_cfg.py` | 590 | 📦 kis_trader | | | `updow_strategy.py` | 769 | 📦 kis_trader | | | `updown_box_stock_cfg.py` | 221 | 📦 kis_trader | | | `updown_feed.py` | 198 | 📦 kis_trader | | | `updown_scan.py` | 154 | 📦 kis_trader | | | `updown_watchlist.py` | 419 | 📦 kis_trader | | | `updowbuyy.py` | 36 | 🏠 루트 | `updow_buy` | --- ## 📋 전체 파일 의존성 상세 (All Files) | 파일 | 라인 | 내부 모듈 의존 | 외부 라이브러리 | |------|------|---------------|----------------| | `_test_kiwoom_condition_list.py` | 180 | `kis_trader.utils.env`, `kis_trader.ws.kis_ws` | `websocket` | | `_test_kiwoom_condition_realtime.py` | 228 | `kis_trader.utils.env`, `kis_trader.ws.kis_ws` | `websocket` | | `_test_ls_condition_realtime.py` | 693 | `database`, `kis_trader.network.ls_token`, `kis_trader.utils.env` | `argparse`, `requests`, `websocket` | | `_verify_columnar_bitid.py` | 236 | `kis_trader.backtest.shared_ticks`, `kis_trader.engine.momentum_tick_replay`, `kis_trader.engine.tail_tick_replay`, `kis_trader.engine.whipsaw_filter` | - | | `_verify_shared_e2e.py` | 152 | `database`, `kis_trader.backtest`, `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.momentum_tick_loader`, `kis_trader.backtest.param_search_momentum`, `kis_trader.backtest.shared_ticks` | - | | `_verify_shared_e2e_breakout.py` | 156 | `database`, `kis_trader.backtest`, `kis_trader.backtest.breakout_backtest_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.param_search_breakout`, `kis_trader.backtest.shared_ticks` | - | | `auto_ai_reporter.py` | 263 | - | `dotenv`, `google`, `requests`, `sqlite3` | | `backtest_scalping/holding_param_search.py` | 210 | `database` | `argparse`, `holding_bot` | | `backtest_web.py` | 9,455 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_backtest_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.dart_backtest_common`, `kis_trader.backtest.dbband_param_search`, `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.param_search_breakout`, `kis_trader.backtest.param_search_momentum`, `kis_trader.backtest.scalping_backtest_common`, `kis_trader.backtest.tail_param_search`, `kis_trader.backtest.universe_history_source`, `kis_trader.backtest.universe_timeline`, `kis_trader.backtest.us_momentum_web_backtest`, `kis_trader.database.db_manager`, `kis_trader.database.paper_store`, `kis_trader.engine`, `kis_trader.engine.candle_rollup`, `kis_trader.engine.daily_profit_halt`, `kis_trader.engine.dbband_env_keys`, `kis_trader.engine.limit_entry_common`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.tail_env_keys`, `kis_trader.engine.updown_box`, `kis_trader.execution.account_cash`, `kis_trader.execution.kis_client`, `kis_trader.execution.order_manager`, `kis_trader.execution.orphan_reconcile`, `kis_trader.scan.dart_order_tracker`, `kis_trader.scan.dart_watchlist`, `kis_trader.strategies`, `kis_trader.strategies.base`, `kis_trader.strategies.breakout`, `kis_trader.strategies.range_break`, `kis_trader.strategies.updown_box_stock_cfg`, `kis_trader.strategies.updown_watchlist`, `kis_trader.strategies.us_momentum_stock_cfg`, `kis_trader.utils.env`, `kis_trader.utils.kr_trading_day`, `kis_trader.utils.stock_name`, `kis_trader.utils.strategy_ids`, `kis_trader.utils.trade_time`, `kis_trader.utils.usd_krw_fx`, `kis_trader.web.live_config_schema` | `config_schema`, `flask`, `holding_bot`, `kis_holding_ver1`, `permanent_subs` | | `carrot_region_sel.py` | 366 | - | `bs4`, `mm_sender`, `requests`, `telegram` | | `check_account_config.py` | 103 | `database` | - | | `check_db.py` | 28 | - | `sqlite3` | | `compare_web_cli_momentum.py` | 62 | - | - | | `config_schema.py` | 150 | - | - | | `copy_env_row_to_latest.py` | 40 | `database` | - | | `database.py` | 5,014 | `kis_trader.database.paper_store`, `kis_trader.engine.indicator_cache`, `kis_trader.utils.env`, `kis_trader.utils.strategy_ids` | `config_schema`, `pymysql` | | `diag_backtest_4_30.py` | 198 | `database`, `kis_trader.engine` | - | | `diag_momentum_backtest.py` | 173 | `database`, `kis_trader.backtest`, `kis_trader.backtest.param_search_momentum` | `argparse` | | `etf_backtest.py` | 404 | - | `numpy`, `pandas`, `requests`, `yfinance` | | `etf_ver1.py` | 887 | `database`, `kis_trader.ws.kis_ws` | `pandas`, `requests` | | `export_sniper.py` | 132 | - | `bs4`, `requests` | | `fetch_stock_meta.py` | 327 | `database`, `kis_trader.ws.kis_ws` | `argparse`, `requests` | | `holding_bot.py` | 2,577 | `database`, `kis_trader.ws.kis_ws` | `argparse`, `kis_token_manager`, `kiwoom_rest_api`, `requests` | | `init_db.py` | 78 | `database` | - | | `kis_approval_manager.py` | 404 | - | `requests` | | `kis_holding_ver1.py` | 492 | `database` | `argparse`, `holding_bot` | | `kis_long_alert.py` | 267 | `database` | `kis_long_ver1` | | `kis_long_ver1.py` | 1,953 | `database` | `google`, `hmac`, `kis_token_manager`, `ml_predictor`, `pandas`, `requests` | | `kis_long_ver2.py` | 1,008 | `database` | `kis_long_ver1`, `news_analyzer`, `pandas` | | `kis_token_manager.py` | 466 | `database` | `argparse`, `requests` | | `kis_trader/__init__.py` | 3 | - | - | | `kis_trader/backtest/__init__.py` | 1 | - | - | | `kis_trader/backtest/backtest_env_timeline.py` | 158 | `kis_trader.backtest.breakout_backtest_common`, `kis_trader.backtest.env_timeline`, `kis_trader.engine.dbband_engine`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.range_break_engine`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.tail_engine`, `kis_trader.strategies.breakout` | - | | `kis_trader/backtest/backtest_portfolio_common.py` | 919 | `database`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine.daily_profit_halt`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.strategy_eod`, `kis_trader.utils.env`, `kis_trader.utils.position_sizing`, `kis_trader.utils.trade_time` | - | | `kis_trader/backtest/backtest_web.py` | 49 | - | `backtest_web`, `runpy` | | `kis_trader/backtest/breakout_backtest_common.py` | 624 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.ls_history_loaders`, `kis_trader.backtest.universe_history_source`, `kis_trader.backtest.universe_timeline`, `kis_trader.database.db_manager`, `kis_trader.engine.indicator_cache`, `kis_trader.share.stock_share`, `kis_trader.strategies.breakout`, `kis_trader.utils.env`, `kis_trader.utils.logger` | - | | `kis_trader/backtest/breakout_portfolio_backtest.py` | 504 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine.atr_series`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.mid_enroll_entry_gate`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.tick_exit_common`, `kis_trader.engine.whipsaw_filter`, `kis_trader.share.stock_share`, `kis_trader.strategies.base`, `kis_trader.strategies.breakout`, `kis_trader.utils.env` | - | | `kis_trader/backtest/breakout_tick_loader.py` | 529 | `database`, `kis_trader.engine.candle_rollup` | `pymysql`, `utils` | | `kis_trader/backtest/bt_web_jobs.py` | 443 | `kis_trader.utils.kr_trading_day` | - | | `kis_trader/backtest/dart_backtest_common.py` | 142 | `database`, `kis_trader.backtest`, `kis_trader.engine`, `kis_trader.scan.dart_order_tracker` | - | | `kis_trader/backtest/dbband_backtest_common.py` | 381 | `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.database.db_manager`, `kis_trader.engine.dbband_engine`, `kis_trader.utils.trade_time` | - | | `kis_trader/backtest/dbband_param_search.py` | 157 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.engine`, `kis_trader.engine.dbband_env_keys`, `kis_trader.strategies` | `argparse`, `holding_bot` | | `kis_trader/backtest/env_timeline.py` | 106 | - | `bisect` | | `kis_trader/backtest/ls_history_loaders.py` | 228 | `kis_trader.utils.logger` | - | | `kis_trader/backtest/momentum_backtest_common.py` | 659 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.momentum_tick_loader`, `kis_trader.backtest.momentum_universe_timeline`, `kis_trader.backtest.universe_history_source`, `kis_trader.backtest.universe_timeline`, `kis_trader.database.db_manager`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.momentum_hts_logic`, `kis_trader.engine.momentum_tick_replay`, `kis_trader.utils.env`, `kis_trader.utils.logger`, `kis_trader.ws.kis_ws` | - | | `kis_trader/backtest/momentum_exit_ab_test.py` | 100 | `database`, `kis_trader.backtest`, `kis_trader.engine` | - | | `kis_trader/backtest/momentum_portfolio_backtest.py` | 930 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_tick_loader`, `kis_trader.backtest.momentum_universe_timeline`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.mid_enroll_entry_gate`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.momentum_tick_replay`, `kis_trader.engine.whipsaw_filter`, `kis_trader.strategies.base`, `kis_trader.utils.env`, `kis_trader.utils.session_hm` | - | | `kis_trader/backtest/momentum_random_benchmark.py` | 565 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_portfolio_backtest`, `kis_trader.backtest.param_search_momentum`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.momentum_hts_logic` | `argparse` | | `kis_trader/backtest/momentum_rr_crossval.py` | 466 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_momentum`, `kis_trader.engine`, `kis_trader.utils.env` | `argparse` | | `kis_trader/backtest/momentum_rr_quick_eval.py` | 113 | `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_rr_crossval`, `kis_trader.backtest.param_search_momentum` | - | | `kis_trader/backtest/momentum_tick_loader.py` | 19 | `kis_trader.backtest.breakout_tick_loader` | - | | `kis_trader/backtest/momentum_universe_timeline.py` | 125 | `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.universe_history_source`, `kis_trader.backtest.universe_timeline`, `kis_trader.engine.momentum_engine`, `kis_trader.utils.env` | - | | `kis_trader/backtest/optuna_breakout.py` | 524 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_backtest_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.ls_history_loaders`, `kis_trader.backtest.optuna_breakout_tpe_space`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_daily_trail_recommend`, `kis_trader.backtest.optuna_mode_combo`, `kis_trader.backtest.optuna_search_space`, `kis_trader.backtest.param_search_breakout`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.tail_param_search`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.backtest.universe_history_source`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.share.stock_share`, `kis_trader.strategies.breakout`, `kis_trader.utils.env` | `atexit`, `ctypes`, `optuna` | | `kis_trader/backtest/optuna_breakout_tpe_space.py` | 96 | `kis_trader.backtest.optuna_tpe_common` | `optuna` | | `kis_trader/backtest/optuna_briefing.py` | 432 | `database`, `kis_trader.utils.env` | `anthropic`, `argparse`, `google` | | `kis_trader/backtest/optuna_common.py` | 672 | `database`, `kis_trader.backtest.optuna_briefing`, `kis_trader.utils.env` | `optuna`, `pymysql` | | `kis_trader/backtest/optuna_daily_trail_recommend.py` | 315 | `kis_trader.backtest.param_search_apply_snapshot`, `kis_trader.utils.env` | - | | `kis_trader/backtest/optuna_dart.py` | 104 | `database`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.param_search_dart`, `kis_trader.engine` | `optuna` | | `kis_trader/backtest/optuna_mode_combo.py` | 278 | `kis_trader.backtest.optuna_daily_trail_recommend`, `kis_trader.backtest.optuna_tpe_common`, `kis_trader.utils.env` | - | | `kis_trader/backtest/optuna_momentum.py` | 689 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.momentum_tick_loader`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_daily_trail_recommend`, `kis_trader.backtest.optuna_mode_combo`, `kis_trader.backtest.optuna_momentum_tpe_space`, `kis_trader.backtest.optuna_search_space`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_momentum`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.tail_param_search`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.backtest.universe_history_source`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.momentum_tick_replay`, `kis_trader.engine.us_momentum_env_keys`, `kis_trader.utils.env` | `atexit`, `ctypes`, `optuna` | | `kis_trader/backtest/optuna_momentum_tpe_space.py` | 159 | `kis_trader.backtest.optuna_tpe_common`, `kis_trader.backtest.param_search_momentum` | `optuna` | | `kis_trader/backtest/optuna_scalping.py` | 599 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.ls_history_loaders`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_daily_trail_recommend`, `kis_trader.backtest.optuna_mode_combo`, `kis_trader.backtest.optuna_scalping_tpe_space`, `kis_trader.backtest.optuna_search_space`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_scalping`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.tail_param_search`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.backtest.universe_history_source`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.utils.env` | `atexit`, `ctypes`, `optuna` | | `kis_trader/backtest/optuna_scalping_tpe_space.py` | 88 | `kis_trader.backtest.optuna_tpe_common` | `optuna` | | `kis_trader/backtest/optuna_search_space.py` | 89 | `kis_trader.backtest.param_search_breakout`, `kis_trader.backtest.param_search_momentum`, `kis_trader.backtest.param_search_scalping`, `kis_trader.backtest.tail_param_search` | `optuna` | | `kis_trader/backtest/optuna_tail_tpe_space.py` | 188 | `kis_trader.backtest.optuna_tpe_common` | `optuna` | | `kis_trader/backtest/optuna_tpe_common.py` | 218 | - | `optuna` | | `kis_trader/backtest/optuna_web_jobs.py` | 1,121 | `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_daily_trail_recommend`, `kis_trader.backtest.param_search_breakout`, `kis_trader.backtest.param_search_momentum`, `kis_trader.backtest.param_search_scalping`, `kis_trader.backtest.tail_param_search`, `kis_trader.backtest.universe_history_source`, `kis_trader.utils.kr_trading_day` | `optuna` | | `kis_trader/backtest/param_apply_ai.py` | 314 | `database`, `kis_trader.backtest.backtest_portfolio_common` | `google`, `param_search_scalping`, `tail_param_search` | | `kis_trader/backtest/param_search_apply_snapshot.py` | 648 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.engine.orderbook_env`, `kis_trader.engine.us_momentum_env_keys`, `kis_trader.strategies`, `kis_trader.strategies.breakout` | `argparse`, `holding_bot`, `tail_param_search` | | `kis_trader/backtest/param_search_breakout.py` | 1,587 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_backtest_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.param_search_apply_snapshot`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_dates`, `kis_trader.backtest.param_search_pool`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.share.stock_share`, `kis_trader.strategies.breakout`, `kis_trader.utils.env` | `argparse`, `atexit`, `ctypes`, `heapq` | | `kis_trader/backtest/param_search_cli_common.py` | 110 | - | `argparse` | | `kis_trader/backtest/param_search_dart.py` | 95 | `database`, `kis_trader.backtest.dart_backtest_common`, `kis_trader.engine`, `kis_trader.utils.env` | - | | `kis_trader/backtest/param_search_dates.py` | 94 | `kis_trader.utils.env`, `kis_trader.utils.kr_trading_day` | - | | `kis_trader/backtest/param_search_momentum.py` | 2,577 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.momentum_tick_loader`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.param_search_apply_snapshot`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_dates`, `kis_trader.backtest.param_search_pool`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.momentum_hts_logic`, `kis_trader.engine.momentum_tick_replay`, `kis_trader.engine.us_momentum_env_keys`, `kis_trader.strategies.breakout`, `kis_trader.strategies.us_momentum_stock_cfg`, `kis_trader.utils.env` | `argparse`, `atexit`, `ctypes`, `heapq`, `permanent_subs` | | `kis_trader/backtest/param_search_optuna.py` | 1,033 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.optuna_breakout`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_daily_trail_recommend`, `kis_trader.backtest.optuna_dart`, `kis_trader.backtest.optuna_mode_combo`, `kis_trader.backtest.optuna_momentum`, `kis_trader.backtest.optuna_scalping`, `kis_trader.backtest.optuna_search_space`, `kis_trader.backtest.optuna_tail_tpe_space`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_dates`, `kis_trader.backtest.param_search_pool`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.tail_param_search`, `kis_trader.backtest.tail_tick_loader`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.backtest.universe_history_source`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.tail_tick_replay`, `kis_trader.utils.env` | `argparse`, `atexit`, `ctypes`, `optuna` | | `kis_trader/backtest/param_search_pool.py` | 711 | `kis_trader.utils.env` | `atexit`, `ctypes` | | `kis_trader/backtest/param_search_range_break.py` | 299 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_dates`, `kis_trader.backtest.param_search_pool`, `kis_trader.engine.range_break_engine`, `kis_trader.strategies.breakout`, `kis_trader.utils.env` | `argparse`, `heapq` | | `kis_trader/backtest/param_search_scalping.py` | 1,661 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.param_search_apply_snapshot`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_dates`, `kis_trader.backtest.param_search_pool`, `kis_trader.backtest.scalping_backtest_common`, `kis_trader.backtest.shared_ticks`, `kis_trader.engine`, `kis_trader.engine.orderbook_env`, `kis_trader.utils.env` | `argparse`, `atexit`, `ctypes`, `heapq`, `param_apply_ai` | | `kis_trader/backtest/param_search_updow.py` | 409 | `database`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.param_search_apply_snapshot`, `kis_trader.backtest.param_search_dates`, `kis_trader.strategies`, `kis_trader.strategies.updow_holding_cfg` | `argparse`, `holding_bot` | | `kis_trader/backtest/param_search_updow_us.py` | 284 | `database`, `kis_trader.strategies`, `kis_trader.strategies.updow_holding_cfg`, `kis_trader.utils.kr_trading_day` | `argparse`, `holding_bot` | | `kis_trader/backtest/param_search_updown_box.py` | 276 | `database`, `kis_trader.backtest.param_search_dates`, `kis_trader.engine`, `kis_trader.strategies.updown_watchlist`, `kis_trader.utils.env` | `argparse`, `holding_bot` | | `kis_trader/backtest/range_break_backtest_common.py` | 239 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.universe_timeline`, `kis_trader.database.db_manager`, `kis_trader.engine.range_break_engine`, `kis_trader.engine.tick_exit_common`, `kis_trader.utils.logger` | - | | `kis_trader/backtest/range_break_portfolio_backtest.py` | 402 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.engine.range_break_engine`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.tick_exit_common`, `kis_trader.share.stock_share`, `kis_trader.strategies.breakout`, `kis_trader.utils.env` | - | | `kis_trader/backtest/scalping_backtest_common.py` | 408 | `kis_trader.backtest`, `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.breakout_tick_loader`, `kis_trader.backtest.ls_history_loaders`, `kis_trader.backtest.universe_history_source`, `kis_trader.backtest.universe_timeline`, `kis_trader.database.db_manager`, `kis_trader.engine`, `kis_trader.engine.tick_exit_common`, `kis_trader.utils.env`, `kis_trader.utils.logger` | - | | `kis_trader/backtest/scalping_portfolio_backtest.py` | 506 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_portfolio_backtest`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine.mid_enroll_entry_gate`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.strategy_eod`, `kis_trader.engine.tail_tick_replay`, `kis_trader.engine.tick_exit_common`, `kis_trader.utils.env` | - | | `kis_trader/backtest/shared_ticks.py` | 507 | `kis_trader.engine.whipsaw_filter` | `numpy` | | `kis_trader/backtest/tail_backtest_common.py` | 840 | `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.tail_tick_loader`, `kis_trader.backtest.universe_history_source`, `kis_trader.backtest.universe_timeline`, `kis_trader.database.db_manager`, `kis_trader.engine.candle_rollup`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.tail_engine`, `kis_trader.engine.tail_tick_replay`, `kis_trader.utils.env`, `kis_trader.utils.logger`, `kis_trader.utils.trade_time`, `kis_trader.ws.kis_ws` | - | | `kis_trader/backtest/tail_bt_web_jobs.py` | 14 | `kis_trader.backtest.bt_web_jobs` | - | | `kis_trader/backtest/tail_exit_ab_test.py` | 122 | `database`, `kis_trader.backtest`, `kis_trader.engine` | - | | `kis_trader/backtest/tail_mfe_analysis.py` | 305 | `database`, `kis_trader.backtest`, `kis_trader.engine`, `kis_trader.utils.trade_time` | `argparse` | | `kis_trader/backtest/tail_param_search.py` | 1,948 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.param_search_cli_common`, `kis_trader.backtest.param_search_dates`, `kis_trader.backtest.param_search_pool`, `kis_trader.backtest.shared_ticks`, `kis_trader.backtest.tail_tick_loader`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.orderbook_env`, `kis_trader.engine.tail_env_keys`, `kis_trader.engine.tail_tick_replay`, `kis_trader.utils.env` | `argparse`, `atexit`, `ctypes`, `heapq`, `param_apply_ai` | | `kis_trader/backtest/tail_tick_loader.py` | 18 | `kis_trader.backtest.breakout_tick_loader` | - | | `kis_trader/backtest/trigger_snapshot_loader.py` | 564 | `kis_trader.engine.orderbook_filter`, `kis_trader.engine.program_filter`, `kis_trader.utils.env`, `kis_trader.ws.orderbook_cache`, `kis_trader.ws.program_cache`, `kis_trader.ws.trigger_eval_recorder` | - | | `kis_trader/backtest/universe_history_source.py` | 81 | `kis_trader.utils.env` | - | | `kis_trader/backtest/universe_timeline.py` | 271 | `kis_trader.backtest.universe_history_source`, `kis_trader.database.db_manager`, `kis_trader.utils.env` | `bisect` | | `kis_trader/backtest/us_momentum_web_backtest.py` | 400 | `kis_trader.backtest`, `kis_trader.engine.us_momentum_env_keys`, `kis_trader.strategies.us_momentum_stock_cfg`, `kis_trader.utils.env`, `kis_trader.utils.usd_krw_fx` | `permanent_subs` | | `kis_trader/database/__init__.py` | 4 | - | `db_manager` | | `kis_trader/database/db_manager.py` | 857 | `database`, `kis_trader.backtest.momentum_universe_timeline`, `kis_trader.backtest.universe_history_source`, `kis_trader.utils.stock_name` | - | | `kis_trader/database/paper_store.py` | 500 | `kis_trader.utils.strategy_ids` | - | | `kis_trader/engine/__init__.py` | 5 | - | - | | `kis_trader/engine/atr_series.py` | 37 | - | - | | `kis_trader/engine/candle_rollup.py` | 158 | - | - | | `kis_trader/engine/daily_profit_halt.py` | 811 | `kis_trader.utils.env`, `kis_trader.utils.logger` | - | | `kis_trader/engine/dart_engine.py` | 380 | `database`, `kis_trader.engine.scalping_engine`, `kis_trader.utils.env` | - | | `kis_trader/engine/dbband_engine.py` | 972 | `database`, `kis_trader.backtest.backtest_env_timeline`, `kis_trader.engine.dbband_env_keys`, `kis_trader.engine.tick_exit_common`, `kis_trader.utils.env`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/dbband_env_keys.py` | 212 | - | - | | `kis_trader/engine/ema_trend_filter.py` | 84 | - | - | | `kis_trader/engine/indicator_cache.py` | 412 | `kis_trader.engine.ema_trend_filter`, `kis_trader.engine.momentum_engine`, `kis_trader.utils.env` | - | | `kis_trader/engine/limit_entry_common.py` | 196 | - | `utils` | | `kis_trader/engine/ls_feed_gate.py` | 20 | `kis_trader.utils.env`, `kis_trader.ws.ls_ws` | - | | `kis_trader/engine/mid_enroll_entry_gate.py` | 241 | `kis_trader.utils.env` | - | | `kis_trader/engine/momentum_chase_patterns.py` | 228 | `kis_trader.utils.env` | - | | `kis_trader/engine/momentum_engine.py` | 673 | `database`, `kis_trader.backtest.momentum_portfolio_backtest`, `kis_trader.engine.momentum_env_keys`, `kis_trader.engine.momentum_hts_logic`, `kis_trader.engine.momentum_tick_replay`, `kis_trader.engine.strategy_eod`, `kis_trader.utils.env`, `kis_trader.utils.session_hm`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/momentum_env_keys.py` | 249 | - | - | | `kis_trader/engine/momentum_hts_logic.py` | 587 | `kis_trader.engine.momentum_chase_patterns`, `kis_trader.engine.momentum_env_keys`, `kis_trader.engine.orderbook_filter`, `kis_trader.engine.program_filter`, `kis_trader.engine.whipsaw_filter`, `kis_trader.utils.env`, `kis_trader.utils.session_hm`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/momentum_tick_replay.py` | 620 | `kis_trader.backtest.shared_ticks`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.whipsaw_filter`, `kis_trader.utils.env`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/orderbook_env.py` | 187 | `kis_trader.utils.env` | - | | `kis_trader/engine/orderbook_filter.py` | 276 | `kis_trader.utils.env`, `kis_trader.ws.orderbook_cache`, `kis_trader.ws.trigger_eval_recorder` | `orderbook_env`, `trigger_eval_collect` | | `kis_trader/engine/live_sell_price.py` | — | `kis_trader.utils.env` | `base` 매도 현재가 | | `kis_trader/engine/feed_fallback.py` | — | `kis_trader.utils.env` | 실매·옵투나 읽기 2초 폴백 | | `kis_trader/engine/post_sell_candle_backfill.py` | 439 | `database`, `kis_trader.engine.candle_rollup`, `kis_trader.utils.env`, `kis_trader.utils.logger`, `kis_trader.ws.kis_ws` | - | | `kis_trader/engine/program_filter.py` | 229 | `kis_trader.utils.env`, `kis_trader.ws.program_cache`, `kis_trader.ws.trigger_eval_recorder` | `trigger_eval_collect` | | `kis_trader/engine/range_break_engine.py` | 460 | `database`, `kis_trader.backtest.range_break_portfolio_backtest`, `kis_trader.engine.range_break_env_keys`, `kis_trader.strategies.breakout`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/range_break_env_keys.py` | 88 | - | - | | `kis_trader/engine/scalping_engine.py` | 1,346 | `database`, `kis_trader.backtest.scalping_portfolio_backtest`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.orderbook_filter`, `kis_trader.engine.strategy_eod`, `kis_trader.engine.tick_exit_common`, `kis_trader.utils.env`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/strategy_eod.py` | 149 | - | - | | `kis_trader/engine/tail_engine.py` | 2,788 | `database`, `kis_trader.backtest.backtest_env_timeline`, `kis_trader.backtest.trigger_snapshot_loader`, `kis_trader.engine.atr_series`, `kis_trader.engine.candle_rollup`, `kis_trader.engine.indicator_cache`, `kis_trader.engine.limit_entry_common`, `kis_trader.engine.mid_enroll_entry_gate`, `kis_trader.engine.orderbook_filter`, `kis_trader.engine.program_filter`, `kis_trader.engine.strategy_eod`, `kis_trader.engine.tail_env_keys`, `kis_trader.engine.tail_tick_replay`, `kis_trader.engine.tick_exit_common`, `kis_trader.engine.whipsaw_filter`, `kis_trader.utils.env`, `kis_trader.utils.position_sizing`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/tail_env_keys.py` | 471 | `database`, `kis_trader.utils.env` | - | | `kis_trader/engine/tail_tick_replay.py` | 303 | `kis_trader.backtest.shared_ticks`, `kis_trader.engine.candle_rollup`, `kis_trader.engine.limit_entry_common`, `kis_trader.utils.env` | - | | `kis_trader/engine/tick_exit_common.py` | 384 | `kis_trader.backtest.shared_ticks`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.whipsaw_filter`, `kis_trader.utils.env`, `kis_trader.utils.trade_time` | - | | `kis_trader/engine/trigger_eval_collect.py` | 76 | `kis_trader.utils.env` | - | | `kis_trader/engine/updown_box.py` | 958 | - | `scalping_engine`, `strategies`, `utils` | | `kis_trader/engine/us_momentum_env.py` | 193 | `kis_trader.utils.env` | - | | `kis_trader/engine/us_momentum_env_keys.py` | 296 | `kis_trader.utils.env` | - | | `kis_trader/engine/whipsaw_filter.py` | 570 | `kis_trader.backtest.shared_ticks`, `kis_trader.utils.env` | - | | `kis_trader/execution/__init__.py` | 5 | - | `kis_client`, `order_manager` | | `kis_trader/execution/account_cash.py` | 174 | - | `utils` | | `kis_trader/execution/kis_client.py` | 1,553 | `kis_trader.utils.api_reject_log`, `kis_trader.utils.non_stock` | `kis_token_manager`, `pandas`, `utils` | | `kis_trader/execution/order_manager.py` | 2,381 | `kis_trader.engine.post_sell_candle_backfill`, `kis_trader.engine.us_momentum_env_keys`, `kis_trader.utils.api_reject_log` | `account_cash`, `database`, `kis_client`, `orderbook_sell`, `utils` | | `kis_trader/execution/orderbook_sell.py` | 131 | - | `utils` | | `kis_trader/execution/orphan_reconcile.py` | 571 | - | `engine`, `utils` | | `kis_trader/main.py` | 2,353 | - | `database`, `engine`, `execution`, `network`, `permanent_subs`, `strategies`, `utils`, `ws` | | `kis_trader/network/__init__.py` | 4 | - | `ws_manager` | | `kis_trader/network/condition_manager.py` | 446 | - | `utils` | | `kis_trader/network/kiwoom_condition_manager.py` | 790 | - | `condition_manager`, `utils`, `websocket`, `ws` | | `kis_trader/network/ls_chart.py` | 239 | `database` | `pandas`, `utils`, `ws` | | `kis_trader/network/ls_condition_manager.py` | 821 | `kis_trader.network.ls_token` | `condition_manager`, `utils` | | `kis_trader/network/ls_token.py` | 231 | `kis_trader.utils.env` | `requests` | | `kis_trader/network/ls_ws_validator.py` | 168 | - | `utils` | | `kis_trader/network/market_guard.py` | 572 | - | `utils` | | `kis_trader/network/ranking_manager.py` | 350 | - | `utils` | | `kis_trader/network/ws_manager.py` | 1,849 | `kis_trader.share.stock_share` | `permanent_subs`, `utils`, `ws` | | `kis_trader/network/ws_validator.py` | 227 | - | `utils` | | `kis_trader/scan/__init__.py` | 1 | - | - | | `kis_trader/scan/dart_order_tracker.py` | 642 | `database`, `kis_trader.database.db_manager`, `kis_trader.scan.dart_watchlist`, `kis_trader.utils.env`, `kis_trader.utils.logger`, `kis_trader.utils.request_handler` | `argparse`, `zipfile` | | `kis_trader/scan/dart_watchlist.py` | 168 | `kis_trader.utils.env`, `kis_trader.utils.logger` | - | | `kis_trader/scripts/__init__.py` | 5 | - | - | | `kis_trader/scripts/apply_unified_risk_env.py` | 81 | `database` | - | | `kis_trader/scripts/approx_param_search_from_log.py` | 131 | `kis_trader.database.db_manager` | `argparse` | | `kis_trader/scripts/backfill_trigger_eval_from_log.py` | 318 | `kis_trader.database.db_manager` | `argparse` | | `kis_trader/scripts/compare_momentum_scan_memo.py` | 233 | `kis_trader.backtest`, `kis_trader.backtest.momentum_backtest_common`, `kis_trader.backtest.param_search_momentum` | `argparse` | | `kis_trader/scripts/fill_kiwoom_candles.py` | 405 | `database`, `kis_trader.utils.env`, `kis_trader.ws.kis_ws` | `argparse` | | `kis_trader/scripts/fill_stock_share_meta.py` | 190 | `database`, `kis_trader.share.stock_share`, `kis_trader.utils.env`, `kis_trader.ws.kis_ws` | `argparse` | | `kis_trader/scripts/migrate_split_env_config.py` | 105 | `database` | `config_schema` | | `kis_trader/scripts/prune_env_config_strategy_columns.py` | 188 | `database`, `kis_trader.utils.env` | `argparse`, `config_schema` | | `kis_trader/scripts/rebuild_universe_history_from_logs.py` | 418 | `database`, `kis_trader.database.db_manager` | `argparse` | | `kis_trader/scripts/show_account_snapshot.py` | 323 | `kis_trader.execution.kis_client`, `kis_trader.utils.env` | `argparse` | | `kis_trader/scripts/test_kis_ws_diagnostic.py` | 403 | `kis_trader.execution.kis_client`, `kis_trader.utils.env` | `argparse`, `requests`, `websocket` | | `kis_trader/scripts/verify_three_paths.py` | 231 | `kis_trader.backtest.param_search_scalping`, `kis_trader.engine.momentum_engine`, `kis_trader.engine.scalping_engine`, `kis_trader.engine.tail_engine`, `kis_trader.strategies.breakout`, `kis_trader.utils.env` | `backtest_web`, `scalping_engine` | | `kis_trader/share/__init__.py` | 1 | - | - | | `kis_trader/share/stock_share.py` | 210 | `kis_trader.utils.env`, `kis_trader.utils.logger` | - | | `kis_trader/strategies/__init__.py` | 30 | - | `base`, `breakout`, `dart_strategy`, `dbband_strategy`, `momentum`, `range_break`, `scalping`, `tail_catch`, `updow_strategy`, `us_momentum` | | `kis_trader/strategies/base.py` | 1,126 | `kis_trader.engine.ls_feed_gate`, `kis_trader.engine.mid_enroll_entry_gate` | `backtest`, `database`, `engine`, `execution`, `network`, `utils` | | `kis_trader/strategies/breakout.py` | 2,047 | `kis_trader.backtest.breakout_portfolio_backtest`, `kis_trader.backtest.shared_ticks`, `kis_trader.engine.tail_tick_replay`, `kis_trader.utils.env`, `kis_trader.utils.trade_time` | `base`, `engine`, `share`, `utils` | | `kis_trader/strategies/dart_strategy.py` | 248 | - | `base`, `engine`, `scan`, `utils` | | `kis_trader/strategies/dbband_stock_cfg.py` | 343 | - | `engine`, `holding_bot`, `utils` | | `kis_trader/strategies/dbband_strategy.py` | 228 | - | `base`, `dbband_stock_cfg`, `engine`, `utils` | | `kis_trader/strategies/momentum.py` | 360 | `kis_trader.engine.tail_tick_replay` | `base`, `engine`, `utils` | | `kis_trader/strategies/range_break.py` | 303 | - | `base`, `engine`, `utils` | | `kis_trader/strategies/scalping.py` | 434 | `kis_trader.engine.tail_tick_replay` | `base`, `engine`, `utils` | | `kis_trader/strategies/tail_catch.py` | 503 | `kis_trader.engine.tail_tick_replay` | `base`, `engine`, `execution`, `utils` | | `kis_trader/strategies/updow_buy.py` | 1,383 | `kis_trader.engine.scalping_engine` | `bisect`, `engine`, `utils` | | `kis_trader/strategies/updow_holding_cfg.py` | 590 | - | `engine`, `holding_bot`, `updow_buy`, `utils` | | `kis_trader/strategies/updow_strategy.py` | 769 | - | `base`, `engine`, `execution`, `updow_buy`, `updow_holding_cfg`, `updown_box_stock_cfg`, `updown_scan`, `updown_watchlist`, `utils` | | `kis_trader/strategies/updown_box_stock_cfg.py` | 221 | - | - | | `kis_trader/strategies/updown_feed.py` | 198 | - | `utils` | | `kis_trader/strategies/updown_scan.py` | 154 | - | `engine`, `updown_watchlist`, `utils` | | `kis_trader/strategies/updown_watchlist.py` | 419 | - | `utils` | | `kis_trader/strategies/us_momentum.py` | 1,123 | `database`, `kis_trader.engine.tail_tick_replay` | `base`, `engine`, `execution`, `momentum`, `permanent_subs`, `us_momentum_stock_cfg`, `utils` | | `kis_trader/strategies/us_momentum_stock_cfg.py` | 378 | - | `permanent_subs` | | `kis_trader/utils/__init__.py` | 1 | - | - | | `kis_trader/utils/api_reject_log.py` | 242 | `kis_trader.utils.env` | - | | `kis_trader/utils/env.py` | 159 | `database` | - | | `kis_trader/utils/kis_ws_session_windows.py` | 149 | - | `env`, `session_hm` | | `kis_trader/utils/ls_ws_session_windows.py` | — | - | `env`, `session_hm` | | `kis_trader/utils/kr_trading_day.py` | 232 | `kis_trader.utils.env` | - | | `kis_trader/utils/live_portfolio_common.py` | 328 | - | `backtest`, `utils` | | `kis_trader/utils/logger.py` | 219 | - | `env`, `requests` | | `kis_trader/utils/non_stock.py` | 157 | - | `env` | | `kis_trader/utils/position_sizing.py` | 41 | - | `utils` | | `kis_trader/utils/request_handler.py` | 208 | - | `logger`, `requests` | | `kis_trader/utils/session_hm.py` | 26 | - | - | | `kis_trader/utils/stock_name.py` | 97 | - | - | | `kis_trader/utils/strategy_ids.py` | 124 | - | - | | `kis_trader/utils/trade_time.py` | 32 | - | - | | `kis_trader/utils/universe_source.py` | 59 | - | `env` | | `kis_trader/utils/usd_krw_fx.py` | 410 | `kis_trader.utils.env`, `kis_trader.utils.request_handler` | - | | `kis_trader/web/live_config_schema.py` | 915 | `kis_trader.engine.orderbook_env` | - | | `kis_trader/ws/__init__.py` | 22 | - | `kis_ws`, `kiwoom_ws`, `tick_recorder` | | `kis_trader/ws/kis_ws.py` | 2,656 | `kis_trader.engine.candle_rollup`, `kis_trader.utils.env`, `kis_trader.utils.kis_ws_session_windows` | `kis_approval_manager`, `kis_long_ver1`, `pandas`, `requests`, `websocket` | | `kis_trader/ws/kis_ws_overseas.py` | 591 | `kis_trader.utils.env`, `kis_trader.utils.kis_ws_session_windows` | `kis_approval_manager`, `requests`, `websocket` | | `kis_trader/ws/kiwoom_ws.py` | 938 | `kis_trader.utils.env` | `kis_long_ver1`, `kis_ws`, `orderbook_cache`, `program_cache`, `websocket` | | `kis_trader/ws/ls_ws.py` | — | `database`, `kis_trader.network.ls_chart`, `kis_trader.network.ls_token`, `kis_trader.utils.env`, `kis_trader.utils.ls_ws_session_windows`, `kis_trader.ws.orderbook_cache` | `requests`, `websocket` | | `kis_trader/ws/orderbook_cache.py` | 287 | - | - | | `kis_trader/ws/program_cache.py` | 157 | - | - | | `kis_trader/ws/tick_recorder.py` | 287 | - | `utils` | | `kis_trader/ws/trigger_eval_recorder.py` | 270 | - | `orderbook_cache`, `program_cache`, `utils` | | `kis_trader/ws/trigger_snapshot_recorder.py` | 268 | - | `orderbook_cache`, `program_cache`, `utils` | | `kis_ws.py` | 3 | `kis_trader.ws.kis_ws` | - | | `kiwoom_rest_api/__init__.py` | 0 | - | - | | `kiwoom_rest_api/api.py` | 0 | - | - | | `kiwoom_rest_api/api_async.py` | 0 | - | - | | `kiwoom_rest_api/auth/__init__.py` | 0 | - | - | | `kiwoom_rest_api/auth/token.py` | 109 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/cli/__init__.py` | 0 | - | - | | `kiwoom_rest_api/cli/main.py` | 88 | - | `kiwoom_rest_api`, `rich`, `typer` | | `kiwoom_rest_api/config.py` | 60 | - | - | | `kiwoom_rest_api/core/__init__.py` | 0 | - | - | | `kiwoom_rest_api/core/async_client.py` | 49 | - | `httpx`, `kiwoom_rest_api` | | `kiwoom_rest_api/core/base.py` | 224 | - | `httpx`, `kiwoom_rest_api` | | `kiwoom_rest_api/core/base_api.py` | 56 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/core/sync_client.py` | 43 | - | `httpx`, `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/__init__.py` | 0 | - | - | | `kiwoom_rest_api/koreanstock/account.py` | 2,050 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/analysis.py` | 108 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/chart.py` | 739 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/credit_order.py` | 291 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/elw.py` | 1,113 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/etf.py` | 621 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/foreign_institution.py` | 234 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/investor.py` | 115 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/market_condition.py` | 1,111 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/order.py` | 317 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/rank_info.py` | 2,311 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/sector.py` | 507 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/slb.py` | 287 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/stockinfo.py` | 1,608 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/theme.py` | 175 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/koreanstock/trading.py` | 107 | - | `kiwoom_rest_api` | | `kiwoom_rest_api/trader.py` | 325 | - | `numpy`, `pandas` | | `kiwoom_rest_api/websocket.py` | 321 | - | `config`, `websockets` | | `kiwoom_rest_api/websocket_constants.py` | 186 | - | - | | `kiwoom_rest_api/websocket_helper.py` | 283 | - | `websocket`, `websocket_constants` | | `kiwoom_trader_dual.py` | 1,131 | - | `dotenv`, `kiwoom_rest_api`, `numpy`, `pandas`, `requests` | | `kiwoom_trader_ver2.py` | 3,179 | `database` | `dotenv`, `export_sniper`, `kiwoom_rest_api`, `ml_predictor`, `news_analyzer`, `numpy`, `pandas`, `requests`, `risk_manager`, `smart_executor`, `trend_divergence` | | `kiwoom_universe_scanner.py` | 684 | `database` | `dotenv`, `kiwoom_rest_api`, `requests` | | `kiwoom_ws.py` | 3 | `kis_trader.ws.kiwoom_ws` | - | | `kiwwom_trader/config.py` | 43 | - | `dotenv` | | `kiwwom_trader/run.py` | 23 | - | `config`, `scalping_bot` | | `kiwwom_trader/scalping_bot.py` | 261 | `database` | `config`, `kiwoom_rest_api`, `scalping_logic`, `ws_candle_agg` | | `kiwwom_trader/scalping_logic.py` | 45 | `kis_trader.engine` | - | | `kiwwom_trader/ws_candle_agg.py` | 122 | - | `kiwoom_rest_api` | | `ls_sample/sample_python/balance_window.py` | 135 | - | `PySide2`, `pythoncom`, `tr`, `win32com` | | `ls_sample/sample_python/button_holder.py` | 15 | - | - | | `ls_sample/sample_python/main.py` | 303 | - | `PySide2`, `apscheduler`, `balance_window`, `dotenv`, `main_window`, `pythoncom`, `tr`, `win32com` | | `ls_sample/sample_python/main_window.py` | 272 | - | `PySide2`, `dotenv`, `order_window`, `pythoncom`, `search_window`, `tr`, `win32com` | | `ls_sample/sample_python/order_window.py` | 351 | - | `PySide2`, `pythoncom`, `tr`, `win32com` | | `ls_sample/sample_python/rockwidget.py` | 22 | - | - | | `ls_sample/sample_python/search_window.py` | 130 | - | `PySide2`, `pythoncom`, `tr`, `ui`, `win32com` | | `ls_sample/sample_python/second_window.py` | 31 | - | - | | `ls_sample/sample_python/slider.py` | 17 | - | - | | `ls_sample/sample_python/test.py` | 100 | - | - | | `ls_sample/sample_python/third_window.py` | 31 | - | - | | `ls_sample/sample_python/tr/k3_real.py` | 63 | - | - | | `ls_sample/sample_python/tr/s3_real.py` | 63 | - | - | | `ls_sample/sample_python/tr/tr_0424.py` | 813 | - | `apscheduler`, `dotenv`, `pythoncom`, `tr`, `win32com` | | `ls_sample/sample_python/tr/tr_1857.py` | 245 | - | - | | `ls_sample/sample_python/tr/tr_cancel_order.py` | 118 | - | `dotenv` | | `ls_sample/sample_python/tr/tr_kh.py` | 72 | - | - | | `ls_sample/sample_python/tr/tr_master.py` | 67 | - | - | | `ls_sample/sample_python/tr/tr_order.py` | 197 | - | `PySide2`, `balance_window`, `dotenv`, `pythoncom`, `tr`, `win32com` | | `ls_sample/sample_python/tr/tr_pending.py` | 326 | - | `PySide2`, `balance_window`, `dotenv`, `pythoncom`, `tr`, `win32com` | | `ls_sample/sample_python/tr/tr_redo_order.py` | 115 | - | `dotenv` | | `ls_sample/sample_python/tr/tr_sc0.py` | 108 | - | - | | `ls_sample/sample_python/tr/tr_sc1.py` | 97 | - | - | | `ls_sample/sample_python/tr/tr_sc2.py` | 82 | - | - | | `ls_sample/sample_python/tr/tr_sc3.py` | 88 | - | - | | `ls_sample/sample_python/ui/ui_search_window.py` | 67 | - | `PySide2` | | `ls_sample/sample_python/ui/ui_second_window.py` | 35 | - | `PySide2` | | `ls_sample/sample_python/ui/ui_test.py` | 65 | - | - | | `ls_sample/sample_python/ui/ui_third_window.py` | 34 | - | - | | `mcp/kiwoom-docs-mcp/server.py` | 448 | - | `fastmcp` | | `mcp/ls-docs-mcp/fetch_spec.py` | 269 | - | `argparse` | | `mcp/ls-docs-mcp/server.py` | 417 | - | `fastmcp` | | `ml_predictor.py` | 230 | `database` | `numpy`, `pandas`, `sklearn` | | `mm_butler.py` | 1,235 | `database`, `kis_trader.utils.env` | `anthropic`, `google`, `kis_long_ver2`, `news_analyzer`, `requests` | | `mm_remote.py` | 290 | `database` | `kis_long_ver1`, `requests` | | `modify_db_schema.py` | 37 | - | `sqlite3` | | `momentum_engine.py` | 3 | `kis_trader.engine.momentum_engine` | - | | `news_analyzer.py` | 215 | - | `anthropic`, `bs4`, `requests` | | `permanent_subs.py` | 319 | `kis_trader.utils.env` | - | | `remove/legacy_standalone_bots/ai_recommend_notice.py` | 337 | `database` | `google`, `requests` | | `remove/legacy_standalone_bots/back_test.py` | 164 | - | `sqlite3` | | `remove/legacy_standalone_bots/kis_scalping_ver1.py` | 1,658 | `database` | `google`, `kis_token_manager`, `kis_ws`, `ml_predictor`, `pandas`, `requests`, `risk_manager` | | `remove/legacy_standalone_bots/kis_scalping_ver2.py` | 1,596 | `database` | `google`, `kis_token_manager`, `kis_ws`, `ml_predictor`, `pandas`, `requests`, `risk_manager`, `scalping_engine` | | `remove/legacy_standalone_bots/kis_short_ver1.py` | 3,826 | `database` | `google`, `hmac`, `ml_predictor`, `mm_remote`, `pandas`, `requests`, `risk_manager` | | `remove/legacy_standalone_bots/kis_short_ver2.py` | 3,885 | `database` | `google`, `hmac`, `kis_token_manager`, `kis_ws`, `ml_predictor`, `mm_remote`, `pandas`, `requests`, `risk_manager` | | `remove/legacy_standalone_bots/kis_short_ver3.py` | 3,610 | `database` | `google`, `hmac`, `kis_token_manager`, `kis_ws`, `ml_predictor`, `mm_remote`, `pandas`, `requests`, `risk_manager`, `tail_engine` | | `remove/legacy_standalone_bots/update_env_short.py` | 140 | `database` | - | | `remove/legacy_standalone_bots/updowbuyy.py` | 36 | `kis_trader.strategies.updow_buy` | - | | `risk_manager.py` | 307 | - | `numpy`, `pandas` | | `sample_python/balance_window.py` | 135 | - | `PySide2`, `pythoncom`, `tr`, `win32com` | | `sample_python/button_holder.py` | 15 | - | - | | `sample_python/main.py` | 303 | - | `PySide2`, `apscheduler`, `balance_window`, `dotenv`, `main_window`, `pythoncom`, `tr`, `win32com` | | `sample_python/main_window.py` | 272 | - | `PySide2`, `dotenv`, `order_window`, `pythoncom`, `search_window`, `tr`, `win32com` | | `sample_python/order_window.py` | 351 | - | `PySide2`, `pythoncom`, `tr`, `win32com` | | `sample_python/rockwidget.py` | 22 | - | - | | `sample_python/search_window.py` | 130 | - | `PySide2`, `pythoncom`, `tr`, `ui`, `win32com` | | `sample_python/second_window.py` | 31 | - | - | | `sample_python/slider.py` | 17 | - | - | | `sample_python/test.py` | 100 | - | - | | `sample_python/third_window.py` | 31 | - | - | | `sample_python/tr/k3_real.py` | 63 | - | - | | `sample_python/tr/s3_real.py` | 63 | - | - | | `sample_python/tr/tr_0424.py` | 813 | - | `apscheduler`, `dotenv`, `pythoncom`, `tr`, `win32com` | | `sample_python/tr/tr_1857.py` | 245 | - | - | | `sample_python/tr/tr_cancel_order.py` | 118 | - | `dotenv` | | `sample_python/tr/tr_kh.py` | 72 | - | - | | `sample_python/tr/tr_master.py` | 67 | - | - | | `sample_python/tr/tr_order.py` | 197 | - | `PySide2`, `balance_window`, `dotenv`, `pythoncom`, `tr`, `win32com` | | `sample_python/tr/tr_pending.py` | 326 | - | `PySide2`, `balance_window`, `dotenv`, `pythoncom`, `tr`, `win32com` | | `sample_python/tr/tr_redo_order.py` | 115 | - | `dotenv` | | `sample_python/tr/tr_sc0.py` | 108 | - | - | | `sample_python/tr/tr_sc1.py` | 97 | - | - | | `sample_python/tr/tr_sc2.py` | 82 | - | - | | `sample_python/tr/tr_sc3.py` | 88 | - | - | | `sample_python/ui/ui_search_window.py` | 67 | - | `PySide2` | | `sample_python/ui/ui_second_window.py` | 35 | - | `PySide2` | | `sample_python/ui/ui_test.py` | 65 | - | - | | `sample_python/ui/ui_third_window.py` | 34 | - | - | | `scalping_engine.py` | 3 | `kis_trader.engine.scalping_engine` | - | | `scripts/_diag_mom_2min_gap.py` | 124 | `database` | - | | `scripts/_diag_mom_tick_today.py` | 99 | `database` | - | | `scripts/_diag_scalp_live_bt_20260716.py` | 317 | `database`, `kis_trader.backtest.scalping_backtest_common`, `kis_trader.engine.scalping_engine` | - | | `scripts/append_tail_optuna_compare.py` | 180 | `database`, `kis_trader.backtest`, `kis_trader.engine` | `argparse` | | `scripts/backfill_trade_candles.py` | 70 | `database`, `kis_trader.engine.post_sell_candle_backfill` | `argparse` | | `scripts/collect_ls_condition_history.py` | 654 | `database`, `kis_trader.utils.env` | `argparse`, `websocket` | | `scripts/collect_ls_universe_history.py` | 401 | `database` | `argparse` | | `scripts/copy_env_row_to_latest.py` | 0 | - | - | | `scripts/kis_error_watch_mm.py` | 387 | `kis_trader.utils.env`, `kis_trader.utils.logger` | `argparse`, `select` | | `scripts/market_open_sim_smoke.py` | 362 | `kis_trader.backtest`, `kis_trader.engine`, `kis_trader.execution.kis_client`, `kis_trader.network.market_guard`, `kis_trader.scripts`, `kis_trader.strategies`, `kis_trader.strategies.base`, `kis_trader.utils.env`, `kis_trader.utils.kr_trading_day` | `backtest_web`, `unittest` | | `scripts/momentum_ratchet_ab_715.py` | 191 | `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_momentum`, `kis_trader.backtest.param_search_momentum`, `kis_trader.utils.env` | - | | `scripts/post_optuna_mid_enroll_verify.py` | 214 | `database`, `kis_trader.backtest`, `kis_trader.backtest.us_momentum_web_backtest`, `kis_trader.engine.momentum_engine`, `kis_trader.utils.env` | `argparse` | | `scripts/query_kiwoom_condition_snapshot.py` | 454 | `database`, `kis_trader.utils.env`, `kis_trader.ws.kis_ws` | `argparse`, `websocket` | | `scripts/run_strategy_backtest_cli.py` | 256 | `kis_trader.utils.kr_trading_day` | `argparse`, `backtest_web` | | `scripts/run_tail_backtest_cli.py` | 376 | `database`, `kis_trader.backtest`, `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.engine`, `kis_trader.engine.tail_tick_replay`, `kis_trader.utils.kr_trading_day`, `kis_trader.utils.stock_name` | `argparse` | | `scripts/smoke_candle_upsert_rollup.py` | 144 | `kis_trader.engine.candle_rollup`, `kis_trader.ws.kis_ws` | - | | `scripts/tail_live_bt_forensics.py` | 158 | `database`, `kis_trader.backtest`, `kis_trader.backtest.universe_timeline`, `kis_trader.engine`, `kis_trader.engine.tail_engine` | `argparse` | | `scripts/tail_symbol_gate_verify_20260709.py` | 126 | `database`, `kis_trader.backtest`, `kis_trader.engine`, `kis_trader.engine.tail_tick_replay` | - | | `scripts/verify_live_portfolio_align.py` | 125 | `kis_trader.strategies`, `kis_trader.utils.live_portfolio_common` | - | | `scripts/verify_optuna_tpe_apply_dryrun.py` | 153 | `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.param_search_apply_snapshot`, `kis_trader.backtest.param_search_scalping`, `kis_trader.backtest.tail_param_search` | `argparse` | | `scripts/verify_optuna_tpe_parity_checklist.py` | 283 | `kis_trader.backtest.backtest_portfolio_common`, `kis_trader.backtest.optuna_breakout_tpe_space`, `kis_trader.backtest.optuna_briefing`, `kis_trader.backtest.optuna_common`, `kis_trader.backtest.optuna_momentum_tpe_space`, `kis_trader.backtest.optuna_scalping_tpe_space`, `kis_trader.backtest.optuna_tail_tpe_space`, `kis_trader.backtest.optuna_tpe_common`, `kis_trader.utils.env` | `optuna` | | `smart_executor.py` | 259 | - | - | | `star.py` | 11 | - | - | | `tail_engine.py` | 3 | `kis_trader.engine.tail_engine` | - | | `test_kiwoom_token.py` | 339 | `database` | `argparse`, `getpass`, `requests` | | `test_kiwoom_ws.py` | 196 | `database`, `kis_trader.ws.kis_ws`, `kis_trader.ws.kiwoom_ws` | `argparse` | | `test_kiwoom_ws_sub_limit.py` | 453 | `database`, `kis_trader.utils.env`, `kis_trader.ws.kis_ws`, `kis_trader.ws.kiwoom_ws` | `argparse` | | `test_ls_ws.py` | 998 | `database` | `argparse`, `requests`, `websocket` | | `test_psearch.py` | 299 | `kis_trader.execution.kis_client`, `kis_trader.utils.env` | `argparse` | | `tmp_mom_smoke_web.py` | 46 | - | `backtest_web` | | `trend_divergence.py` | 248 | - | `pandas`, `pytrends`, `yfinance` | | `update_env.py` | 145 | `database` | - | | `update_env_etf.py` | 61 | `database` | - | | `update_env_simple.py` | 71 | `database` | - | --- ## 수동 노트: 조건검색 유니버스 (LS / 키움) — 2026-08-04 > AST 자동생성 본문과 별도. 재생성 시 이 섹션을 유지·재첨부할 것. ### 허브 파일 | 파일 | 역할 | |------|------| | `kis_trader/network/condition_common.py` | **필수 공통만** — `JOB_KO`, `normalize_job_flag`, `job_kind`, `rows_for_codes` | | `kis_trader/network/condition_job_events.py` | 진입/재진입/이탈 → `condition_job_events` | | `kis_trader/network/condition_manager.py` | 멤버십 `_apply_result` (push/pop) · KIS REST 폴링 본체 | | `kis_trader/network/kiwoom_condition_manager.py` | 키움 CNSRREQ 시드 + REAL I/D | | `kis_trader/network/ls_condition_manager.py` | LS t1866→**t1859(REST 시드)**→t1860/AFR(델타) | 시드·프로토콜(t1859 / CNSRREQ / AFR / REAL)은 **합치지 않음** (브로커 분기 유발). ### LS 시드 공백 (키움에 없던 실패 모드) 1. t1859 = REST 원샷. `rsp_cd=09000` 검색결과없음 가능 (HTS UI·키움 조건명과 **다른 스냅**). 2. AFR = N/R/O 델타만 — **풀목록 재전송 없음**. 3. `LS_CONDITION_SNAPSHOT_REFRESH_SEC=0` (기본) = 주기 전체교체 OFF (정상). 4. RAM=0 이면 **`LS_T1859_EMPTY_RETRY_SEC`(기본 15)** 로 t1859 재시도. - **`=0` = 재시도 OFF** (무한 연타 아님 · 영구 0 위험). - RAM>0 되면 재시도 안 함. REST 폭주 방지. 5. 빈 t1859 결과는 `ls_candidates_history` 에 **저장하지 않음**. ### 관련 ENV | 키 | 기본 | 의미 | |----|------|------| | `LS_CONDITION_SNAPSHOT_REFRESH_SEC` | 0 | 주기 t1859 (AFR live+종목있으면 스킵) | | `LS_T1859_EMPTY_RETRY_SEC` | 1 | RAM0만 재시드(초). 공식 t1859 1건/초 · 실간격≥TR_GAP(1.1). 0=OFF | | `LS_T1859_ALLOW_SHRINK` | false | t1859 축소 전체교체 허용 | | `CONDITION_JOB_EVENTS_SAVE` | true | job 이벤트 INSERT | 웹「조건 이벤트」탭: `/api/condition_job_events`, `/api/condition_parity`. ## 수동 노트: 호가필터 TTL (2026-08-15) > AST 재생성 시 이 섹션 유지. - 판정: `kis_trader/engine/orderbook_filter.py` `_fetch_snapshot` — `WS_ORDERBOOK_FILTER_MAX_AGE_SEC`(기본 0). 사진 없음+필터 ON → `WS_ORDERBOOK_FILTER_REJECT_IF_EMPTY`(기본 true). - 실매 매수·매도 현재가: `WSManager.get_price()` 생략=읽기 폴백 나이(`LIVE_FEED_FALLBACK_MAX_AGE_SEC` 기본 3초)로 메인→2차→3차. 한투 호가는 `kis_ws_ob`(2키)만 — 메인 `H0STASP0` 폴백 금지. 분봉 pick: `CANDLE_GARBAGE_FALLBACK` + `dedupe_by_read_pairs`(메인 WS→2차→LS→REST→rollup). `max_age_sec=None` 만 마지막 RAM(`get_price_last`). 매도 4차는 `live_sell_price.py` 키움 ka10007 + 쿨다운(시세 실키, `KIS_MOCK` 모의키 금지). 한투 `inquire_price` 60초 캐시 금지. EOD는 마지막 WS→REST→매수가 폴백. 호가 `get_orderbook_snapshot` 도 같은 폴백 체인 — `FILTER_MAX_AGE=0` 과 저장 TTL 을 합쳐 만료=`None`=필터 ON 통과 구멍을 만들지 말 것. - 저장: `trigger_snapshot_recorder` — `WS_ORDERBOOK_TICK_MAX_AGE_SEC`(기본 30). **공유 금지.** - 캐시: `orderbook_cache.get(..., max_age_sec)` — `<=0` 이면 나이 무시. - 후처리 격자: `optuna_common.ensure_optuna_gate_env_defaults` `OPTUNA_OB_ENTRY_*` / `ASK_MULT_*`. - 구 JSON 후처리만: `optuna_rerun_postprocess.py`. ## 수동 노트: 루트 레거시 파일 (2026-08-17) > AST 재생성 시 이 섹션 유지. 실매 `kis_trader.main` 이 안 쓰는 파일은 `remove/` (**나중에 통째 삭제**). 웹·알람이 **아직 쓰는** `holding_bot` / `news_analyzer` / `kis_long_ver*` 는 `legacy/` (`ensure_legacy_root`). `remove` 를 지워도 `legacy/` 는 남긴다. 상세 `legacy/README.md`, `remove/README.md`.