Skip to content

darron08/trade

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

个人交易系统 (Trade System)

概述

个人量化交易系统,用于记录交易、生成策略信号、跟踪持仓收益。当前策略为「国际版轮动」,未来可扩展多个策略。

快速开始

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

  • 数据源专注: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基金

交易规则

  1. 信号时间:每个交易日 14:50 左右
  2. 动量计算:取过去 N 个交易日(默认 22)的收盘价涨幅
  3. 买入条件:选择涨幅最高且为正收益的品种,全仓买入
  4. 空仓条件:所有品种涨幅均为负,则卖出全部持仓,持有现金
  5. 执行方式:手动在券商 APP 操作,然后通过 CLI 记录交易

efinance 数据接口

接口 用途 关键字段
ef.stock.get_quote_history(code) 场内 K 线历史数据 日期, 开盘, 收盘, 最高, 最低, 成交量, 涨跌幅
ef.stock.get_realtime_quotes() 盘中实时行情 最新价, 涨跌幅, 成交量, 成交额

注意:场内基金(ETF/LOF)使用 ef.stock 模块而非 ef.fund 模块。ef.stock 返回的是场内交易价格,ef.fund 返回的是基金净值。

数据库设计

ER 关系

strategies 1---N strategy_instruments
strategies 1---N trades
strategies 1---N cash_flows
strategies 1---N signals

表结构

strategies — 策略定义

字段 类型 说明
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 创建时间

strategy_instruments — 策略品种池

字段 类型 说明
id INTEGER PK 自增主键
strategy_id INTEGER FK 关联 strategies.id
code TEXT 证券代码,如 162411
name TEXT 证券名称,如 华宝油气LOF
instrument_type TEXT 品种类型:ETF / LOF
weight REAL 权重(等权默认 1.0)

trades — 交易记录

字段 类型 说明
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 备注

cash_flows — 现金流

字段 类型 说明
id INTEGER PK 自增主键
strategy_id INTEGER FK 关联 strategies.id
date TEXT 日期 YYYY-MM-DD
amount REAL 金额(正=入金,负=出金)
type TEXT deposit / withdrawal
notes TEXT 备注

signals — 策略信号

字段 类型 说明
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

daily_prices — 本地行情缓存

字段 类型 说明
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) 联合主键

CLI 命令参考

python -m trade_system init

初始化数据库,创建所有表和默认策略(国际版轮动)。

python -m trade_system signal [--strategy <name>] [--lookback <N>]

生成动量信号,输出各品种涨幅排名和推荐操作。

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 <name> --amount <amount> [--date <date>]

记录入金/出金。

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 [--strategy <name>]

查看当前持仓和现金余额。

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 [--strategy <name>]

查看收益指标。

python -m trade_system performance

输出示例:

策略:国际版轮动 | 运行天数:45

总收益率:      +3.21%
年化收益率:    +26.05%
最大回撤:      -2.15%
交易次数:      8 次
胜率:          62.5%
盈亏比:        1.85

python -m trade_system history [--strategy <name>] [--limit <N>]

查看交易历史。

python -m trade_system history --limit 10

python -m trade_system update-prices [--strategy <name>]

手动更新行情数据(通常由 signal 命令自动调用)。

python -m trade_system strategies

列出所有已注册的策略。

扩展新策略

  1. trade_system/strategies/ 下新建文件,如 domestic_rotation.py
  2. 继承 StrategyBase 基类,实现 calculate_signal() 方法
  3. 在数据库 strategies 表中注册新策略
  4. 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 外)
  • 交易记录一旦写入不可删除,只能通过新记录对冲

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages