基于 长桥 OpenAPI 的量化交易框架,支持策略扫描、信号推送和模拟交易。
⚠️ 重要提示: 当前连接的是模拟盘,所有交易操作均为模拟,不涉及真实资金。
quant-trading/
├── .env # API 凭证(包含长桥 API Key,勿提交)
├── .gitignore
├── README.md # 本文档
│
├── config/ # 配置模块
│ ├── __init__.py
│ ├── watchlist.py # 自选股列表(美股、港股、AI概念等)
│ └── risk_config.json # 风控配置
│
├── core/ # 核心模块
│ ├── __init__.py
│ ├── data.py # 数据获取(行情、K线)
│ ├── trader.py # 交易执行(集成风控)
│ └── risk.py # 风险管理模块
│
├── strategies/ # 交易策略
│ ├── __init__.py
│ ├── base.py # 策略基类 + 技术指标计算
│ ├── ma_cross.py # 均线交叉策略(金叉/死叉)
│ └── momentum.py # 动量策略(趋势追踪 + RSI)
│
├── data/ # 数据目录(自动生成)
│ ├── trades.jsonl # 交易记录
│ ├── risk_events.jsonl # 风控事件日志
│ └── risk_state.json # 风控状态
│
├── main.py # 交互式主程序(账户、行情、信号)
├── scan_signals.py # 信号扫描脚本(供 cron 调用)
├── monitor_stops.py # 止损止盈监控脚本
└── test_connection.py # API 连接测试
| 项目 | 值 |
|---|---|
| 账户类型 | 模拟盘 (Paper Trading) |
| 模拟资金 | HKD 800,000 |
| 港股行情 | Level 1 实时 |
| 美股行情 | Nasdaq Basic |
| A股行情 | Level 1 实时 |
# 进入项目目录
cd ~/clawd/quant-trading
# 激活虚拟环境
source .venv/bin/activatepython test_connection.py成功输出示例:
✅ 行情 API 连接成功
✅ 交易 API 连接成功
账户类型: 模拟盘
python main.py输出内容:
- 💰 账户资金余额
- 📊 当前持仓
- 📈 实时行情(默认显示 5 只)
- 🔍 信号扫描结果
# 格式化报告(适合消息推送)
python scan_signals.py
# JSON 格式输出(适合程序解析)
python scan_signals.py --jsonDataFetcher 类封装了长桥行情 API:
| 方法 | 功能 | 返回值 |
|---|---|---|
get_realtime_quotes(symbols) |
获取实时行情 | 行情列表 |
get_candlesticks(symbol, period, count) |
获取 K 线数据 | K 线列表 |
get_quote_with_change(symbols) |
获取行情+涨跌幅 | 字典列表 |
get_kline_df(symbol, days) |
获取 K 线(字典格式) | [{date, open, high, low, close, volume}, ...] |
使用示例:
from core.data import get_fetcher
fetcher = get_fetcher()
# 获取 NVDA 最近 50 天日K
data = fetcher.get_kline_df("NVDA.US", days=50)
# 获取实时行情
quotes = fetcher.get_quote_with_change(["AAPL.US", "GOOGL.US"])Trader 类封装了长桥交易 API:
| 方法 | 功能 | 说明 |
|---|---|---|
get_account_balance() |
查询账户余额 | 返回各币种余额 |
get_positions() |
查询持仓 | 返回持仓列表 |
get_today_orders() |
查询今日订单 | - |
submit_order(...) |
提交订单 | 支持限价/市价 |
cancel_order(order_id) |
取消订单 | - |
Dry Run 模式(默认开启):
from core.trader import get_trader
# dry_run=True(默认):只打印,不实际下单
trader = get_trader(dry_run=True)
trader.submit_order("AAPL.US", "buy", 10, price=150.0)
# 输出: 🔔 [DRY RUN] BUY 10 AAPL.US @ 150.0
# dry_run=False:实际下单(模拟盘)
trader = get_trader(dry_run=False)结合 ADX (平均趋向指标) 自动识别市场状态,动态切换交易逻辑:
-
强趋势模式 (ADX > 30)
- 策略:Alpha 101 (动量追踪)
- 逻辑:强者恒强,顺势而为。如果 Alpha 因子为正,买入;为负,卖出。
- 适用:大牛市、板块轮动主升浪。
-
观望模式 (20 <= ADX <= 30)
- 策略:空仓等待
- 逻辑:趋势不明显且震荡幅度不够,此时交易容易产生亏损(“绞肉机”行情)。系统将暂停开新仓,但会维持现有持仓的止损止盈。
-
震荡模式 (ADX < 20)
- 策略:Mean Reversion (均值回归)
- 逻辑:RSI 超卖 (<35) 买入,超买 (>65) 卖出。
- 适用:箱体震荡、盘整行情。
风控系统现已全面升级为 波动率自适应 (Adaptive Risk) 模式:
| 风控项 | 逻辑 | 说明 |
|---|---|---|
| ATR 止损 | Cost - ATR * 3.0 |
无论是稳健股还是高波股,均使用 ATR 动态设置止损线,适应不同股票的波动特性。 |
| 追踪止盈 | Trailing Stop |
浮盈 > 5% 开启追踪;最高点回撤 5% 触发止盈。 |
| 观望区保护 | Wait Zone |
当 ADX 进入 20-30 区间时,禁止开新仓,防止在趋势反转初期频繁止损。 |
BaseStrategy 提供以下技术指标计算方法:
# 移动平均线
ma = strategy.calculate_ma(data, period=20, key="close")
# RSI(相对强弱指数)
rsi = strategy.calculate_rsi(data, period=14)编辑 config/watchlist.py 管理自选股:
# 美股科技股
US_TECH = [
"AAPL.US", # 苹果
"MSFT.US", # 微软
"GOOGL.US", # 谷歌
"NVDA.US", # 英伟达
# ...
]
# 美股 AI 概念
US_AI = [
"NVDA.US", # 英伟达
"AMD.US", # AMD
"PLTR.US", # Palantir
# ...
]
# 港股科技
HK_TECH = [
"0700.HK", # 腾讯
"9988.HK", # 阿里巴巴
# ...
]获取自选股:
from config.watchlist import get_watchlist
# 获取美股科技股
symbols = get_watchlist("us_tech")
# 获取所有自选股
symbols = get_watchlist("all")
# 可用分类: default, us_tech, us_ai, hk_tech, all系统支持全自动交易:扫描信号 → 风控检查 → 自动下单。
cd ~/clawd/quant-trading
source .venv/bin/activate
# 预览模式(不实际下单)
python auto_trade.py --preview
# 执行自动交易
python auto_trade.py
# 指定策略和参数
python auto_trade.py --strategy momentum --max-buy 2 --min-confidence 0.2| 参数 | 默认值 | 说明 |
|---|---|---|
--preview, -p |
False | 预览模式,不实际下单 |
--strategy, -s |
all | 策略选择:all/ma/momentum |
--watchlist, -w |
us_tech | 自选股列表 |
--max-buy, -m |
3 | 单次最多买入订单数 |
--min-confidence, -c |
0.1 | 最低置信度要求 |
- 卖出优先 —— 先处理卖出信号,释放资金
- 不重复买入 —— 已持有的股票不会再买
- 智能仓位 —— 自动计算买入数量(不超过单笔限制)
- 风控拦截 —— 违反风控规则的订单会被拒绝
系统通过 Clawdbot Cron 实现自动化:
| 任务名 | Cron 表达式 | 时间 (GMT+8) | 说明 |
|---|---|---|---|
quant-signal-scan |
30 21 * * 1-5 |
周一至周五 21:30 | 美股开盘前扫描 |
quant-signal-mid |
0 0 * * 2-6 |
周二至周六 00:00 | 盘中扫描 |
quant-signal-close |
30 3 * * 2-6 |
周二至周六 03:30 | 收盘前扫描 |
| 任务名 | Cron 表达式 | 时间 (GMT+8) | 说明 |
|---|---|---|---|
quant-auto-trade |
45 21 * * 1-5 |
周一至周五 21:45 | 开盘后自动交易 |
| 任务名 | Cron 表达式 | 时间 (GMT+8) | 说明 |
|---|---|---|---|
quant-stop-monitor |
*/10 22-23,0-4 * * 1-5 |
交易时段每10分钟 | 止损止盈监控 |
美股交易时间(北京时间):
- 夏令时: 21:30 - 04:00
- 冬令时: 22:30 - 05:00
手动触发:
cd ~/clawd/quant-trading
source .venv/bin/activate
# 信号扫描
python scan_signals.py
# 自动交易
python auto_trade.py
# 止损监控
python monitor_stops.py系统内置完整的风控管理模块 (core/risk.py),支持自动化风险控制。
配置文件:config/risk_config.json
| 参数 | 默认值 | 说明 |
|---|---|---|
max_single_position_pct |
10% | 单笔最大仓位 |
max_total_position_pct |
80% | 总仓位上限 |
min_cash_reserve_pct |
20% | 最低现金保留 |
default_stop_loss_pct |
5% | 默认止损线 |
default_take_profit_pct |
15% | 默认止盈线 |
daily_loss_limit_pct |
3% | 每日最大亏损 |
daily_trade_limit |
20 | 每日最大交易次数 |
max_order_value |
50000 | 单笔最大金额 |
order_cooldown_seconds |
60 | 同一股票下单冷却 |
1. 订单验证
from core.trader import get_trader
trader = get_trader()
# 下单时自动进行风控检查
order = trader.submit_order("AAPL.US", "buy", 10, 150.0)
# 如果违反风控规则,订单会被拒绝并返回原因2. 止损止盈监控
# 检查并执行止损止盈
executed = trader.check_and_execute_stops()
# 或使用监控脚本
# python monitor_stops.py3. 智能仓位计算
# 自动计算合适的买入数量
order = trader.submit_order_with_size(
symbol="NVDA.US",
side="buy",
price=188.50,
risk_pct=0.08 # 使用 8% 仓位
)4. 紧急停止
# 紧急停止所有交易
trader.emergency_stop("市场异常波动")
# 恢复交易
trader.resume_trading()5. 风险报告
report = trader.get_risk_report()
print(report)使用 monitor_stops.py 定期检查持仓并执行止损止盈:
# 检查并执行止损止盈
python monitor_stops.py
# 仅输出风险报告(不执行交易)
python monitor_stops.py --report-only
# 检查后发送通知
python monitor_stops.py --notify可以配置为定时任务,在交易时段每隔 5-10 分钟执行一次。
所有交易记录保存在 data/ 目录:
trades.jsonl- 交易记录risk_events.jsonl- 风控事件risk_state.json- 风控状态
-
在
strategies/目录创建新文件,如rsi_reversal.py -
继承
BaseStrategy并实现analyze方法:
from .base import BaseStrategy, TradeSignal, Signal
class RSIReversalStrategy(BaseStrategy):
name = "RSI Reversal"
description = "RSI 超卖反转策略"
def __init__(self, rsi_period: int = 14, oversold: int = 30):
super().__init__()
self.rsi_period = rsi_period
self.oversold = oversold
def analyze(self, symbol: str, data: list) -> TradeSignal:
# 计算 RSI
rsi_values = self.calculate_rsi(data, self.rsi_period)
current_rsi = rsi_values[-1] if rsi_values else 50
current_price = data[-1]["close"]
# 超卖反转买入
if current_rsi < self.oversold:
return TradeSignal(
symbol=symbol,
signal=Signal.BUY,
price=current_price,
reason=f"RSI 超卖反转 ({current_rsi:.0f} < {self.oversold})",
confidence=min((self.oversold - current_rsi) / 30, 1.0)
)
return TradeSignal(
symbol=symbol,
signal=Signal.HOLD,
price=current_price,
reason=f"RSI {current_rsi:.0f}",
confidence=0.5
)- 在
scan_signals.py中添加新策略:
from strategies.rsi_reversal import RSIReversalStrategy
strategies = [
MACrossStrategy(short_period=5, long_period=20),
MomentumStrategy(lookback=20, rsi_period=14),
RSIReversalStrategy(rsi_period=14, oversold=30), # 新增
].env 文件需包含长桥 API 凭证:
LONGPORT_APP_KEY=your_app_key
LONGPORT_APP_SECRET=your_app_secret
LONGPORT_ACCESS_TOKEN=your_access_token获取方式:长桥开发者中心
A: 扫描使用的是最近一个交易日的收盘价(日 K 线数据),而非实时盘口价格。美股收盘后扫描的是当天数据,未开盘时扫描的是前一交易日数据。
A: 需要在长桥开通实盘账户,并更新 .env 中的 API 凭证。代码层面需将 Trader 的 dry_run 参数设为 False。
A: 可能原因:
- 股票代码格式错误(需要
AAPL.US格式) - 该股票不在订阅行情范围内
- API 请求频率限制
仅供学习研究使用,不构成投资建议。
最后更新: 2026-01-28