Files
ai_stock/盘前操作.md
2025-12-08 15:30:19 +08:00

14 KiB
Raw Permalink Blame History

盘前数据量化流程

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 多源融合,自动回退与异常检测。
  • 失败样本自动归档,便于大模型后续异常分析与数据增强。
  1. 盘前特征工程与大模型输入
  • 盘前特征扩展:如 pre_return_vs_prev_close、流动性 proxy、spread、异动分布等。
  • 直接生成 premarket_features.csv,为大模型训练/推理提供结构化输入。
  1. 信号生成与大模型辅助决策
  • 传统规则±3%)与大模型(如 LLM/LLM+因子融合)并行生成信号,支持模型版本号与推理参数落地。
  • 盘前信号可通过 prompt/embedding 送入 LLM生成更丰富的“解读”与“风险提示”。
  1. 冷却与去重治理
  • 复用 signal_filter.py支持大模型信号冷却窗口与多因子去重。
  • 信号写入时记录模型来源、置信度、推理摘要。
  1. 自动化回测与监控
  • 盘前数据与信号自动归档,定期触发回测脚本,评估大模型与传统规则的表现。
  • ETL_RUNS/health 文件记录成功率、耗时、异常分布,便于大模型诊断。
  1. 大模型集成与推理链路
  • 盘前数据可直接作为 LLM 输入(如“请分析今日盘前异动并生成交易建议”),支持 prompt 工程与多轮推理。
  • 结合历史数据,自动生成 prompt支持多模型对比如 GPT-4/Claude/自研模型)。
  1. 告警与智能解释
  • 盘前信号异常/异动自动推送至 Slack/邮件,并由大模型生成“解读”与“操作建议”。
  • 失败样本自动归档,定期由大模型分析原因并给出修复建议。
  1. 数据库与高性能存储
  • 逐步迁移 CSV → SQLite/PostgreSQL支持高频查询与大模型批量推理。
  • 盘前数据表结构可直接映射为大模型训练/推理数据集。
  1. 可扩展 prompt 工程
  • 设计 prompt 模板,自动填充盘前特征、信号、历史表现,提升大模型推理效果。
  • 支持“多轮问答”与“因子解释”,便于策略迭代。
  1. 量化工程师与大模型协作流程
  • 盘前数据自动归档,量化工程师可随时调用大模型分析盘前异动、生成策略建议。
  • 结合大模型自动生成的“策略文档”,实现人机协同决策。

推荐大模型应用场景

  • 盘前异动解读与自动生成交易建议
  • 盘前信号置信度评估与风险提示
  • 失败样本自动诊断与修复建议
  • prompt 工程与多轮推理链路设计
  • 量化策略文档自动生成与归档

  • 保持时间字段可跨时区比对:以 UTC 为主存、同时记录 ET美东用于展示
  • 生成可控的预警信号并记录信号来源与冷却策略

总体架构

  • 抓取层:premarket_watch.py(实时/交互)、monitor.py(批量/生产)负责触发抓取
  • 解析层:futu.pyFutuStockParser.parse_javascript_data / parse_price_data,并增加健壮性与回退(见下节)
  • 持久化层:data_writer.py 将快照写入 bars_1m.csv(新增 session 字段),并支持 append_bars_sessionsession=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.pyfmt_et() / fmt_et_hm()
  • 在每条记录中同时保留 ts_utcts_et(后者可选),或只保留 ts_utc 并在查询/展示层动态格式化为 ET

文件/表 设计CSV 优先,后续可迁移到 PostgreSQL

  • 文件命名data/ 目录)

    • premarket_bars.csv (盘前快照)
    • premarket_signals.csv (盘前生成的信号/预警)
    • premarket_features.csv (若需盘前特征)
    • failed_html/ 存放抓取失败的 HTML便于人工排查
  • premarket_bars.csvCSV

    • 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简化

    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.csvfetched_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.pyFutuStockParser.parse_javascript_data / parse_price_data
  • 实时监控:premarket_watch.py已支持多线程、ET 时间显示、失败回存)
  • 持久化:data_writer.py(新增 session 字段与 append_bars_session
  • 时间工具:utils_time.pyET/UTC 格式化)

示例命令

  • 单次 10 只并发抓取并显示(用于检查):

    python premarket_watch.py --limit 10 --once --force --max-workers 8
    
  • 持续运行(每 30s 刷新):

    python premarket_watch.py --limit 20 --interval 30 --max-workers 6
    
  • 保存盘前快照和信号(写入 data/premarket_bars.csv / data/premarket_signals.csv

    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
      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 数据获取),公式:
      # 假设 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
    • 示例代码:
      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_closevolume 缺失,可用 eastmoneyyahoo 的历史行情接口补齐。
    • 推荐先用 pandas 合并历史收盘价,再批量计算特征。
  5. 自动化脚本建议

    • 可将上述流程封装为 etl_premarket_features.py,每日盘前自动运行。
    • 支持异常处理与日志输出,便于后续大模型分析。

前收盘价获取方法

  1. 数据来源

    • 东方财富EastMoneyAPIfutu.pyparse_stock_data 方法中,已解析 prev_close 字段f18可用于美股主流标的。
    • 富途:部分页面可解析前收盘价,但稳定性略低,建议优先用东方财富。
    • Yahoo Finance如需补充可用 yfinance 或 requests 获取历史收盘价。
  2. 自动补齐流程

    • 在盘前特征工程脚本中,先读取 premarket_bars.csv,如无 prev_close 字段,则批量用 symbol 列调用东方财富 API 获取。
    • 示例代码pandas + requests
      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 库:
      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