Skip to content

Latest commit

 

History

History
145 lines (133 loc) · 8.09 KB

File metadata and controls

145 lines (133 loc) · 8.09 KB

StockLens 数据流

完整分析流水线(流水线版)

main.py --stocks AAPL --ai --force-run
│
├─ 1. 初始化
│   ├─ Config 单例加载 .env(stocklens/config/settings.py)
│   ├─ DatabaseManager 初始化 SQLite + 注册 PRAGMA(WAL/mmap/cache=64MB)(stocklens/storage/engine.py)
│   ├─ DataFetcherManager 初始化 10 个 Fetcher(tickbridge/core/manager.py)
│   ├─ LiteLLM Router 初始化(stocklens/analyzer/llm_analyzer.py)
│   ├─ SearchService 初始化搜索引擎(stocklens/search/search_service.py)
│   └─ NotificationDispatcher 初始化推送渠道(stocklens/notification/dispatcher.py)
│
├─ Phase 1. 共享数据预取(线程池: PREFETCH,默认 4)
│   ├─ US Market Env → 四大指数快照(道琼斯/纳斯达克/标普500/纳指100)
│   ├─ US Macro Snapshot → 12 个宏观指标(利率/CPI/失业率/VIX/国债等)
│   ├─ Market News → 大盘新闻预取
│   └─ 金十数据快讯(Jin10)— 后续按股票关键字过滤
│
├─ Phase 2. 数据预采集(线程池: DATA_FETCH,默认 cpu_count)
│   ├─ DataCollector.fetch_and_save_stock_data()
│   │   ├─ DataFetcherManager.fetch_daily() → 按 {SOURCE}_PRIORITY 顺序尝试 10 Fetcher
│   │   │   ├─ YfinanceFetcher (P0) → fail 则下一个
│   │   │   ├─ XueqiuFetcher (P1)
│   │   │   ├─ ... 直到成功
│   │   │   └─ 返回标准化 DataFrame
│   │   ├─ StockRepo.save_dataframe() — SQLite ON CONFLICT 批量 upsert
│   │   └─ StockRepo.save_weekly_data() — 同样批量 upsert
│   └─ 结果: 每只股票的日线/周线数据已入库
│
├─ Phase 3. 数据增强 + LLM 流水线(两个线程池并行运行)
│   │
│   │  enrich 池 (PIPELINE)        LLM 池 (PIPELINE)
│   │  ├─ stock_1                  ├─ ←── enrich_done(stock_1)
│   │  ├─ stock_2                  ├─ ←── enrich_done(stock_2)
│   │  ...                          ...
│   │
│   ├─ enrich 阶段(_prepare_stock_context)
│   │   ├─ 实时行情(RealtimeManager → tencent/sina/efinance/em)
│   │   ├─ 筹码分布(A 股专属,US/HK 跳过)
│   │   ├─ 基本面聚合(FundamentalManager)
│   │   ├─ stock_indicators.compute_trend_and_indicators()
│   │   │   ├─ 趋势分析(TrendAnalyzer → MA50/MA200/RSI/MACD/BB Squeeze)
│   │   │   ├─ 周线/月线 OHLC(来自 DB 或重采样)
│   │   │   └─ 多周期技术指标 + 斐波那契回撤
│   │   ├─ 情报搜索(SearchService.search_comprehensive_intel,3 个维度并行)
│   │   │   ├─ 最新消息 / 机构分析 / 风险排查
│   │   │   ├─ 新闻时间窗过滤 + 去重
│   │   │   └─ 写入 news_intel 表
│   │   ├─ Finviz(前瞻数据 / 同行对比 / 英文新闻,仅美股)
│   │   ├─ 社交情绪(仅美股)
│   │   ├─ enrich_us_hk_context(US/HK 补充:宏观/PE/板块 ETF,并行池 US_ENRICH)
│   │   ├─ ScoringService.evaluate() — 18 模型量化评分
│   │   │   ├─ Piotroski / Altman Z / Ohlson O
│   │   │   ├─ Rule of 40 / PEG / Magic Formula
│   │   │   ├─ Beneish M / DuPont / 盈余质量
│   │   │   ├─ 派息安全 / 机构持股 / 期权情绪 / 做空 / 动量 / 盈利惊喜
│   │   │   ├─ SCTR / 风险指标 / 宏观+市场状态
│   │   │   └─ 综合评分 0-100(确定性 Python 计算)
│   │   ├─ 元数据报告 → reports/{date}/{code}/{...}-元数据.md
│   │   └─ 通过 add_done_callback 立即提交 LLM 池
│   │
│   └─ LLM 阶段(_run_stock_llm)
│       ├─ PromptBuilder.build() — 组装 system + user prompt
│       │   ├─ 技术面数据 / 基本面数据 / 宏观环境
│       │   ├─ 新闻情报 / 量化评分总览表
│       │   └─ 决策仪表盘 schema
│       ├─ LiteLLM Router.completion() — 调用 LLM
│       ├─ ResponseParser.parse() — JSON 提取 + 修复
│       ├─ AnalysisResult 字段填充(chip / 价格位置)
│       ├─ analysis_repo.save() — 写入 analysis_results 表
│       └─ 单股推送(SINGLE_STOCK_NOTIFY=true 时)
│
├─ 4. 汇总 & 推送
│   ├─ ReportBuilder.generate_dashboard_report() — 日报汇总
│   ├─ Dispatcher.send() → 10 种渠道并行推送
│   │   ├─ wechat / feishu / telegram / email / discord
│   │   ├─ pushover / pushplus / serverchan3 / astrbot
│   │   └─ custom_webhook
│   └─ 飞书云文档(可选)
│
└─ 5. 自动回测(BACKTEST_ENABLED=true 时)
    ├─ BacktestService.run_backtest() — 对历史分析结果事后评估
    └─ 写入 backtest_results 表

数据存储

SQLite 表(核心 20 张,含 PRAGMA WAL)

表名 写入阶段 主要字段 用途
stock_daily Phase 2 code, date, OHLCV, ma5/10/20, volume_ratio 日线行情
stock_weekly Phase 2 同上(无 ma) 周线行情(resample)
stock_bars Phase 2 code, interval {60m/1mo/1q/1y}, datetime, OHLCV 多周期 K 线(统一表,60m + 月/季/年)
stock_quote_snapshot Phase 2 code, snapshot_date, 35 字段(价格/估值/股本/股息/交易元数据) 每日行情面板(离线回放用)
stock_info Phase 2 code, name, market, sector 股票基本信息
news_intel Phase 3 enrich code, title, snippet, url, source, dimension 新闻情报
analysis_results Phase 3 LLM code, date, score, prediction, report_json AI 分析结果
fundamental_* Phase 3 enrich code, period, revenue, net_income, roe 基本面快照
pe_history Phase 3 enrich code, date, pe, close PE 历史(批量 upsert)
macro_data Phase 1 indicator, value, date 宏观指标
backtest_results Phase 5 code, analysis_date, accuracy, return_pct 回测结果
conversations API/Bot session_id, role, content 对话历史
llm_usage Phase 3 LLM model, tokens_in, tokens_out, cost LLM 用量审计
portfolio_accounts API name, currency 组合账户
portfolio_transactions API account_id, code, action, shares, price 交易记录
portfolio_snapshots API account_id, snapshot_date, total_value 组合快照
system_config API key, value, category 系统配置
评分快照表 Phase 3 enrich code, date, scoring_overview 量化评分历史

文件输出

stocklens/reports/{YYYYMMDD}/
├── {CODE}-{NAME}/
│   ├── 美股-苹果-AAPL-20260518-元数据.md   # 量化数据原始报告(Phase 3 enrich)
│   └── 美股-苹果-AAPL-20260518-报告.md     # AI 分析报告(Phase 3 LLM)
└── report_{YYYYMMDD}.md                     # 日报汇总

缓存策略(二级)

缓存层 实现 TTL 用途
L1 内存 TTLCache(stocklens/utils/cache.py) 可配置 热数据(实时行情、基本面)
L2 SQLite SQLiteCache(thread-local 连接) 可配置 跨进程持久化(宏观、搜索结果)
实时行情 REALTIME_CACHE_TTL 600s 默认 避免频繁请求数据源
基本面 FUNDAMENTAL_CACHE_TTL_SECONDS 120s 短期缓存基本面上下文
宏观慢指标 硬编码 24h CPI/失业率等低频数据

并发资源映射

阶段 池名 默认 worker 调节变量
Phase 1 预取 PREFETCH 4 STOCKLENS_PREFETCH_WORKERS
Phase 2 采集 DATA_FETCH cpu_count STOCKLENS_DATA_FETCH_WORKERS
Phase 3 enrich + LLM PIPELINE cpu_count STOCKLENS_PIPELINE_WORKERS
US/HK 增强 US_ENRICH cpu_count STOCKLENS_US_ENRICH_WORKERS
搜索 SEARCH 5 STOCKLENS_SEARCH_WORKERS
全局 fallback (任意) - STOCKLENS_DEFAULT_WORKERS

详见 modules/concurrency.md