个人量化交易系统,用于记录交易、生成策略信号、跟踪持仓收益。当前策略为「国际版轮动」,未来可扩展多个策略。
pip install -r requirements.txt
python -m trade_system init # 初始化数据库
python -m trade_system signal # 查看今日动量信号
python -m trade_system status # 查看当前持仓
python -m trade_system performance # 查看收益指标
python -m trade_system history # 查看交易历史trade/
├── README.md # 本文件
├── AGENTS.md # AI 协作指南
├── requirements.txt # Python 依赖
├── trade.db # SQLite 数据库(运行后生成)
└── trade_system/
├── __init__.py
├── cli.py # 命令行入口(click)
├── db.py # 数据库初始化、连接管理
├── models.py # 数据模型定义
├── fetcher.py # 行情数据抓取(efinance)
├── strategy_base.py # 策略抽象基类
├── strategies/
│ ├── __init__.py
│ └── international_rotation.py # 国际版轮动策略
├── portfolio.py # 持仓跟踪 & 收益计算
└── recorder.py # 交易记录管理
| 组件 | 选型 | 说明 |
|---|---|---|
| 语言 | Python 3.10+ | |
| 数据库 | SQLite | 零配置,单文件,适合个人使用 |
| 行情数据 | efinance | 东方财富数据源,API 稳定,维护活跃 |
| 数据处理 | pandas | 收益计算、时间序列处理 |
| CLI | click | 命令行交互 |
- 数据源专注:efinance 专注东方财富一个数据源,akshare 爬取几十个网站
- API 稳定性:akshare 频繁 breaking change,东方财富改页面就挂;efinance 更稳定
- 依赖轻量:efinance 依赖少,安装快
- 维护活跃:efinance v0.5.8(2026-03-18),持续维护中
在以下 3 个场内品种之间做动量轮动:
| 代码 | 名称 | 类型 |
|---|---|---|
| 162411 | 华宝油气LOF | LOF基金 |
| 159915 | 创业板ETF易方达 | ETF基金 |
| 159941 | 纳指ETF广发 | ETF基金 |
- 信号时间:每个交易日 14:50 左右
- 动量计算:取过去 N 个交易日(默认 22)的收盘价涨幅
- 买入条件:选择涨幅最高且为正收益的品种,全仓买入
- 空仓条件:所有品种涨幅均为负,则卖出全部持仓,持有现金
- 执行方式:手动在券商 APP 操作,然后通过 CLI 记录交易
| 接口 | 用途 | 关键字段 |
|---|---|---|
ef.stock.get_quote_history(code) |
场内 K 线历史数据 | 日期, 开盘, 收盘, 最高, 最低, 成交量, 涨跌幅 |
ef.stock.get_realtime_quotes() |
盘中实时行情 | 最新价, 涨跌幅, 成交量, 成交额 |
注意:场内基金(ETF/LOF)使用
ef.stock模块而非ef.fund模块。ef.stock返回的是场内交易价格,ef.fund返回的是基金净值。
strategies 1---N strategy_instruments
strategies 1---N trades
strategies 1---N cash_flows
strategies 1---N signals
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增主键 |
| name | TEXT UNIQUE | 策略名称,如 international_rotation |
| display_name | TEXT | 显示名,如 国际版轮动 |
| description | TEXT | 策略描述 |
| params | TEXT (JSON) | 策略参数,如 {"lookback": 22, "signal_time": "14:50"} |
| created_at | TEXT | 创建时间 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增主键 |
| strategy_id | INTEGER FK | 关联 strategies.id |
| code | TEXT | 证券代码,如 162411 |
| name | TEXT | 证券名称,如 华宝油气LOF |
| instrument_type | TEXT | 品种类型:ETF / LOF |
| weight | REAL | 权重(等权默认 1.0) |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增主键 |
| strategy_id | INTEGER FK | 关联 strategies.id |
| date | TEXT | 交易日期 YYYY-MM-DD |
| code | TEXT | 证券代码 |
| direction | TEXT | buy / sell |
| price | REAL | 成交价格 |
| quantity | INTEGER | 成交数量(份) |
| commission | REAL | 手续费 |
| notes | TEXT | 备注 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增主键 |
| strategy_id | INTEGER FK | 关联 strategies.id |
| date | TEXT | 日期 YYYY-MM-DD |
| amount | REAL | 金额(正=入金,负=出金) |
| type | TEXT | deposit / withdrawal |
| notes | TEXT | 备注 |
| 字段 | 类型 | 说明 |
|---|---|---|
| id | INTEGER PK | 自增主键 |
| strategy_id | INTEGER FK | 关联 strategies.id |
| date | TEXT | 日期 YYYY-MM-DD |
| code | TEXT | 证券代码 |
| momentum_return | REAL | 动量收益率(小数,如 0.05 = 5%) |
| rank | INTEGER | 动量排名(1 = 最强) |
| action | TEXT | buy / sell / hold / empty |
| 字段 | 类型 | 说明 |
|---|---|---|
| code | TEXT | 证券代码 |
| date | TEXT | 日期 YYYY-MM-DD |
| open | REAL | 开盘价 |
| high | REAL | 最高价 |
| low | REAL | 最低价 |
| close | REAL | 收盘价 |
| volume | REAL | 成交量 |
| turnover | REAL | 成交额 |
| change_pct | REAL | 涨跌幅(小数) |
| PRIMARY KEY | (code, date) | 联合主键 |
初始化数据库,创建所有表和默认策略(国际版轮动)。
生成动量信号,输出各品种涨幅排名和推荐操作。
python -m trade_system signal # 使用默认策略
python -m trade_system signal --lookback 20 # 自定义回看天数输出示例:
策略:国际版轮动 | 回看天数:22 | 日期:2026-03-30
排名 品种 代码 22日涨幅
1 纳指ETF广发 159941 +5.23%
2 华宝油气LOF 162411 +2.15%
3 创业板ETF易方达 159915 -1.08%
建议操作:买入 159941 纳指ETF广发
python -m trade_system record --strategy <name> --code <code> --buy|--sell --price <price> --qty <qty> [--commission <fee>] [--date <date>]
记录一笔交易。
python -m trade_system record --strategy international_rotation \
--code 162411 --buy --price 1.134 --qty 6200 --commission 0.70记录入金/出金。
python -m trade_system deposit --strategy international_rotation --amount 7031.50
python -m trade_system deposit --strategy international_rotation --amount -5000 --type withdrawal查看当前持仓和现金余额。
python -m trade_system status输出示例:
策略:国际版轮动
持仓:
华宝油气LOF (162411) 6200份 成本1.134 现价1.152 盈亏+1.59%
现金余额:0.00 元
总资产:7,142.40 元
总收益率:+1.59%
查看收益指标。
python -m trade_system performance输出示例:
策略:国际版轮动 | 运行天数:45
总收益率: +3.21%
年化收益率: +26.05%
最大回撤: -2.15%
交易次数: 8 次
胜率: 62.5%
盈亏比: 1.85
查看交易历史。
python -m trade_system history --limit 10手动更新行情数据(通常由 signal 命令自动调用)。
列出所有已注册的策略。
- 在
trade_system/strategies/下新建文件,如domestic_rotation.py - 继承
StrategyBase基类,实现calculate_signal()方法 - 在数据库
strategies表中注册新策略 - 在
strategy_instruments表中配置品种池
from trade_system.strategy_base import StrategyBase
class DomesticRotation(StrategyBase):
name = "domestic_rotation"
display_name = "国内版轮动"
def calculate_signal(self, prices_df):
# 实现你的策略逻辑
# 返回 Signal 对象
...| 交易类型 | 费率 | 最低 |
|---|---|---|
| ETF/LOF 交易 | 万1 | 0.2 元 |
| LOF 申购(场外) | 1折 | — |
| 沪市债券 | 万0.05 | — |
| 深市债券 | 万0.8 | 0.5 元 |
| 沪市可转债 | 万0.44 | — |
| 深市可转债 | 万0.8 | 0.5 元 |
| A股股票 | 万1.65 | 5 元 |
基金卖出无印花税。
- 所有金额精确到分(2 位小数)
- 日期格式统一为
YYYY-MM-DD - 收益率以小数存储(如 0.05 = 5%),显示时转换为百分比
- 数据库操作通过
db.py模块,不直接写 SQL 字符串(除 models.py 外) - 交易记录一旦写入不可删除,只能通过新记录对冲