Major Changes: - Migrated from 3-action TradingAction to 45-action FactoredAction - 45 actions: 5 exposure × 3 order types × 3 urgency levels - Absolute exposure model (target positions -1.0 to +1.0) - Transaction cost differentiation (Market 0.15%, LimitMaker 0.05%, IoC 0.10%) - Fixed action diversity threshold (1.11% → 0.5% for 45-action space) Bug Fixes: - Bug #15: Incomplete FactoredAction integration (code existed but unused) - Bug #16: Runtime crash in action diversity checking (hardcoded 3-action match) Code Changes (13 files, ~464 lines): - ml/src/dqn/action_space.rs: Core FactoredAction + 4 helper methods - ml/src/trainers/dqn.rs: Action diversity refactored (3→45 dynamic) - ml/src/dqn/reward.rs: calculate_reward() signature updated - ml/src/dqn/portfolio_tracker.rs: execute_action() absolute exposure - ml/src/dqn/dqn.rs: WorkingDQN action selection migrated - ml/tests/*.rs: 9 test files updated with FactoredAction assertions Test Results: - 1-epoch smoke test: 100% action diversity (45/45 actions, 80.2s) - 10-epoch production: 87.8% readiness (79/90 scorecard, 14.0 min) - Loss convergence: 96.9% reduction (119K → 3.6K) - Action diversity: 100% → 44% (healthy specialization) - Checkpoint reliability: 12/12 files saved (100%) - DQN tests: 195/195 passing (100%) - ML baseline: 1,514/1,515 passing (99.93%) Production Status: ✅ CERTIFIED (87.8% readiness) Go/No-Go: ✅ GO FOR 100-EPOCH PRODUCTION TRAINING 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
232 lines
6.0 KiB
YAML
232 lines
6.0 KiB
YAML
apiVersion: apps/v1
|
|
kind: StatefulSet
|
|
metadata:
|
|
name: broker-gateway-service
|
|
namespace: foxhunt
|
|
labels:
|
|
app: broker-gateway-service
|
|
component: broker
|
|
tier: backend
|
|
version: v1
|
|
spec:
|
|
serviceName: broker-gateway-service
|
|
replicas: 2
|
|
selector:
|
|
matchLabels:
|
|
app: broker-gateway-service
|
|
# Update strategy: rolling update with 1 pod at a time
|
|
updateStrategy:
|
|
type: RollingUpdate
|
|
rollingUpdate:
|
|
partition: 0
|
|
|
|
# Pod template
|
|
template:
|
|
metadata:
|
|
labels:
|
|
app: broker-gateway-service
|
|
component: broker
|
|
tier: backend
|
|
version: v1
|
|
annotations:
|
|
prometheus.io/scrape: "true"
|
|
prometheus.io/port: "9096"
|
|
prometheus.io/path: "/metrics"
|
|
spec:
|
|
# Security context for pod
|
|
securityContext:
|
|
runAsNonRoot: true
|
|
runAsUser: 1000
|
|
runAsGroup: 1000
|
|
fsGroup: 1000
|
|
|
|
# Service account for RBAC
|
|
serviceAccountName: broker-gateway-service
|
|
|
|
# Anti-affinity: prefer different nodes for high availability
|
|
affinity:
|
|
podAntiAffinity:
|
|
preferredDuringSchedulingIgnoredDuringExecution:
|
|
- weight: 100
|
|
podAffinityTerm:
|
|
labelSelector:
|
|
matchExpressions:
|
|
- key: app
|
|
operator: In
|
|
values:
|
|
- broker-gateway-service
|
|
topologyKey: kubernetes.io/hostname
|
|
|
|
# Init container: wait for database to be ready
|
|
initContainers:
|
|
- name: wait-for-postgres
|
|
image: busybox:1.36
|
|
command:
|
|
- 'sh'
|
|
- '-c'
|
|
- |
|
|
until nc -z postgres-service 5432; do
|
|
echo "Waiting for PostgreSQL..."
|
|
sleep 2
|
|
done
|
|
echo "PostgreSQL is ready"
|
|
|
|
- name: wait-for-redis
|
|
image: busybox:1.36
|
|
command:
|
|
- 'sh'
|
|
- '-c'
|
|
- |
|
|
until nc -z redis-service 6379; do
|
|
echo "Waiting for Redis..."
|
|
sleep 2
|
|
done
|
|
echo "Redis is ready"
|
|
|
|
# Main application container
|
|
containers:
|
|
- name: broker-gateway-service
|
|
image: jgrusewski/foxhunt-broker-gateway:latest
|
|
imagePullPolicy: Always
|
|
|
|
# Ports
|
|
ports:
|
|
- name: grpc
|
|
containerPort: 50056
|
|
protocol: TCP
|
|
- name: health
|
|
containerPort: 8086
|
|
protocol: TCP
|
|
- name: metrics
|
|
containerPort: 9096
|
|
protocol: TCP
|
|
|
|
# Environment variables from ConfigMap
|
|
envFrom:
|
|
- configMapRef:
|
|
name: broker-gateway-config
|
|
|
|
# Secret environment variables (CQG credentials)
|
|
env:
|
|
- name: CQG_USERNAME
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: broker-gateway-secret
|
|
key: cqg-username
|
|
- name: CQG_PASSWORD
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: broker-gateway-secret
|
|
key: cqg-password
|
|
- name: CQG_SENDER_COMP_ID
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: broker-gateway-secret
|
|
key: cqg-sender-comp-id
|
|
|
|
# Resource limits and requests
|
|
resources:
|
|
limits:
|
|
cpu: 2000m
|
|
memory: 512Mi
|
|
requests:
|
|
cpu: 500m
|
|
memory: 256Mi
|
|
|
|
# Liveness probe: check if service is alive
|
|
livenessProbe:
|
|
exec:
|
|
command:
|
|
- /usr/local/bin/grpc_health_probe
|
|
- -addr=localhost:50056
|
|
initialDelaySeconds: 30
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 3
|
|
successThreshold: 1
|
|
|
|
# Readiness probe: check if service is ready to accept traffic
|
|
readinessProbe:
|
|
exec:
|
|
command:
|
|
- /usr/local/bin/grpc_health_probe
|
|
- -addr=localhost:50056
|
|
initialDelaySeconds: 10
|
|
periodSeconds: 5
|
|
timeoutSeconds: 5
|
|
failureThreshold: 3
|
|
successThreshold: 1
|
|
|
|
# Startup probe: allow slow startup (30s * 10 = 5 minutes max)
|
|
startupProbe:
|
|
exec:
|
|
command:
|
|
- /usr/local/bin/grpc_health_probe
|
|
- -addr=localhost:50056
|
|
initialDelaySeconds: 5
|
|
periodSeconds: 10
|
|
timeoutSeconds: 5
|
|
failureThreshold: 30
|
|
successThreshold: 1
|
|
|
|
# Volume mounts
|
|
volumeMounts:
|
|
- name: logs
|
|
mountPath: /app/logs
|
|
- name: data
|
|
mountPath: /app/data
|
|
|
|
# Security context for container
|
|
securityContext:
|
|
allowPrivilegeEscalation: false
|
|
readOnlyRootFilesystem: true
|
|
runAsNonRoot: true
|
|
runAsUser: 1000
|
|
capabilities:
|
|
drop:
|
|
- ALL
|
|
|
|
# Termination grace period (allow 30s for graceful shutdown)
|
|
terminationGracePeriodSeconds: 30
|
|
|
|
# DNS policy
|
|
dnsPolicy: ClusterFirst
|
|
|
|
# Restart policy
|
|
restartPolicy: Always
|
|
|
|
# Volume claim templates for StatefulSet
|
|
volumeClaimTemplates:
|
|
- metadata:
|
|
name: logs
|
|
labels:
|
|
app: broker-gateway-service
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
resources:
|
|
requests:
|
|
storage: 10Gi
|
|
storageClassName: standard
|
|
|
|
- metadata:
|
|
name: data
|
|
labels:
|
|
app: broker-gateway-service
|
|
spec:
|
|
accessModes:
|
|
- ReadWriteOnce
|
|
resources:
|
|
requests:
|
|
storage: 5Gi
|
|
storageClassName: standard
|
|
|
|
---
|
|
apiVersion: v1
|
|
kind: ServiceAccount
|
|
metadata:
|
|
name: broker-gateway-service
|
|
namespace: foxhunt
|
|
labels:
|
|
app: broker-gateway-service
|