# Implementation Log ## 2026-06-10 - Enabled wake-from-sleep behavior for Scheduler tasks: - `scripts/setup_scheduler.ps1` now registers stock tasks with `WakeToRun`. - Re-registered tasks and verified `WakeToRun=True` and `StartWhenAvailable=True`. - Hardened KIS request throttling: - Mock request spacing default: 1.7s. - Real request spacing default: 0.35s, rate limit default: 3/sec. - Added local `.env` override support for request spacing/rate limits. - Added global cooldown after rate-limit responses. - Updated the 2026-06-10 daily report to reflect repeated KIS rate-limit retries. ## 2026-06-09 - Re-registered all Windows Scheduler tasks from the live project path: - `C:\Users\whdwo\Desktop\coding\stockbot_v3` - Verified every task action script exists at that path. - Fixed watchdog end-of-day behavior: - `StockBot_Watchdog` now runs 09:00-15:05 every 5 minutes. - `scripts/_watchdog.py` excludes 15:10 so normal daily settlement shutdown is not restarted. - `scripts/run_watchdog.ps1` skips after 15:09:59. - Hardened target calculation: - Targets are cleared before recalculation. - `open=0` is ignored before market open. - Delayed restarts after 08:50 recalculate targets immediately. - Updated operational docs and the 2026-06-09 daily report. ## 2026-05-28 - Applied the approved 2026-05-28 strategy update: - `ENTRY_START` changed from `"09:15"` to `"09:20"`. - `FORCE_EXIT = "14:50"` was verified unchanged. - Fixed the `avoid_sectors` runtime bug: - `app/main.py` now passes `sector` into `VolatilityBreakout.check_entry()`. - Added `ticker_sectors` cache support from ranking rows when sector fields exist. - Added conservative name-based avoid-sector hints for cases such as construction names when no sector field is available. - Repaired the external-data pretraining path: - `scripts/collect_daily_features.py` now falls back to KIS daily OHLCV when pykrx fails. - `scripts/collect_minute_data.py` excludes ETF/ETN by default and collects multiple intraday windows from 09:30 to 14:00. - `scripts/build_external_training_dataset.py` now uses prior daily OHLCV rows for breakout targets instead of same-day OHLCV. - `scripts/run_training_pipeline.ps1` builds external rows with `--all-minutes` for pretraining. - Removed model leakage: - Excluded future/outcome columns from training features: `price_*`, `ret_*`, `mfe_*`, `mae_*`, `pnl`, and `exit_price`. - Fixed PowerShell training pipeline execution: - Replaced `$Args` parameter usage with `$StepArgs` to avoid PowerShell automatic-variable collision. - Prevented nonzero stderr output from stopping required exit-code handling. - Normalized Python step logging to UTF-8 append. - Removed unused helper: - `scripts/_send_midday_discord.py`. Validation performed: - `python -m compileall app scripts` passed. - Manual external daily collection passed through KIS fallback. - Manual KIS minute collection saved 11 regular-stock CSV files for 2026-05-28. - `data/external_training_dataset.csv` generated 3,146 rows. - `data/training_dataset.csv` generated 10 bot-trade rows. - `python scripts/train_ai_model.py` generated `models/scalping_model.joblib` and metrics. - `powershell -ExecutionPolicy Bypass -File scripts\run_training_pipeline.ps1` passed end-to-end. Latest training metrics: - `label_stop_loss`: rows 3,156, accuracy 0.750, precision 0.450, ROC-AUC 0.851. - `label_win`: rows 3,156, accuracy 0.635, precision 0.492, ROC-AUC 0.719. Open risks: - AI remains observation-only and must not block entries, resize trades, or override exits. - Training is still dominated by external pretraining rows; actual bot-labeled rows are only 10. - Same-day pykrx data may fail; KIS fallback is active but index rows can be empty. - Real-cash trading remains unapproved. ## 2026-05-27 - Reviewed the stock scalping bot structure and moved it toward an AI-training-ready paper-trading platform. - Added database tables for AI training: - `entry_snapshots` - `post_entry_snapshots` - Added entry-time data capture after successful buys. - Added post-entry sampling at 60s, 180s, 300s, and 600s. - Fixed partial-exit accounting so partial TP1 exits no longer close the whole trade row. - Relaxed strict entry-limit enforcement during paper-trading data collection while preserving warning logs. - Added daily/export training scripts: - `scripts/export_training_dataset.py` - `scripts/collect_daily_features.py` - `scripts/collect_minute_data.py` - `scripts/build_external_training_dataset.py` - Added ML training and runtime support: - `app/ml/features.py` - `app/ml/predictor.py` - `scripts/train_ai_model.py` - Added observation-only AI scoring: - Runtime scores are recorded only when a trained model exists. - AI scores do not block entries, change sizing, or override exits. - Added daily training pipeline: - `scripts/run_training_pipeline.ps1` - Registered and verified Windows Scheduler tasks: - `StockBot_Morning` - `StockBot_Watchdog` - `StockBot_Midday` - `StockBot_Evening` - `StockBot_Training` - Rewrote scheduler setup to avoid hardcoded broken Korean paths: - `scripts/setup_scheduler.ps1` - Rewrote watchdog wrapper with trading-day and time-window checks: - `scripts/run_watchdog.ps1` - Added dependency portability: - Root `requirements.txt` - `scripts/install_dependencies.ps1` - `scripts/download_dependencies.ps1` - `vendor/wheels` wheelhouse for Windows/Python 3.11 - Updated operational docs: - `README.md` - `CLAUDE.md` - `reports/daily/2026-05-27.md` Validation performed: - Python compile check passed. - DB migration checked. - AI score snapshot insert checked with a temporary DB. - Training script checked with empty dataset. - Scheduler registration checked. - PowerShell script parse check passed. Open risks: - KIS minute endpoint still needs live response verification. - Early model quality is expected to be weak until enough labeled rows exist. - External minute data is useful for pretraining, not final bot-trade truth. - Real-cash trading still needs stronger fill, partial-fill, unfilled-order, cancel/replace, and recovery handling. - Raspberry Pi dependency packaging needs a Linux/ARM-specific setup. - Approved and applied `ENTRY_START = "09:15"` after the 2026-05-27 evening review. - Reason: 09:05-09:06 generated four immediate SL trades and most of the daily loss. - Time-based sizing and time-based SL changes remain deferred. ### 2026-05-27 Strategy Approval Log - User approved Claude Evening Proposal 1. - Changed `app/config.py`: - Before: `ENTRY_START = "09:05"` - After: `ENTRY_START = "09:15"` - Rationale: - Four immediate SL trades occurred from 09:05:03 to 09:05:49. - Those four trades lost about `-183,969 KRW`. - This represented about 74.5% of the daily loss. - Deferred: - Time-based position-size reduction. - Time-based stop-loss adjustment. - Verification: - Python compile check passed. - Runtime import confirmed `ENTRY_START == "09:15"`. ## 2026-06-15 - Applied a stale breakout re-entry guard after reviewing the Samsung Electronics `TIME` re-entry. - Changed `app/strategy/volatility_breakout.py`: - `TIME` and `FORCE` final exits now mark the ticker as requiring a fresh breakout. - While that marker is active, a ticker is blocked with `재돌파 대기` if it remains above the same volatility breakout target. - The marker clears only after price moves back below the target, allowing a later fresh breakout entry. - Rationale: - The existing `current_price >= target` condition is the normal volatility breakout entry rule. - The bug was reusing a still-active same-day breakout signal after `TIME/FORCE` cooldown, not the first breakout itself. - This would have blocked the 2026-06-15 Samsung Electronics second entry after the first `TIME` exit. - Updated docs: - `reports/daily/2026-06-15.md` - `reports/proposals/2026-06-15_strategy_proposal.md`