Skip to content

Repository files navigation

StockOps

Python Status

规则优先的股票观察清单监控与交易计划 Agent,面向日线到周线级别的辅助决策。

StockOps 从 YAML 观察清单读取标的,通过确定性规则计算指标、识别入场与风险信号,并生成结构化的 Decision Card。LLM 只负责解释和风险复核,不负责决定交易动作。

Warning

StockOps 不是自动交易系统,不会连接券商或执行订单。项目输出仅用于研究、学习和人工复核,不构成任何投资建议。

功能特性

  • 使用 YAML 维护固定观察清单和单票交易计划;
  • 支持本地 CSV,以及基于 AkShare 的 A 股实时行情和日线;
  • 计算 MA、成交量均线、MACD、ATR、BOLL、KDJ 和突破区间等指标;
  • 使用确定性规则识别突破、回踩、右侧确认、减仓和退出信号;
  • 通过显式状态机校验 WATCHINGENTRY_READYHOLDINGREDUCEEXIT 的单次分析结果;
  • 使用 LangGraph 编排分析流程,并通过 Harness 限制不同运行模式的权限;
  • 生成包含信号、风险、入场区间、止损位和后续观察项的 Decision Card;
  • 支持交互式 CLI 和周期扫描 daemon;
  • 可选接入通义千问,对规则结果进行解释和风险复核;
  • 将分析记录和 Harness 审计日志保存为本地 JSONL。

工作原理

YAML 观察清单
    ↓
获取日线行情
    ↓
计算技术指标
    ↓
确定性规则评估
    ↓
状态机检查状态转换
    ↓
生成 Decision Card ← 实时行情仅用于展示
    ↓
可选 LLM 复核、记录与通知

规则引擎负责信号、状态转换和风险边界。LLM 无法跳过这些步骤,也不能覆盖规则结论。当前状态转换结果只写入 Decision Card,不会自动回写 YAML;下一轮仍以观察清单中的 state 为起点。

快速开始

环境要求

  • Python 3.11 或更高版本;
  • 推荐使用 uv 管理依赖;
  • 使用实时 A 股行情时,需要能够访问对应的新浪或腾讯行情接口。

安装

git clone https://github.com/chacha923/StockOps.git
cd StockOps
uv sync --extra dev

使用示例数据启动

仓库内置一只示例标的和对应 CSV 行情,可以直接运行:

uv run stockops chat \
  --watchlist data/watchlist/example.yaml \
  --prices examples/prices

进入交互模式后:

/watchlist
/quote 600000
/analyze 600000
/help
/exit

也可以直接输入观察清单中的股票代码,等价于 /analyze <symbol>

配置观察清单

当前版本使用 plans 数组维护观察标的。symbol 必须使用字符串,支持六位 A 股代码(如 600000),也支持带市场前缀的形式(如 sh600000sz000001bj430047)。系统会统一归一化为六位代码,避免观察清单、CSV 文件名和行情 Provider 使用不同标识。简称、拼音缩写或其他业务名称不能作为标的标识。

plans:
  - symbol: "600000"
    name: "示例观察标的"
    state: "WATCHING"
    thesis: "关注放量突破后的持续性。"
    timeframe: "days_to_weeks"
    entry_type: "breakout"
    entry_zone_low: 10.80
    entry_zone_high: 11.20
    stop_loss: 10.40
    take_profit_rule: "分批止盈,跌破 MA10 降低风险。"
    holding_price: null
    position_ratio: null
    notes:
      - "示例配置,不代表真实交易观点。"

核心字段:

字段 必填 说明
symbol 唯一标识;六位 A 股代码或带 shszbj 前缀的代码
name 展示名称
state 初始状态,默认为 WATCHING
thesis 人工维护的关注逻辑
entry_zone_low/high 人工指定的入场区间,优先于规则生成值
stop_loss 人工指定的硬止损位
holding_price 持仓成本,供后续持仓风险功能使用
position_ratio 仓位比例,供后续持仓风险功能使用

StockOps 只分析观察清单中的标的。Chat 模式每次分析一只;daemon 模式会逐项扫描清单中的全部标的。

加载观察清单时会先规范化代码,再校验唯一性。因此 600000sh600000 会被视为同一个标的,同时配置会直接报错。

使用实时 A 股行情

当前 AkShare Provider 的默认策略是:

  • 实时行情:新浪单票接口,失败后使用腾讯单票接口;
  • 日线:新浪 stock_zh_a_daily,失败后使用腾讯 stock_zh_a_hist_tx
  • 底层 Provider 提供新浪 stock_zh_a_minute 分钟线能力,但当前 CLI、workflow 和 daemon 尚未使用分钟线;当前 AkShare 版本也没有可用的腾讯分钟线回退。

直接通过命令行启用:

uv run stockops chat --market-data akshare

也可以复制配置模板:

cp config/providers.example.yaml config/providers.local.yaml
uv run stockops chat

config/providers.local.yaml 已被 Git 忽略,适合保存本地 Provider 配置。常用行情参数如下:

market_data:
  provider: akshare
  akshare:
    primary_source: sina
    fallback_enabled: true
    fallback_source: tencent
    adjust: qfq
    quote_ttl_seconds: 3
    min_request_interval_seconds: 1
    request_timeout_seconds: 10

实时请求具有按股票代码缓存和最小请求间隔保护。相同代码在 TTL 内会复用缓存,以降低上游压力。

可选 LLM 复核

不配置 LLM 时,StockOps 仍可完成全部规则分析。启用通义千问后,LLM 只会解释和复核 Decision Card。

export DASHSCOPE_API_KEY="your-api-key"
uv run stockops chat --llm qwen --qwen-model qwen3.7-max

默认使用 OpenAI-compatible Responses API。如需改为 Chat Completions:

uv run stockops chat \
  --llm qwen \
  --qwen-api chat_completions

也可以在本地配置文件中指定 Base URL 和密钥环境变量;运行时模型请通过 --qwen-model 选择。请勿提交真实 API Key。

周期扫描

执行一次完整扫描后退出:

uv run stockops daemon --once --market-data akshare

每 300 秒扫描一次:

uv run stockops daemon \
  --market-data akshare \
  --interval-seconds 300

daemon 会分析观察清单,并对 ENTRY_READYREDUCEEXIT 状态调用通知接口。当前默认通知渠道是终端输出,尚未实现状态变化去重及飞书、邮件等外部通知渠道。

Decision Card

每次分析都会生成结构化结果,主要包含:

Decision Card: 600000 示例观察标的

状态:ENTRY_READY
结论:进入待执行观察
形态:breakout
置信度:0.62
收盘价:11.80
实时价:11.80
入场区间:[...]
止损位:...

Signals
- 已命中的确定性规则

Risks
- 计划失效条件与风险提示

Next Watch
- 下一轮需要继续确认的条件

分析记录默认写入 .stockops/reviews/,Harness 审计日志默认写入 .stockops/harness/。这两个目录均不会提交到 Git。

命令行入口

uv run stockops --help
uv run stockops chat --help
uv run stockops daemon --help

如果没有安装 console script,也可以使用模块入口:

uv run python -m stockops chat
uv run python -m stockops daemon --once

项目结构

StockOps/
├── agent.md                    # Harness 行为策略的唯一来源
├── config/                     # Provider 配置模板
├── data/watchlist/             # YAML 观察清单
├── examples/prices/            # 本地 CSV 示例行情
├── stockops/
│   ├── app/                    # CLI、Chat、daemon、Harness 与通知
│   ├── data/                   # 观察清单、行情 Provider 与记录仓库
│   ├── domain/                 # Pydantic 领域模型
│   ├── engine/                 # 信号规则、状态机和风险计划
│   ├── indicators/             # 技术指标
│   ├── llm/                    # 可替换的 LLM Provider
│   ├── report/                 # Decision Card 构建与 Markdown 渲染
│   └── workflow/               # LangGraph 分析流程
├── tests/                      # pytest 测试
└── pyproject.toml

设计原则

  1. 规则负责决策:指标、信号、状态转换和风险边界全部由确定性代码负责。
  2. LLM 只做复核:LLM 可以解释和质疑结果,但不能生成最终交易动作。
  3. Provider 可替换:业务流程只依赖统一行情接口,不直接依赖 AkShare 字段。
  4. 行为显式授权:Chat 与 daemon 的允许动作由 agent.md 控制。
  5. 保留人工确认:项目不下单,入场区间和止损位也必须由使用者复核。

开发

安装开发依赖并运行测试:

uv sync --extra dev
uv run pytest

提交改动前建议至少确认:

uv run pytest
uv run stockops --help
uv run stockops daemon --once

新增行情源时,请实现 PriceDataProviderMarketDataClient 抽象,不要让上游字段泄漏到 workflow。新增规则时,请保持指标计算、信号判断、状态转换和报告渲染之间的边界,并补充相应测试。

Roadmap

  • 持久化每只股票的最近状态,作为下一轮状态转换和变更检测的基线;
  • 只在状态发生变化时通知,并支持通知去重;
  • 接入飞书、邮件或系统通知;
  • 完善持仓风险检查和历史复盘;
  • 为港股、美股和更多行情 Provider 预留规范化标的模型;
  • 在任何真实交易集成前,优先提供独立的模拟交易与人工确认机制。

贡献

欢迎通过 Issue 提交问题、需求和设计建议,也欢迎发送 Pull Request。开始较大改动前,建议先创建 Issue 对齐功能边界。

请确保:

  • 新功能有清晰的用户场景,而不是只增加指标或模型调用;
  • 不绕过 Harness、规则引擎和人工确认边界;
  • 不提交 API Key、个人观察清单、交易记录或其他敏感数据;
  • 行为变化包含对应测试和文档更新。

安全与数据

  • API Key 应通过环境变量或被 Git 忽略的本地配置提供;
  • .stockops/ 中可能包含分析历史,请勿直接公开;
  • 外部行情接口可能限流、延迟、停服或返回错误数据,所有结果都需要人工复核;
  • 请勿将本项目直接用于无人值守的真实交易。

License

仓库当前尚未包含开源许可证。在许可证补充前,代码的使用、复制和分发权利并未被明确授予。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages