config.py

"""
QTrading 配置文件模块
"""

import os
from dataclasses import dataclass
from typing import Optional

@dataclass
class TushareConfig:
    """Tushare 配置"""
    token: str = ""
    retry_count: int = 3
    pause: float = 0.1

@dataclass
class DatabaseConfig:
    """数据库配置"""
    db_path: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "data", "qtrading.db")
    table_name: str = "daily_kline"
    backup_dir: str = os.path.join(os.path.dirname(os.path.abspath(__file__)), "..", "data", "backup")

@dataclass
class StockPoolConfig:
    """股票池配置"""
    stock_list: list = None
    start_date: str = "20000101"
    end_date: str = "20241231"

@dataclass
class StrategyConfig:
    """策略配置"""
    default_strategy: str = "MA20Strategy"
    available_strategies: list = None

@dataclass
class BacktestConfig:
    """回测配置"""
    initial_capital: float = 100000.0
    commission_rate: float = 0.0005
    slippage: float = 0.001
    benchmark: str = "sh000300"

@dataclass
class WebConfig:
    """Web 配置"""
    host: str = "0.0.0.0"
    port: int = 8050
    debug: bool = True

@dataclass
class QTradingConfig:
    """QTrading 主配置类"""
    tushare: TushareConfig = TushareConfig()
    database: DatabaseConfig = DatabaseConfig()
    stock_pool: StockPoolConfig = StockPoolConfig()
    strategy: StrategyConfig = StrategyConfig()
    backtest: BacktestConfig = BacktestConfig()
    web: WebConfig = WebConfig()

# 全局配置实例
config = QTradingConfig()

# 股票复权类型
ADJUST_METHOD = {
    "qfq": "前复权",
    "hfq": "后复权",
    "none": "不复权"
}

# 策略可用列表(会在策略模块中动态加载)
if config.strategy.available_strategies is None:
    config.strategy.available_strategies = []

# 默认股票池(中证800)
if config.stock_pool.stock_list is None:
    config.stock_pool.stock_list = [
        "000001", "000002", "000004", "000005", "000006", "000007", "000008", "000009", "000010", "000011",
        "000012", "000014", "000016", "000017", "000018", "000019", "000020", "000021", "000022", "000023",
        "000024", "000025", "000026", "000027", "000028", "000029", "000030", "000031", "000032", "000033",
        "000034", "000035", "000036", "000037", "000038", "000039", "000040", "000043", "000045", "000046",
        "000048", "000049", "000050", "000055", "000056", "000058", "000059", "000060", "000061", "000062"
    ]