tradingSystem/config/settings.py

113 lines
6.4 KiB
Python
Raw Normal View History

2026-07-27 15:50:57 +08:00
# -*- coding: utf-8 -*-
"""
tradingSystem (PMS) 配置
========================
纪律 (沿袭 bionic_trader 踩坑经验):
1. 所有配置字段必须在 Settings 类中显式声明 pydantic extra="ignore" 会静默忽略
未声明的环境变量, 这是历史头号坑新增配置必须同时加字段
2. 基础设施键名与 bionic_trader 对齐 (PROXY_DB_URL / SIGNAL_REDIS_* / SOURCE_DB_EXT_DSN
/ DB_MYSQL_URL), 同一份 .env 可服务两个系统
3. 业务参数在此处只是初值: 页面修改后持久化到 pms_runtime_param ,
运行时经 ParamStore 读取 (表值优先于本文件)禁止在业务代码里直接
settings 取业务参数 统一走 ParamStore, 保证页面调参即时生效
"""
from pydantic_settings import BaseSettings, SettingsConfigDict
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file=".env", env_file_encoding="utf-8", extra="ignore")
# =========================================================
# 一、基础设施 (键名对齐 bionic_trader, 同一 .env 可共用)
# =========================================================
PROXY_DB_URL: str = "mysql+pymysql://user:pass@192.168.16.153:3307/my_quant_db"
# 153 代理: pms_* 全部表 + trading_position / trading_order / trading_buy_plan /
# strategy_daily_results (决策系统结论) —— 严格单表访问, 代理禁多表联查
SOURCE_DB_EXT_DSN: str = "mysql+pymysql://user:pass@192.168.16.150:3306/factordb_mysql"
# 因子分表 gp_stock_factor_pro_* (自算参考位/MA/ATR/量比)
DB_MYSQL_URL: str = "mysql+pymysql://user:pass@192.168.18.199:3306/db_gp_cj"
# 大盘指数 zs_day_data (页面区制提示用, 非约束)
SIGNAL_REDIS_HOST: str = "192.168.18.208"
SIGNAL_REDIS_PORT: int = 6379
SIGNAL_REDIS_PASSWORD: str = ""
SIGNAL_REDIS_DB_INTRADAY: int = 2 # 决策系统盘中信号流 (PMS 订阅消化)
SIGNAL_REDIS_DB_ACTIONS: int = 3 # 决策系统风控 SELL 流 (PMS 订阅消化)
SIGNAL_REDIS_DB_QUOTES: int = 13 # 实时分钟行情 (择时/扫描)
SIGNAL_REDIS_SOCKET_TIMEOUT: int = 5
PMS_REDIS_URL: str = "redis://:pass@192.168.16.150:6379/8"
# PMS 自己的 Celery 总线, 独立 db=8 (决策系统用 db7, 物理同机逻辑隔离)
PMS_WEB_HOST: str = "0.0.0.0" # 管理页面 (FastAPI + 单页)
PMS_WEB_PORT: int = 38100
# =========================================================
# 二、业务参数「初值」(运行时以 pms_runtime_param 表为准, 页面可调)
# =========================================================
# --- 资金与总体 (对应参数命令) ---
PMS_TOTAL_SCALE: float = 2_000_000 # 总操作规模 (元)
PMS_PORTFOLIO_CAP: float = 0.60 # 总仓上限 (占规模)
PMS_STOCK_CAP: float = 0.08 # 单股上限
PMS_STOCK_TARGET_DEFAULT: float = 0.06 # 默认单股目标仓位
PMS_MAX_NAMES: int = 15 # 最大持仓数
PMS_CASH_RESERVE: float = 0.0 # 预留现金比例 (永不动用)
PMS_AUTONOMY: str = "propose_only" # full / propose_only / off
# --- 批次与安全垫 ---
PMS_BATCH_SPLIT: str = "0.5,0.25,0.25" # 底仓/回踩补足/盈利加仓
PMS_CUSHION_SOLID: float = 0.03 # 安全垫厚垫线 (解锁加仓)
PMS_TRIM_PEAK: float = 0.06 # 保垫减仓: 垫子峰值门槛
PMS_TRIM_GIVEBACK: float = 0.5 # 保垫减仓: 回吐比例门槛
PMS_DCA_TRIGGERS: str = "-0.08,-0.15" # 补仓评估档
PMS_DCA_DEEP_CONFIRM: float = -0.15 # 此档及更深永远需用户确认
PMS_DCA_MAX_RATIO: float = 0.5 # 补仓上限 (占底仓)
PMS_NO_CHASE_MA5: float = 0.06 # 距 MA5 超此幅度不追买
PMS_BUILD_WINDOW_TDAYS: int = 10 # 建仓期窗口 (交易日)
PMS_FILL_MAX_LOSS: float = -0.03 # 浮亏深于此不走回踩补足 (转补仓域)
PMS_WEAK_NEG_DAYS: int = 5 # 降仓「清弱票」判定: 安全垫连续为负 N 日 (设计 §3.2)
PMS_PROPOSAL_TTL_HOURS: int = 24 # 自主提议待确认有效期 (超时置 EXPIRED)
2026-07-27 15:50:57 +08:00
# --- 行业约束 (硬拦截; 数据源接口化) ---
PMS_SECTOR_SOURCE: str = "" # "" = 停用并页面提示 / custom_table / gp_stock_category
PMS_SECTOR_MAX_NAMES: int = 4
PMS_SECTOR_MAX_RATIO: float = 0.40 # 占总仓
# --- 择时执行 (内置实现B; 决策系统接通后切实现A) ---
PMS_EXEC_WINDOW_TDAYS: int = 3 # 任务命令默认执行窗口
PMS_SELL_AVOID_OPEN_MIN: int = 30 # 卖出避开开盘 N 分钟
PMS_BUY_HALT_DAYUP: float = 0.05 # 当日涨幅超此停止买入
PMS_EOD_FORCE_TIME: str = "14:45" # 当日配额兜底时点
PMS_EOD_FORCE_DISCOUNT: float = 0.998 # 兜底限价 = 现价 × 此系数 (卖出)
PMS_MIN_LOT_MERGE: bool = True # 一手检查: 批次自动合并
PMS_DISPATCH_EXPIRE_MIN: int = 30 # 指令下发后未被接受的过期时间
# --- 风险披露与刹车 ---
PMS_RISK_WARN_ENTRY: float = 0.01 # 单笔敞口告警线 (占规模)
PMS_RISK_WARN_PORTFOLIO: float = 0.06 # 组合敞口告警线
PMS_BRAKE_DRAWDOWN: float = 0.05 # 组合刹车: 高水位回撤
PMS_BRAKE_DAYS: int = 3 # 刹车持续交易日
PMS_STOP_ATR_MULT: float = 2.0 # 自算止损参考: 成本 - N×ATR
PMS_REF_STALE_TDAYS: int = 3 # 决策系统结论日龄超此转自算兜底
# --- 研判闸 (委托决策系统) ---
PMS_JUDGE_ENABLED: bool = True
PMS_JUDGE_ACTIONS: str = "FILL,ADD,DCA,SWITCH"
PMS_JUDGE_TIMEOUT: int = 90 # 超时 → 降级 propose_only
# --- T0 做T (命令授权制) ---
PMS_T0_RATIO_MAX: float = 0.333 # T仓硬上限 (占持仓)
PMS_T0_PULLBACK_PCT: float = 0.03 # 正T: 距当日高点回落触发
PMS_T0_RALLY_PCT: float = 0.05 # 反T: 日内涨幅触发
PMS_T0_ROUND_TARGET: float = 0.015 # 单次T目标价差
PMS_T0_CLOSE_TIME: str = "14:50" # 强制平回时点
PMS_T0_STOCK_DAY_LOSS: float = 0.003 # 单票当日T亏熔断 (占规模)
PMS_T0_GLOBAL_DAY_LOSS: float = 0.01 # 全局当日T亏熔断
# --- 对账与回放 ---
PMS_REPLAY_INTERVAL_MIN: int = 5
PMS_RECON_ALARM_DAYS: int = 3 # 连续不一致 N 日升级 ERROR
settings = Settings()