daily_stock_analysis:数据层

6 阅读4分钟

数据层采用 SQLite + SQLAlchemy ORM 构建,实现了完整的数据持久化、事务管理和并发安全机制。

一、数据层架构

整体架构图

┌─────────────────────────────────────────────────────────────────────┐
│                         数据层架构                                  │
├─────────────────────────────────────────────────────────────────────┤
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │              DatabaseManager (单例模式)                      │    │
│  │  - 管理数据库连接                                           │    │
│  │  - 事务管理与重试机制                                       │    │
│  │  - 并发安全保障 (WAL模式 + 写锁)                            │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                              │                                     │
│                              ▼                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │              SQLAlchemy ORM 数据模型                         │    │
│  │  - StockDaily: 日线行情数据                                  │    │
│  │  - AnalysisHistory: 分析历史记录                             │    │
│  │  - NewsIntel: 新闻情报                                       │    │
│  │  - BacktestResult: 回测结果                                  │    │
│  │  - Portfolio*: 模拟组合数据                                  │    │
│  │  - LlmUsage: LLM调用记录                                     │    │
│  └─────────────────────────────────────────────────────────────┘    │
│                              │                                     │
│                              ▼                                     │
│  ┌─────────────────────────────────────────────────────────────┐    │
│  │                    SQLite 数据库                             │    │
│  │  - 单文件存储 (data/stocks.db)                              │    │
│  │  - WAL模式支持并发读写                                       │    │
│  │  - 自动建表与索引                                           │    │
│  └─────────────────────────────────────────────────────────────┘    │
└─────────────────────────────────────────────────────────────────────┘

二、核心数据模型

1. 股票日线数据 (StockDaily)

字段 类型 说明 code String(10) 股票代码 date Date 交易日期 open/high/low/close Float OHLC价格 volume Float 成交量(股) amount Float 成交额(元) pct_chg Float 涨跌幅(%) ma5/ma10/ma20 Float 移动平均线 volume_ratio Float 量比 data_source String(50) 数据来源

唯一约束 : (code, date) 确保同一股票同一日期只有一条记录

2. 分析历史记录 (AnalysisHistory)

字段 类型 说明 code String(10) 股票代码 report_type String(16) 报告类型 sentiment_score Integer 情绪评分 (0-100) operation_advice String(20) 操作建议(买入/观望/卖出) trend_prediction String(50) 趋势预测 ideal_buy/secondary_buy Float 狙击点位 stop_loss/take_profit Float 止损/止盈位 raw_result Text 原始分析结果(JSON)

3. 其他核心表

表名 用途 关键字段 news_intel 新闻情报 code , title , url , published_date backtest_results 回测结果 analysis_history_id , eval_status , total_return portfolio_accounts 组合账户 owner_id , name , market , base_currency portfolio_trades 交易记录 account_id , symbol , side , quantity , price llm_usage LLM调用记录 model , prompt_tokens , completion_tokens

三、数据库管理器设计

1. 单例模式

class DatabaseManager:
    _instance: Optional['DatabaseManager'] = None
    
    @classmethod
    def get_instance(cls) -> 'DatabaseManager':
        """获取单例实例"""
        if cls._instance is None:
            cls._instance = cls()
        return cls._instance

2. SQLite 优化配置

配置项 值 作用 journal_mode WAL 写前日志模式,支持并发读写 busy_timeout 30000ms 等待锁释放超时时间 write_retry_max 3 写入失败重试次数 write_retry_base_delay 0.1s 重试基础延迟

3. 事务管理机制

def _run_write_transaction(self, operation_name, write_operation):
    """
    执行写事务,支持SQLite锁冲突重试
    
    流程:
    1. 使用 BEGIN IMMEDIATE 获取写锁
    2. 执行写操作
    3. 提交事务
    4. 如遇锁冲突,指数退避重试
    """

指数退避策略 : delay = base_delay * (2 ^ attempt)

4. 批量 UPSERT 策略

def save_daily_data(self, df, code, data_source):
    """
    批量保存日线数据
    
    策略:
    - 按 (code, date) 做 UPSERT
    - SQLite 按 50 条/批写入(避免绑定参数上限)
    - 返回实际新增记录数(不含更新)
    """

四、核心功能

1. 断点续传支持

def has_today_data(self, code, target_date=None):
    """检查是否已有指定日期数据,用于跳过重复获取"""

2. 数据查询接口

方法 功能 get_daily_data() 获取日线数据 get_analysis_history() 查询分析历史 get_recent_news() 获取近期新闻 get_latest_analysis_by_query_id() 根据查询ID获取最新分析

3. 数据保存接口

方法 功能 save_daily_data() 批量保存日线数据 save_analysis_history() 保存分析结果 save_news_intel() 保存新闻情报 save_fundamental_snapshot() 保存基本面快照

五、并发安全设计

1. WAL 模式

  • 支持多个读操作和一个写操作同时进行
  • 提高并发性能

2. 写锁机制

session.connection().exec_driver_sql("BEGIN IMMEDIATE")
  • 在写事务开始时立即获取写锁
  • 确保预检查和写入在同一事务窗口内

3. 锁冲突重试

  • 检测 SQLite "database is locked" 错误
  • 自动指数退避重试

六、数据层特点

1. 轻量级存储

  • SQLite 单文件存储,无需额外数据库服务
  • 适合单机部署和桌面应用

2. 事务保证

  • ACID 事务支持
  • 自动重试机制确保数据一致性

3. 断点续传

  • 自动检测已存在数据,跳过重复获取
  • 提高分析效率

4. 并发安全

  • WAL 模式支持并发读写
  • 写锁和重试机制避免数据竞争

5. 自动建表

  • 首次运行自动创建所有表结构和索引
  • 无需手动维护 schema

七、总结

数据层采用 SQLite + SQLAlchemy 技术栈,具有以下核心特点:

  1. 单例模式 :全局共享数据库连接,避免资源浪费
  2. WAL 模式 :支持高效并发读写
  3. 批量 UPSERT :高效的数据更新策略
  4. 事务重试 :自动处理锁冲突,保证数据一致性
  5. 断点续传 :智能跳过已存在数据,提升效率
  6. 多表设计 :合理的数据模型划分,支持分析历史、回测、组合管理等功能 整体设计兼顾了轻量级部署、高性能并发和数据完整性需求。