用 Python 写的美股量化交易模拟系统。$1,000,000 虚拟资金,三桶策略(保守/成长/短线),自动选股、买卖、止损止盈。
纯模拟,不做真实下单。 所有交易记录在本地
virtual_account.json,不连接真实券商账户。
用 TradingView 历史数据对 83 只股票回测,时间范围 2025-01-01 → 2025-06-30:
| 指标 | 结果 |
|---|---|
| 初始资金 | $1,000,000 |
| 期末总盈亏 | +$195,806 |
| 总收益率 | +19.58% |
| 胜率(盈利笔数/总笔数) | 73% |
| 总交易笔数 | 364 |
| 最佳单票 | STX(+$14,389) |
各桶分解:
| 桶 | 收益 | 年化 |
|---|---|---|
| 保守桶(蓝筹) | +$26,461 | 5.4% |
| 成长桶(半导体/AI) | +$102,745 | 24.7% |
| 短线桶(高波动) | +$66,601 | 18.7% |
不同股票有不同的"节奏"。AAPL 涨得稳但慢,NVDA 跟着 AI 浪潮大起大落,PLTR 每次财报都像坐过山车。用同一套参数管所有股票,要么信号太慢错过短线机会,要么噪音太多频繁止损。
三桶结构让每类股票用最适合它的均线周期和信号逻辑,互不干扰。
持仓股票: AAPL、MSFT、GOOGL、AMZN、META、BRK-B、JPM、V、JNJ、PG 等蓝筹
均线周期: 10MA(短期)/ 50MA(长期)— 周期更长,过滤掉日常波动噪音
信号逻辑:
- 主要看金叉(10MA 上穿 50MA),代表中期趋势反转
- 配合 RSI < 65 过滤(避免追高,RSI 过高说明短期已超买)
- ADX ≥ 18 确认趋势真实性,防止横盘假金叉
仓位: 每笔占该股分配额的 65%
止损: -6%(容错空间大,蓝筹不容易短期大跌)
持仓股票: NVDA、AMD、TSM、STX、SMCI、ASML、AMAT、KLAC、ARM、MRVL 等半导体/AI 标的
均线周期: 5MA / 20MA — 周期更短,捕捉科技股的快速轮动
信号逻辑:
- 金叉(5MA 上穿 20MA)为主要买入触发
- 同时要求 MACD 金叉(MACD 线上穿信号线),动量双重确认
- ADX ≥ 18 确保是真趋势而非震荡
仓位: 每笔占分配额的 70%,对高确定性趋势股给更大仓位
止损: -5%
持仓股票: TSLA、PLTR、OKLO、MSTR、COIN、RKLB、IONQ 等高波动主题股
均线周期: 5MA / 20MA
信号逻辑:
- 金叉 + 量比 ≥ 1.5x(当日成交量至少是近期均量的 1.5 倍)
- 量价配合是短线最重要的过滤器,有量才有驱动力
- ADX ≥ 18 同样适用
仓位: 每笔占分配额的 55%,高波动所以仓位最保守
止损: -4%(最严格,短线不留情)
金叉是经典趋势信号,但在横盘震荡期会出现大量假信号。ADX(平均趋势指数)衡量趋势的"强度"——不管涨跌,只看是否在趋势中。
| ADX 值 | 含义 | 操作 |
|---|---|---|
| < 18 | 市场在磨底震荡 | 跳过该金叉信号 |
| 18–25 | 趋势初步形成 | 允许入场 |
| > 25 | 趋势强劲 | 允许入场 |
加入这个过滤器后,回测中亏损单比例显著下降。
持仓盈利后分两次追加,越涨越加:
| 阶段 | 触发条件 | 加仓量 |
|---|---|---|
| 第一次加仓 | 盈利 +5% | 初始仓位的 30% |
| 第二次加仓 | 盈利 +12% | 初始仓位的 20% |
股票涨了说明方向判断正确,追加让利润继续跑。加仓量递减控制整体风险,避免在高位重仓。
不一次全卖,分三阶段锁定利润:
| 阶段 | 触发条件 | 操作 |
|---|---|---|
| 第一批 | 盈利 +4% | 卖出持仓的 30% |
| 第二批 | 盈利 +8% | 再卖出 60% |
| 尾仓 | 移动止损跟踪 | 盈利 ≥ 2% 时激活,ATR × 1.2 跟踪 |
股票继续涨时留有仓位继续吃利润,同时避免利润全部回吐。
传统方法用 ATR 反推最大亏损手数——低波动期仓位会极小,导致实际资金利用率很低。
本系统改用固定比例法:
手数 = floor(每股分配额 × 仓位比例 / 当前股价)
每股分配额 = 总资金 / 持仓股票数
仓位稳定,不受波动率影响,资金利用率提升约 34 倍(相比原 ATR/$200 方案)。
stock-bot/
├── backtest.py # 回测引擎(本地历史数据,模拟完整交易流程)
├── portfolio_bot.py # 实盘模拟调度器入口
├── workers.py # 后台线程(信号扫描 / 止损监控 / 定时建仓)
├── strategy_config.py # 三桶参数配置(均线、止损、仓位比例、ADX 阈值)
├── strategy_signals.py # 信号检测(金叉 / 回踩 / 突破 / ADX / MACD)
├── execution_policy.py # 仓位计算(equity_pct_qty 权重式)
├── fetch_tv_data.js # TradingView 历史数据下载(Node.js)
├── dashboard.py # Streamlit 实时监控面板
├── local_broker.py # 虚拟经纪商(读写 virtual_account.json)
└── historical_data/ # 83 只股票日线 CSV
1. 下载历史数据
cd TradingView-API
node fetch_tv_data.js --from 2025-01-01 --to 2025-06-30数据来自 TradingView,无需 API Key,存为 historical_data/<TICKER>.csv。
2. 运行回测
python3 backtest.py --local --from 2025-01-01 --to 2025-06-30完成后生成:
backtest_summary.csv— 各股票汇总backtest_trades.csv— 每笔交易明细backtest_report.html— 可视化报告
3. 查看可视化报告
open backtest_report.html报告包含:KPI 卡片、权益曲线、三桶收益对比、最佳/最差股票、信号分布、完整交易记录。
4. 启动实时面板
需要安装并运行 moomoo OpenD(用于获取实时行情):
streamlit run dashboard.pypip install pandas numpy streamlit futu-api
npm install # 在 TradingView-API/ 目录下| 组件 | 用途 |
|---|---|
| Python 3.11+ | 主要语言 |
| pandas / numpy | 数据处理与指标计算 |
| streamlit | 实时监控面板 |
| moomoo OpenD | 实时行情(仅面板使用) |
| Node.js + TradingView-API | 历史数据下载 |
本项目纯属学习研究用途,不构成任何投资建议。所有回测结果基于历史数据,不代表未来表现。