72 lines
2.7 KiB
Python
72 lines
2.7 KiB
Python
|
|
"""全局配置:从环境变量 / .env 读取。
|
|||
|
|
|
|||
|
|
关键点:
|
|||
|
|
- OWN_DB_DSN 自有 Postgres(看板只读它,ETL 写它)—— 必填
|
|||
|
|
- LEGACY_MYSQL_DSN 现有 MySQL-A(18.199),读 zs_day_data —— 选填,留空则跳过指数同步
|
|||
|
|
- LEGACY_PG_DSN 现有 PG(16.150),读 gp_market_sentiment —— 选填,留空则跳过情绪同步
|
|||
|
|
- OHLC_PROVIDER 指数 OHLC 数据源(你后续提供)。默认 "none" → 退化为收盘线
|
|||
|
|
"""
|
|||
|
|
from __future__ import annotations
|
|||
|
|
|
|||
|
|
from functools import lru_cache
|
|||
|
|
from typing import List, Optional
|
|||
|
|
|
|||
|
|
from pydantic import Field
|
|||
|
|
from pydantic_settings import BaseSettings, SettingsConfigDict
|
|||
|
|
|
|||
|
|
|
|||
|
|
class Settings(BaseSettings):
|
|||
|
|
model_config = SettingsConfigDict(
|
|||
|
|
env_file=".env", env_file_encoding="utf-8", extra="ignore"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
# ---- 数据库 ----
|
|||
|
|
own_db_dsn: str = Field(
|
|||
|
|
default="postgresql+psycopg://asevent:asevent@db:5432/asevent",
|
|||
|
|
alias="OWN_DB_DSN",
|
|||
|
|
)
|
|||
|
|
legacy_mysql_dsn: Optional[str] = Field(default=None, alias="LEGACY_MYSQL_DSN")
|
|||
|
|
legacy_pg_dsn: Optional[str] = Field(default=None, alias="LEGACY_PG_DSN")
|
|||
|
|
|
|||
|
|
# ---- 指数范围(dot 式,与 zs_day_data.symbol 一致)----
|
|||
|
|
index_codes: str = Field(default="000001.SH,399006.SZ,000688.SH", alias="INDEX_CODES")
|
|||
|
|
|
|||
|
|
# ---- OHLC 源(预留插槽)----
|
|||
|
|
# "none" = 无源,open=high=low=close,ohlc_source='close_only'(退化为收盘线)
|
|||
|
|
# 你接入后在 sources.py:build_ohlc_provider 里注册自己的实现,并把此值改成对应名字
|
|||
|
|
ohlc_provider: str = Field(default="none", alias="OHLC_PROVIDER")
|
|||
|
|
|
|||
|
|
# ---- 顶底信号参数(初值,实机回测后再调)----
|
|||
|
|
vol_window: int = Field(default=250, alias="VOL_WINDOW") # 量能/价格分位滚动窗口
|
|||
|
|
w_vol: float = Field(default=0.35, alias="W_VOL")
|
|||
|
|
w_price: float = Field(default=0.25, alias="W_PRICE")
|
|||
|
|
w_sentiment: float = Field(default=0.25, alias="W_SENTIMENT")
|
|||
|
|
w_etf: float = Field(default=0.15, alias="W_ETF")
|
|||
|
|
hot_threshold: float = Field(default=80.0, alias="HOT_THRESHOLD") # 过热/顶部
|
|||
|
|
cold_threshold: float = Field(default=20.0, alias="COLD_THRESHOLD") # 冰点/底部
|
|||
|
|
|
|||
|
|
# ---- 其它 ----
|
|||
|
|
cors_origins: str = Field(default="*", alias="CORS_ORIGINS")
|
|||
|
|
|
|||
|
|
@property
|
|||
|
|
def index_code_list(self) -> List[str]:
|
|||
|
|
return [c.strip() for c in self.index_codes.split(",") if c.strip()]
|
|||
|
|
|
|||
|
|
@property
|
|||
|
|
def cors_origin_list(self) -> List[str]:
|
|||
|
|
return [c.strip() for c in self.cors_origins.split(",") if c.strip()]
|
|||
|
|
|
|||
|
|
|
|||
|
|
@lru_cache
|
|||
|
|
def get_settings() -> Settings:
|
|||
|
|
return Settings()
|
|||
|
|
|
|||
|
|
|
|||
|
|
# 指数中文名映射(展示用)
|
|||
|
|
INDEX_NAMES = {
|
|||
|
|
"000001.SH": "上证综指",
|
|||
|
|
"399006.SZ": "创业板指",
|
|||
|
|
"000688.SH": "科创50",
|
|||
|
|
"399001.SZ": "深证成指",
|
|||
|
|
}
|