$ErrorActionPreference = "Stop" $Root = Split-Path -Parent (Split-Path -Parent $MyInvocation.MyCommand.Path) Set-Location $Root . "$Root\scripts\stockbot_env.ps1" $Python = Resolve-StockBotPython -Project $Root $LogDir = Join-Path $Root "logs" New-Item -ItemType Directory -Force -Path $LogDir | Out-Null $LogPath = Join-Path $LogDir "training.log" function Write-Log { param([string]$Message) $Line = "[{0}] {1}" -f (Get-Date -Format "yyyy-MM-dd HH:mm:ss"), $Message Add-Content -Path $LogPath -Value $Line -Encoding UTF8 Write-Host $Line } function Invoke-PythonStep { param( [string]$Name, [string[]]$StepArgs, [bool]$Required = $true ) Write-Log $Name $PreviousErrorActionPreference = $ErrorActionPreference $ErrorActionPreference = "Continue" $Output = & $Python @StepArgs 2>&1 $ErrorActionPreference = $PreviousErrorActionPreference $Code = $LASTEXITCODE foreach ($Line in $Output) { Add-Content -Path $LogPath -Value $Line -Encoding UTF8 } if ($Code -ne 0) { $Message = "$Name failed with exit code $Code" if ($Required) { throw $Message } Write-Log "warning: $Message" } } try { Write-Log "training pipeline started" Write-Log "python resolved: $Python" $HolidayCheck = & $Python scripts\_is_trading_day.py 2>&1 if ($LASTEXITCODE -ne 0) { Write-Log "market closed - skipped ($HolidayCheck)" exit 0 } Write-Log "trading day check passed ($HolidayCheck)" Invoke-PythonStep -Name "collecting daily market features" -StepArgs @("scripts\collect_daily_features.py") -Required $false Invoke-PythonStep -Name "collecting KIS minute data" -StepArgs @("scripts\collect_minute_data.py", "--top", "30", "--real-quotes") -Required $false Invoke-PythonStep -Name "exporting bot training dataset" -StepArgs @("scripts\export_training_dataset.py", "data\training_dataset.csv") -Required $true Invoke-PythonStep -Name "building external training dataset" -StepArgs @("scripts\build_external_training_dataset.py", "--out", "data\external_training_dataset.csv", "--all-minutes") -Required $true Invoke-PythonStep -Name "training model" -StepArgs @("scripts\train_ai_model.py") -Required $true Write-Log "training pipeline finished" } catch { Write-Log "training pipeline failed: $($_.Exception.Message)" if ($_.ScriptStackTrace) { Add-Content -Path $LogPath -Value $_.ScriptStackTrace -Encoding UTF8 } throw }