init commit

This commit is contained in:
徐微
2025-12-08 15:30:19 +08:00
commit 09193a2288
39 changed files with 16688 additions and 0 deletions

335
盘前操作.md Normal file
View File

@@ -0,0 +1,335 @@
## 盘前数据量化流程
C:\Users\86188\miniconda3\Scripts\activate
1. **数据清洗与特征工程**
- 读取 `premarket_bars.csv`,筛选 session=pre 的数据。
- 计算盘前涨跌幅change_ratio、与前收盘价对比pre_return_vs_prev_close、流动性 proxy如 pre_volume
- 生成 `premarket_features.csv`,为后续量化模型和大模型推理提供输入。
2. **信号生成与策略设计**
- 规则法:如盘前涨幅 >3% 生成 BUY 信号,<-3% 生成 SELL 信号
- 多因子法结合盘前特征历史表现异动分布等设计量化打分模型
- 大模型法将盘前特征历史数据市场新闻等输入 LLM生成多维度信号与解读
- 信号写入 `premarket_signals.csv`记录来源置信度推理摘要
3. **回测与绩效评估**
- 用盘前信号与历史行情进行回测评估策略收益风险胜率
- 对比规则法多因子法与大模型法的表现优化信号生成逻辑
- 结果归档于回测报告可用大模型自动生成策略总结
4. **自动化交易与风控**
- 盘前信号可自动推送至交易系统支持模拟盘与实盘
- 结合大模型生成的风险提示动态调整仓位与风控参数
- 失败样本与异常信号自动归档便于后续诊断与模型迭代
5. **大模型协同分析**
- 盘前数据信号回测结果可作为 prompt自动生成策略文档异动解读风险提示
- 支持多轮问答与因子解释提升量化工程师与大模型协作效率
6. **监控与持续优化**
- 盘前数据与信号归档定期分析成功率异常分布策略表现
- 结合大模型自动诊断与修复建议持续优化量化流程
---
# 盘前操作说明
**下一步建议:结合大模型与量化工程最佳实践**
1. **数据质量与多源融合**
- 富途/东方财富/Yahoo 多源融合自动回退与异常检测
- 失败样本自动归档便于大模型后续异常分析与数据增强
2. **盘前特征工程与大模型输入**
- 盘前特征扩展 pre_return_vs_prev_close流动性 proxyspread异动分布等
- 直接生成 `premarket_features.csv`为大模型训练/推理提供结构化输入
3. **信号生成与大模型辅助决策**
- 传统规则(±3%与大模型 LLM/LLM+因子融合并行生成信号支持模型版本号与推理参数落地
- 盘前信号可通过 prompt/embedding 送入 LLM生成更丰富的解读风险提示”。
4. **冷却与去重治理**
- 复用 signal_filter.py支持大模型信号冷却窗口与多因子去重
- 信号写入时记录模型来源置信度推理摘要
5. **自动化回测与监控**
- 盘前数据与信号自动归档定期触发回测脚本评估大模型与传统规则的表现
- ETL_RUNS/health 文件记录成功率耗时异常分布便于大模型诊断
6. **大模型集成与推理链路**
- 盘前数据可直接作为 LLM 输入请分析今日盘前异动并生成交易建议”),支持 prompt 工程与多轮推理
- 结合历史数据自动生成 prompt支持多模型对比 GPT-4/Claude/自研模型)。
7. **告警与智能解释**
- 盘前信号异常/异动自动推送至 Slack/邮件并由大模型生成解读操作建议”。
- 失败样本自动归档定期由大模型分析原因并给出修复建议
8. **数据库与高性能存储**
- 逐步迁移 CSV SQLite/PostgreSQL支持高频查询与大模型批量推理
- 盘前数据表结构可直接映射为大模型训练/推理数据集
9. **可扩展 prompt 工程**
- 设计 prompt 模板自动填充盘前特征信号历史表现提升大模型推理效果
- 支持多轮问答因子解释”,便于策略迭代
10. **量化工程师与大模型协作流程**
- 盘前数据自动归档量化工程师可随时调用大模型分析盘前异动生成策略建议
- 结合大模型自动生成的策略文档”,实现人机协同决策
**推荐大模型应用场景**
- 盘前异动解读与自动生成交易建议
- 盘前信号置信度评估与风险提示
- 失败样本自动诊断与修复建议
- prompt 工程与多轮推理链路设计
- 量化策略文档自动生成与归档
---
- 保持时间字段可跨时区比对 UTC 为主存同时记录 ET美东用于展示
- 生成可控的预警信号并记录信号来源与冷却策略
---
**总体架构**
- 抓取层`premarket_watch.py`实时/交互)、`monitor.py`批量/生产负责触发抓取
- 解析层`futu.py` `FutuStockParser.parse_javascript_data` / `parse_price_data`并增加健壮性与回退见下节
- 持久化层`data_writer.py` 将快照写入 `bars_1m.csv`新增 `session` 字段并支持 `append_bars_session` `session=pre`
- 信号层`market_analyzer.py` / `signal_filter.py` 负责信号生成与冷却规则
- 监控/告警日志 + ETL 统计 (`etl_runs.csv`) + 失败 HTML dump
---
**抓取策略(要点)**
- 优先抓取来源富途`futu` `before_open_stock_info`若富途失败再使用东方财富 / Yahoo Finance 回退
- 抓取并发`premarket_watch.py` 支持 `--max-workers`建议初期将并发数限制在 4-8避免被风控
- 重试与降级每个 symbol 最多 2 次重试指数退避 0.5s -> 1s失败时保存 HTML: `data/failed_{symbol}_{ts}.html`
- 验证:抓到的 HTML/JSON 做基本校验(长度、是否包含 `__INITIAL_STATE__`、是否包含价格正则),否则视为失败
---
**时间与时区约定**
- 存储CSV / DB均以 UTC 为主(字段名以 `_utc` 结尾),便于跨时区一致性回测
- 对外展示与终端打印使用 ET美东`America/New_York`),代码中使用 `utils_time.py``fmt_et()` / `fmt_et_hm()`
- 在每条记录中同时保留 `ts_utc``ts_et`(后者可选),或只保留 `ts_utc` 并在查询/展示层动态格式化为 ET
---
**文件/表 设计CSV 优先,后续可迁移到 PostgreSQL**
- 文件命名data/ 目录)
- `premarket_bars.csv` (盘前快照)
- `premarket_signals.csv` (盘前生成的信号/预警)
- `premarket_features.csv` (若需盘前特征)
- `failed_html/` 存放抓取失败的 HTML便于人工排查
- `premarket_bars.csv`CSV
- symbol_id (int)
- symbol (text)
- ts_utc (ISO UTC)
- ts_et (ISO ET) -- 可选,便于人工查看
- price (float)
- change (float)
- change_ratio (float) -- 小数表示,例如 -0.038 表示 -3.8%
- volume (int/empty)
- source (text) -- 'futu' / 'eastmoney' / 'yahoo'
- session (text) -- 'pre' / 'regular' / 'post'
- raw_file (text) -- 若保存了原始 HTML/JSON 的文件名
- `premarket_signals.csv`
- id (text) -- 如 symbolid-生成时间
- symbol_id, symbol
- generated_at_utc
- signal_type ('premarket_alert')
- direction ('BUY'/'SELL')
- score (float)
- reason (text)
- params_json (text) -- 包含触发字段(例如 pre_price, pre_change_ratio
- model_name, version
- expires_at_utc
- PostgreSQL 示例 DDL简化
```sql
CREATE TABLE premarket_bars (
id BIGSERIAL PRIMARY KEY,
symbol TEXT NOT NULL,
symbol_id BIGINT,
ts_utc TIMESTAMPTZ NOT NULL,
price NUMERIC,
change NUMERIC,
change_ratio NUMERIC,
source TEXT,
session TEXT,
raw_file TEXT
);
CREATE INDEX idx_premarket_bars_symbol_ts ON premarket_bars(symbol, ts_utc DESC);
CREATE TABLE premarket_signals (
id TEXT PRIMARY KEY,
symbol TEXT,
symbol_id BIGINT,
generated_at_utc TIMESTAMPTZ,
direction TEXT,
score NUMERIC,
reason TEXT,
params JSONB
);
```
---
**ETL 流程建议(每轮)**
1. Fetch: 按配置的 symbol 列表并发抓取 `futu` 页面/JS 数据
2. Validate: 校验数据字段完整性price 非空、change_ratio 可解析)
3. Persist raw: 抓到的原始 HTML/JSON仅失败或配置为保存写 `failed_html/` 或 `raw/`
4. Normalize: 将涨跌幅转换为小数、将价格转浮点
5. Persist bar: 写 `premarket_bars.csv` 或入库 `premarket_bars`
6. Feature/Signal: 基于规则或模型生成预警信号,写 `premarket_signals.csv`
7. Stats/ETL: 写一条 `etl_runs.csv`fetched_count, signal_count, duration
---
**推荐盘前特征(可在 `premarket_features.csv` 存储)**
- pre_return_vs_prev_close = (pre_price / prev_close) - 1
- pre_vs_open = (pre_price / open_price) - 1
- liquidity_proxy: pre_volume若可获得或估计成交强度
- spread_estimate: 若能获取买卖价则计算
---
**信号治理与安全策略**
- 冷却窗口:相同(symbol, direction) 最小冷却 30 分钟(`signal_filter.py` 已实现)
- 过度并发保护:对富途页面调用施加 `--max-workers` 限制,建议生产值 4~8
- 失败与告警:当连续 N 次(例如 5 次)抓取某个 symbol 失败,发出报警並暫停该 symbol 的抓取
- 可选阈值:盘前涨幅 > +3% 发出 BUY 预警,<-3% 发 SELL 预警(可配置)
---
**监控与告警**
- ETL 日志(`etl_runs.csv`用于監控采集稳定性fetched_count 与 error rate
- 将 `failed_html/` 的数量作为健康指标;若短时间内增多,说明被风控/结构变化
- 可集成邮件/Slack 通知:当出现大盘前信号或连续抓取失败时通知運維/策略人员
---
**存储/归档与保留策略**
- 快照保存期:`premarket_bars.csv` 按天轮换或周期归档;建议保留 90 天的高频数据在线上长期数据归入冷存S3
- raw HTML仅保存失败样本或每 N 次保存一次示例,避免占满磁盘
---
**工具链与代码位置**
- 抓取/解析:`futu.py``FutuStockParser.parse_javascript_data` / `parse_price_data`
- 实时监控:`premarket_watch.py`已支持多线程、ET 时间显示、失败回存)
- 持久化:`data_writer.py`(新增 `session` 字段与 `append_bars_session`
- 时间工具:`utils_time.py`ET/UTC 格式化)
---
**示例命令**
- 单次 10 只并发抓取并显示(用于检查):
```bash
python premarket_watch.py --limit 10 --once --force --max-workers 8
```
- 持续运行(每 30s 刷新):
```bash
python premarket_watch.py --limit 20 --interval 30 --max-workers 6
```
- 保存盘前快照和信号(写入 `data/premarket_bars.csv` / `data/premarket_signals.csv`
```bash
python premarket_watch.py --limit 25 --interval 60 --save --max-workers 6 --force
```
运行后可在 `data/` 目录看到:
- `premarket_bars.csv` 新增行session=pre, change_ratio 为小数)
- `premarket_signals.csv` BUY/SELL 阈值信号±3%
- `symbols.csv` 自动补充缺失的 symbol 基础信息
---
### 盘前数据清洗与特征工程详细操作
1. **读取与筛选盘前数据**
- 使用 pandas 或 csv 库读取 `data/premarket_bars.csv`。
- 仅保留 `session=pre` 的行。
- 示例代码pandas
```python
import pandas as pd
df = pd.read_csv('data/premarket_bars.csv')
pre_df = df[df['session'] == 'pre']
```
2. **计算盘前特征**
- 盘前涨跌幅:直接使用 `change_ratio` 列。
- 与前收盘价对比pre_return_vs_prev_close需关联前一天收盘价可从历史 bars 或 eastmoney/yahoo 数据获取),公式:
```python
# 假设 pre_df 有 prev_close 列
pre_df['pre_return_vs_prev_close'] = pre_df['price'] / pre_df['prev_close'] - 1
```
- 流动性 proxy如 pre_volume如有 volume 字段直接用,否则可用成交额/市值等近似。
3. **生成特征文件**
- 选取需要的特征列,如 symbol, ts_utc, price, change_ratio, pre_return_vs_prev_close, pre_volume。
- 保存为 `data/premarket_features.csv`。
- 示例代码:
```python
feature_cols = ['symbol', 'ts_utc', 'price', 'change_ratio', 'pre_return_vs_prev_close', 'volume']
pre_df[feature_cols].to_csv('data/premarket_features.csv', index=False)
```
4. **数据源补充说明**
- 若 `prev_close` 或 `volume` 缺失,可用 `eastmoney` 或 `yahoo` 的历史行情接口补齐。
- 推荐先用 pandas 合并历史收盘价,再批量计算特征。
5. **自动化脚本建议**
- 可将上述流程封装为 `etl_premarket_features.py`,每日盘前自动运行。
- 支持异常处理与日志输出,便于后续大模型分析。
---
### 前收盘价获取方法
1. **数据来源**
- 东方财富EastMoneyAPI在 `futu.py` 的 `parse_stock_data` 方法中,已解析 `prev_close` 字段f18可用于美股主流标的。
- 富途:部分页面可解析前收盘价,但稳定性略低,建议优先用东方财富。
- Yahoo Finance如需补充可用 yfinance 或 requests 获取历史收盘价。
2. **自动补齐流程**
- 在盘前特征工程脚本中,先读取 `premarket_bars.csv`,如无 prev_close 字段,则批量用 symbol 列调用东方财富 API 获取。
- 示例代码pandas + requests
```python
import pandas as pd
from futu import EastMoneyAPI
df = pd.read_csv('data/premarket_bars.csv')
api = EastMoneyAPI()
def get_prev_close(symbol):
stocks, _ = api.get_us_stocks(page_size=1)
for item in stocks:
data = api.parse_stock_data(item)
if data and data['symbol'] == symbol:
return data['prev_close']
return None
df['prev_close'] = df['symbol'].apply(get_prev_close)
```
- 若需高效批量补齐,可提前缓存 symbol→prev_close 映射。
3. **补充说明**
- 若已在 `premarket_bars.csv` 生成时写入 prev_close 字段,则无需后处理。
- 若需用 Yahoo Finance可用 yfinance 库:
```python
import yfinance as yf
def get_prev_close_yahoo(symbol):
ticker = yf.Ticker(symbol)
hist = ticker.history(period='2d')
if len(hist) >= 2:
return hist['Close'].iloc[-2]
return None
```
- 推荐在 ETL/特征工程脚本中自动补齐,保证后续量化分析一致性。
---
文档作者: AI 量化工程师(为当前代码库改造)
END