feat: 初始化量化交易知识库 v1.0

- 01_基础理论:量化交易基础概念、市场微观结构、加密货币特殊性
- 02_技术指标:完整指标体系(MA/EMA/MACD/RSI/KDJ/布林带/SuperTrend/DMI等)
- 03_交易策略:趋势跟踪、均值回归、套利、动量策略详解
- 04_交易信号系统:多指标共振评分引擎(基于 tradehk 项目)
- 05_市场品种:加密货币、XAUT黄金代币、代币化美股全览
- 06_数据流程:数据采集、清洗、存储、实时流处理
- 07_回测框架:回测方法论、偏差规避、绩效评估指标
- 08_风险管理:仓位管理、止损止盈、Kelly公式、杠杆管理
- 09_AI与机器学习:深度学习、强化学习、LLM在量化投资中的应用
- 10_链上数据分析:SOPR/MVRV/巨鲸监控/衍生品数据
- 11_参考文献:arXiv论文汇总、开源项目、数据平台资源
- samples/:Python信号计算器和回测样本代码

参考项目:tradehk(ssh://git@git.hk.hao.work:2222/hao/tradehk.git)
全部中文化,适用于加密货币(CEX/DEX)、XAUT黄金、代币化美股
这个提交包含在:
Manus Quant Agent
2026-03-05 21:36:56 -05:00
当前提交 f1d939b460
修改 15 个文件,包含 3431 行新增0 行删除

14
.gitignore vendored 普通文件
查看文件

@@ -0,0 +1,14 @@
__pycache__/
*.pyc
*.pyo
.DS_Store
*.egg-info/
.env
.venv/
venv/
*.log
.idea/
.vscode/
*.swp
assets/data/*.csv
assets/data/*.parquet

查看文件

@@ -0,0 +1,129 @@
# 量化交易基础概念
> **量化交易**Quantitative Trading是指将交易思路转化为明确规则,通过数据、统计和预定义条件进行决策,而非依赖直觉或情绪的交易方式。其核心目标不是完美预测市场,而是构建可重复执行的系统,在时间维度上持续利用微小的统计优势。[^1]
---
## 一、量化交易的核心要素
量化交易系统通常由以下五个核心模块构成:
| 模块 | 功能 | 关键技术 |
|------|------|----------|
| 数据采集 | 获取行情、链上、新闻等多维数据 | REST API、WebSocket、爬虫 |
| 信号生成 | 基于指标和模型产生买卖信号 | 技术分析、机器学习 |
| 策略执行 | 将信号转化为订单指令 | 算法执行、智能路由 |
| 风险管理 | 控制仓位、止损、最大回撤 | Kelly 公式、VaR 模型 |
| 绩效评估 | 回测与实盘对比分析 | 夏普比率、最大回撤 |
---
## 二、市场微观结构
### 2.1 订单簿Order Book
订单簿是市场微观结构的核心,记录了所有未成交的买单Bid和卖单Ask。量化交易者需要理解
- **买卖价差Bid-Ask Spread**:做市商的利润来源,也是高频策略的主要成本
- **市场深度Market Depth**:衡量大额订单对价格的冲击程度
- **流动性Liquidity**:在不显著影响价格的情况下买卖资产的能力
### 2.2 价格形成机制
加密货币市场的价格形成受以下因素影响:
- **现货市场**:供需关系直接决定价格
- **期货市场**期货溢价Contango或贴水Backwardation反映市场预期
- **资金费率Funding Rate**:永续合约特有机制,平衡多空双方持仓成本
- **清算瀑布Liquidation Cascade**:大规模强制平仓引发的连锁反应
### 2.3 市场效率与 Alpha
根据有效市场假说EMH,市场价格已反映所有可获得信息。然而加密货币市场由于以下原因存在明显的 Alpha 机会:
- 市场参与者以散户为主,行为偏差显著
- 信息不对称程度高,链上数据可提供独特洞察
- 监管不完善,套利机会更多
- 7×24 小时交易,跨时区价差频繁出现
---
## 三、量化交易的优势与挑战
### 3.1 核心优势
**可扩展性**:一旦策略验证有效,扩大规模只需调整参数或增加资金,无需线性增加人力投入。
**情绪中立**:系统严格按照预设规则执行,消除了人类交易中常见的恐惧、贪婪等情绪干扰。
**速度优势**:算法可在毫秒级完成信号计算和订单提交,远超人工操作速度。
**多策略并行**:可同时运行多个不相关策略,通过分散化降低整体风险。
### 3.2 主要挑战
**过拟合风险**:策略在历史数据上表现优异,但在实盘中失效。这是量化交易最常见的陷阱。
**数据质量**:加密货币市场存在大量"刷量"数据,需要仔细清洗和验证。
**市场制度变化**:监管政策、交易所规则、市场结构的变化可能使原本有效的策略失效。
**技术风险**网络延迟、API 故障、程序 Bug 等技术问题可能导致意外损失。
---
## 四、量化交易的核心技能要求
成功的量化交易者需要具备以下能力的交叉:
```
数学/统计学
编程能力 ←→ 金融知识
风险管理
```
- **数学/统计学**:概率论、时间序列分析、随机过程
- **编程能力**Pythonpandas、numpy、backtrader、数据库、API 调用
- **金融知识**:市场结构、技术分析、基本面分析
- **风险管理**:仓位管理、相关性分析、压力测试
---
## 五、加密货币量化的特殊性
与传统金融市场相比,加密货币量化交易具有以下独特特征:
| 特征 | 传统金融 | 加密货币 |
|------|----------|----------|
| 交易时间 | 工作日 9:00-15:30 | 7×24 小时 |
| 波动率 | 年化 15-25%(股票) | 年化 50-200%(主流币) |
| 数据透明度 | 有限SEC 披露) | 高(链上数据完全公开) |
| 监管环境 | 成熟完善 | 不断演变 |
| 交易成本 | 较低(机构级) | 中等0.02%-0.1% |
| 市场深度 | 深(主要股票) | 浅(山寨币) |
| 资产相关性 | 与宏观经济相关 | 高度内部相关 |
---
## 六、量化交易的发展历程
量化交易的发展可分为三个阶段:
**第一阶段1970s-2000s统计套利时代**
以 Renaissance Technologies 为代表,利用统计模型发现价格规律,主要依赖人工设计的因子。
**第二阶段2000s-2020s机器学习时代**
深度学习的兴起使得自动特征提取成为可能,LSTM、Transformer 等模型被广泛应用于价格预测。
**第三阶段2020s-至今):大模型与 Agent 时代**
LLM大语言模型开始处理非结构化数据新闻、社交媒体,强化学习 Agent 实现端到端的自主交易决策。[^2]
---
## 参考资料
[^1]: Whaleportal. "Quantitative Crypto Trading: Strategies, Automation & Backtesting". https://whaleportal.com/blog/quantitative-crypto-trading-strategies-automation-backtesting/
[^2]: Cao, B. et al. "From Deep Learning to LLMs: A survey of AI in Quantitative Investment". arXiv:2503.21422, 2025. https://arxiv.org/abs/2503.21422

查看文件

@@ -0,0 +1,356 @@
# 技术指标全集
> 本文档系统整理量化交易中常用的技术指标,涵盖趋势、动量、波动率、成交量四大类别,并结合 tradehk 项目的实际实现进行深度解析。所有公式均已验证,参数建议基于加密货币市场特性优化。
---
## 一、趋势类指标
### 1.1 简单移动均线MA / SMA
**原理**:对过去 N 个周期的收盘价取算术平均值,平滑价格噪音,识别趋势方向。
**公式**
$$MA(N) = \frac{1}{N} \sum_{i=0}^{N-1} Close_{t-i}$$
**tradehk 实现参数**MA10短期+ MA100长期
**信号逻辑**
- 价格 > MA10 > MA100多头排列,看涨
- 价格 < MA10 < MA100空头排列,看跌
- MA10 上穿 MA100金叉,买入信号
- MA10 下穿 MA100死叉,卖出信号
**加密货币适用性**MA 在趋势明显的牛市/熊市中效果显著,震荡市中产生大量假信号,需配合其他指标过滤。
---
### 1.2 指数移动均线EMA
**原理**:对近期数据赋予更高权重的移动均线,对价格变化反应更灵敏。
**公式**
$$EMA_t = Close_t \times k + EMA_{t-1} \times (1-k), \quad k = \frac{2}{N+1}$$
**tradehk 实现参数**EMA12快线+ EMA26慢线
**与 MA 的区别**EMA 对最新价格更敏感,能更快捕捉趋势转折,但也更容易产生假信号。
---
### 1.3 超级趋势线SuperTrend
**原理**:基于 ATR真实波动幅度动态计算上下轨,当价格突破上轨转为看空,突破下轨转为看多。
**公式**
$$ATR = RMA(TR, period)$$
$$上轨 = \frac{High + Low}{2} + multiplier \times ATR$$
$$下轨 = \frac{High + Low}{2} - multiplier \times ATR$$
**tradehk 实现参数**period=10,multiplier=3
**信号逻辑**
- 方向由 -1 变为 +1趋势反转看多权重 +2
- 方向由 +1 变为 -1趋势反转看空权重 +2
- 持续多头趋势中:看多(权重 +1
- 持续空头趋势中:看空(权重 +1
**优势**SuperTrend 是趋势跟踪的利器,在单边行情中表现极佳,止损位动态跟随趋势,不会过早出局。
---
## 二、动量类指标
### 2.1 艾略特波浪振荡器EWO
**原理**EWO = EMA(5) - EMA(35),衡量短期动量相对于中期趋势的偏离程度。
**公式**
$$EWO = EMA(Close, 5) - EMA(Close, 35)$$
**信号解读**
- EWO > 0绿色短期动量强于中期,多头动能
- EWO < 0红色短期动量弱于中期,空头动能
- EWO 由负转正:动量反转,潜在买入机会
- EWO 由正转负:动量衰减,潜在卖出机会
**在 tradehk 大周期偏向判断中的权重**EWO 是最重要的指标,权重为 2其他指标权重均为 1。当 EWO < 0 时,大周期偏向空头;EWO > 0 时,大周期偏向多头。
---
### 2.2 MACD指数平滑异同移动平均线
**原理**:通过两条 EMA 的差值及其信号线,识别趋势变化和动量强弱。
**标准参数12, 26, 9**
$$MACD线 = EMA(12) - EMA(26)$$
$$信号线 = EMA(MACD线, 9)$$
$$柱状图 = MACD线 - 信号线$$
**tradehk 特殊参数10, 20, 10**:针对加密货币短周期优化,反应更灵敏。
**信号逻辑**
| 信号 | 条件 | 权重 |
|------|------|------|
| MACD 金叉 | MACD 线上穿信号线 | +2看多 |
| MACD 死叉 | MACD 线下穿信号线 | +2看空 |
| 柱状图扩大(正) | 柱状图 > 0 且增大 | +1多头增强 |
| 柱状图扩大(负) | 柱状图 < 0 且减小 | +1空头增强 |
**背离信号**
- **顶背离**价格创新高,MACD 未创新高 → 上涨动能衰竭,看空
- **底背离**价格创新低,MACD 未创新低 → 下跌动能衰竭,看多
---
### 2.3 动量振荡器AO,Awesome Oscillator
**原理**AO = SMA(中点价, 5) - SMA(中点价, 34),中点价 = (High + Low) / 2
**公式**
$$AO = SMA\left(\frac{H+L}{2}, 5\right) - SMA\left(\frac{H+L}{2}, 34\right)$$
**信号逻辑**
- AO 上穿零轴:动量由空转多(权重 +1
- AO 下穿零轴:动量由多转空(权重 +1
- 双峰形态Saucer连续两个正值柱,第二个更高 → 买入
- 碟形形态Twin Peaks两个负值低点,第二个更高 → 买入
---
### 2.4 相对强弱指数RSI
**原理**:通过比较一段时间内涨跌幅的平均值,衡量价格动量的强弱。
**公式**
$$RS = \frac{平均涨幅}{平均跌幅}$$
$$RSI = 100 - \frac{100}{1 + RS}$$
**tradehk 实现**:使用 Wilder 平滑法RMA,period=14
**标准阈值**
- RSI > 70超买区,价格可能回落
- RSI < 30超卖区,价格可能反弹
- RSI 从超卖区回升(穿越 30看多反转信号
- RSI 从超买区回落(穿越 70看空反转信号
**加密货币调整**:由于加密货币波动性更大,部分交易者将阈值调整为 80/20,以减少假信号。
---
### 2.5 随机指标Stochastic Oscillator
**原理**:衡量当前收盘价在过去 N 个周期最高价和最低价范围内的相对位置。
**公式**
$$\%K = \frac{Close - LL_N}{HH_N - LL_N} \times 100$$
$$\%D = SMA(\%K, 3)$$
**tradehk 实现参数**kPeriod=14,dPeriod=3
**信号逻辑**
- K、D 均低于 20超卖区,看多
- K、D 均高于 80超买区,看空
- K 上穿 D低位金叉买入信号
- K 下穿 D高位死叉卖出信号
---
### 2.6 随机 RSIStochRSI
**原理**:将 Stochastic 公式应用于 RSI 值,比 RSI 更敏感,更早发出信号。
**公式**
$$StochRSI = \frac{RSI - \min(RSI, N)}{\max(RSI, N) - \min(RSI, N)}$$
**tradehk 实现参数**rsiPeriod=14,stochPeriod=14,kSmooth=3,dSmooth=3
**使用注意**StochRSI 比 RSI 更敏感,假信号更多,建议配合趋势指标使用。
---
### 2.7 KDJ 指标
**原理**KDJ 是在随机指标基础上增加 J 线的改进版本,J 线放大了 K 和 D 的偏离程度。
**公式**
$$K_t = \frac{2}{3} K_{t-1} + \frac{1}{3} RSV_t$$
$$D_t = \frac{2}{3} D_{t-1} + \frac{1}{3} K_t$$
$$J = 3K - 2D$$
**tradehk 实现参数**period=9,kSmooth=3,dSmooth=3
**信号逻辑**
| 信号 | 条件 | 权重 |
|------|------|------|
| 低位金叉 | K 上穿 D 且 K < 30 | +2强看多 |
| 普通金叉 | K 上穿 D | +1看多 |
| 高位死叉 | K 下穿 D 且 K > 70 | +2强看空 |
| 普通死叉 | K 下穿 D | +1看空 |
**J 线特性**J 线超过 100 或低于 0 时,表示市场极度超买或超卖,往往预示反转。
---
## 三、波动率类指标
### 3.1 布林带Bollinger Bands
**原理**:以移动均线为中轨,上下各加减 N 倍标准差形成通道,衡量价格波动范围。
**公式**
$$中轨 = MA(Close, 20)$$
$$上轨 = 中轨 + 2 \times \sigma_{20}$$
$$下轨 = 中轨 - 2 \times \sigma_{20}$$
**tradehk 实现参数**period=20,multiplier=2
**信号逻辑**
- 价格触及下轨:超卖反弹信号(权重 +1
- 价格触及上轨:超买回落信号(权重 +1
- 带宽极度收窄(< 2%):即将变盘警告
**布林带收缩Squeeze**:当上下轨距离极小时,表明市场处于低波动整理阶段,即将爆发大行情。结合 TTM Squeeze 指标可更精确判断方向。
---
### 3.2 TTM Squeeze挤压动量指标
**原理**:结合布林带和 Keltner 通道,当布林带收缩在 Keltner 通道内时触发"挤压"状态,结合动量柱判断突破方向。
**公式**
$$KC_{上} = EMA(Close, 20) + 1.5 \times ATR(20)$$
$$KC_{下} = EMA(Close, 20) - 1.5 \times ATR(20)$$
$$挤压状态 = BB_{上} < KC_{上} \text{ 且 } BB_{下} > KC_{下}$$
**tradehk 实现参数**bbPeriod=20,kcPeriod=20
**信号解读**
- 挤压状态(红点):市场蓄势待发
- 挤压释放(绿点):行情即将爆发
- 动量柱由负转正:看多突破
- 动量柱由正转负:看空突破
---
### 3.3 真实波动幅度ATR
**原理**:衡量市场波动性的指标,是 SuperTrend 等指标的基础。
**公式**
$$TR = \max(H-L, |H-C_{prev}|, |L-C_{prev}|)$$
$$ATR = RMA(TR, N)$$
**应用场景**
- 动态止损:止损位 = 入场价 - N × ATR多头
- 仓位管理:仓位大小与 ATR 成反比,波动大时减仓
- 过滤低波动期ATR 过低时暂停交易
---
## 四、成交量类指标
### 4.1 能量潮OBV,On-Balance Volume
**原理**:累计成交量,价格上涨时加上成交量,价格下跌时减去成交量,反映资金流向。
**公式**
$$OBV_t = \begin{cases} OBV_{t-1} + Volume_t & \text{if } Close_t > Close_{t-1} \\ OBV_{t-1} - Volume_t & \text{if } Close_t < Close_{t-1} \\ OBV_{t-1} & \text{if } Close_t = Close_{t-1} \end{cases}$$
**信号解读**
- OBV 与价格同向上涨:趋势健康,资金持续流入
- OBV 背离价格(价格新高但 OBV 未新高):上涨动能不足,警惕回调
- OBV 突破前高:强烈看多信号
---
### 4.2 资金流量指数MFI,Money Flow Index
**原理**:结合价格和成交量的 RSI,衡量资金流入流出的强度。
**公式**
$$典型价格 = \frac{H + L + C}{3}$$
$$资金流 = 典型价格 \times 成交量$$
$$MFI = 100 - \frac{100}{1 + \frac{正向资金流}{负向资金流}}$$
**tradehk 实现参数**period=14
**阈值**
- MFI > 80资金大量流入,超买
- MFI < 20资金大量流出,超卖
---
### 4.3 成交量收缩检测
**tradehk 实现**:检测最近 5 根 K 线的平均成交量是否低于前 5 根的 70%。
**信号含义**:成交量收缩通常意味着市场观望情绪浓厚,趋势可能即将反转或大行情即将爆发,需等待放量确认。
---
## 五、趋势强度类指标
### 5.1 趋向运动指数DMI/ADX
**原理**DMI 通过计算 +DI多头方向线和 -DI空头方向线判断趋势方向,ADX 衡量趋势强度。
**公式**
$$+DM = H_t - H_{t-1} \text{(若 > 0 且 > -DM}$$
$$-DM = L_{t-1} - L_t \text{(若 > 0 且 > +DM}$$
$$+DI = \frac{RMA(+DM, N)}{ATR} \times 100$$
$$-DI = \frac{RMA(-DM, N)}{ATR} \times 100$$
$$ADX = RMA\left(\frac{|+DI - (-DI)|}{+DI + (-DI)}, N\right) \times 100$$
**tradehk 实现参数**period=14
**信号逻辑(仅在 ADX > 25 时有效)**
| 信号 | 条件 | 权重 |
|------|------|------|
| 强趋势看多金叉 | +DI 上穿 -DI,ADX > 25 | +2 |
| 强趋势看空死叉 | +DI 下穿 -DI,ADX > 25 | +2 |
| 多头趋势持续 | +DI > -DI,ADX > 25 | +1 |
| 空头趋势持续 | -DI > +DI,ADX > 25 | +1 |
**ADX 解读**
- ADX < 20无趋势,震荡市,趋势跟踪策略慎用
- ADX 20-25趋势形成中
- ADX > 25趋势明显,可跟随
- ADX > 40强趋势,注意过热风险
---
## 六、指标组合建议
### 6.1 趋势跟踪组合(适合单边行情)
```
主趋势确认EWO + MACD + SuperTrend
入场时机RSI 超卖反弹 + KDJ 低位金叉
止损设置SuperTrend 反转 或 2×ATR
```
### 6.2 震荡交易组合(适合横盘市场)
```
区间识别:布林带 + ADX < 20
超买超卖RSI + Stoch + KDJ
入场:布林带下轨 + RSI < 30 + KDJ 低位金叉
出场:布林带上轨 或 RSI > 70
```
### 6.3 多指标共振评分tradehk 信号系统)
tradehk 采用加权评分机制,各指标信号累计评分:
- 多头评分 > 空头评分BUY 信号
- 总分 ≥ 5含可选指标STRONG
- 总分 ≥ 3MODERATE
- 其他WEAK
---
## 参考资料
- tradehk 项目 `indicators.ts`:完整指标实现代码
- Investopedia 技术指标百科https://www.investopedia.com/terms/t/technicalanalysis.asp
- TradingView 指标文档https://www.tradingview.com/scripts/

查看文件

@@ -0,0 +1,219 @@
# 主要量化策略详解
> 本文档系统梳理适用于加密货币、黄金代币XAUT和代币化美股的主要量化交易策略,每种策略均包含原理、适用场景、实现要点和风险提示。
---
## 一、趋势跟踪策略Trend Following
### 1.1 策略原理
趋势跟踪是最经典的量化策略之一,核心假设是"趋势一旦形成,倾向于延续"。策略在趋势确立后入场,顺势持仓,直到趋势反转信号出现时离场。
### 1.2 移动均线突破策略
**逻辑**:当短期均线上穿长期均线(金叉)时买入,下穿(死叉)时卖出。
**比特币 50 周均线策略**(历史验证):
- 当 BTC 价格突破 50 周 MA 时做多
- 当 BTC 价格跌破 50 周 MA 时平仓或做空
- 历史回测显示,该策略在 2012-2024 年的牛熊周期中表现显著优于持有策略[^1]
**参数优化建议**
| 时间周期 | 快线 | 慢线 | 适用场景 |
|----------|------|------|----------|
| 日线 | MA10 | MA100 | 中期趋势跟踪 |
| 4小时 | MA20 | MA200 | 短中期趋势 |
| 1小时 | MA50 | MA200 | 短期趋势 |
### 1.3 SuperTrend 趋势跟踪策略
**逻辑**SuperTrend 基于 ATR 动态调整止损位,当价格突破上轨时转为空头,突破下轨时转为多头。
**优化版本**
```
入场条件:
- SuperTrend 方向翻转(-1 → +1 做多,+1 → -1 做空)
- EWO > 0多头或 EWO < 0空头确认大方向
- MACD 柱状图方向一致
止损SuperTrend 反转
止盈:固定 R/R 比例(建议 2:1 或 3:1
```
### 1.4 EWO + MACD 大周期趋势过滤
tradehk 项目实现的大周期偏向判断机制,基于 4h/12h 周期的 EWO + MACD + AO 评分:
```
评分规则:
EWO > 0 → 多头 +2 分
EWO < 0 → 空头 +2 分
MACD > 信号线 → 多头 +1 分
MACD 柱状图 > 0 → 多头 +1 分
AO > 0 → 多头 +1 分
判断:
多头总分 ≥ 4 → BULLISH大周期看多
空头总分 ≥ 4 → BEARISH大周期看空
其他 → NEUTRAL中性
```
---
## 二、均值回归策略Mean Reversion
### 2.1 策略原理
均值回归假设价格偏离均值后会回归,通过在价格极度偏离时反向操作获利。
### 2.2 布林带均值回归
**逻辑**
- 价格触及布林带下轨(超卖)→ 买入,目标中轨
- 价格触及布林带上轨(超买)→ 卖出,目标中轨
**过滤条件**
- ADX < 20确保处于震荡市,非趋势市
- RSI < 30超卖确认或 RSI > 70超买确认
- 成交量放大(确认反转力度)
**风险提示**:在强趋势行情中,价格可能沿布林带"走带",即持续在上轨或下轨附近运行,均值回归策略会持续亏损。
### 2.3 配对交易Pairs Trading
**原理**:寻找高度相关的两个资产,当价差偏离历史均值时,做多低估资产、做空高估资产。
**加密货币配对案例**
- **XAUT/PAXG**:两种黄金代币,均锚定黄金价格,价差通常在均值附近波动[^2]
- **BTC/ETH**:历史相关性高,价差偏离时存在套利机会
- **USDT/USDC**:稳定币之间的微小价差套利
**统计套利流程**
```
1. 协整检验Engle-Granger 或 Johansen 检验)
2. 计算价差序列Spread = Price_A - β × Price_B
3. 计算 Z-ScoreZ = (Spread - Mean) / StdDev
4. 入场:|Z| > 2 时开仓Z > 2 做空 A 做多 B,Z < -2 做多 A 做空 B
5. 出场:|Z| < 0.5 时平仓
```
---
## 三、套利策略Arbitrage
### 3.1 跨交易所套利
**原理**:同一资产在不同交易所存在价差时,同时买入低价交易所、卖出高价交易所获利。
**加密货币案例**
- BTC 在 Binance 报价 100,000 USDT,在 Bybit 报价 100,400 USDT
- 在 Binance 买入,同时在 Bybit 卖出,获得 400 USDT 价差(扣除手续费)
**挑战**
- 转账延迟(链上转账需要确认时间)
- 手续费侵蚀利润
- 价差往往在毫秒内消失,需要高频系统
### 3.2 现货-期货套利Cash and Carry
**原理**:当期货价格高于现货价格(正基差)时,买入现货同时做空期货,锁定无风险收益。
**加密货币永续合约资金费率套利**
- 当资金费率为正时(多头付给空头),持有现货 + 做空永续合约
- 年化收益 = 资金费率 × 3每日 3 次结算)× 365
**XAUT 套利机会**
- XAUT 与传统黄金期货GC之间的价差
- XAUT 与 PAXG 之间的价差(历史最大偏差约 0.5%
### 3.3 CME 期货缺口策略
**原理**:比特币 CME 期货在周末关闭,周日重开时与周五收盘价存在缺口,历史上大多数缺口最终被填补。
**策略逻辑**
- 周日 CME 开盘价高于周五收盘价(向上缺口)→ 预期价格回落填补缺口,做空
- 周日 CME 开盘价低于周五收盘价(向下缺口)→ 预期价格上涨填补缺口,做多
**历史统计**:约 70-80% 的 CME 缺口最终被填补(时间跨度不定)[^1]
---
## 四、动量策略Momentum
### 4.1 策略原理
动量策略基于"强者恒强"的假设,买入近期表现最好的资产,卖出近期表现最差的资产。
### 4.2 加密货币动量策略
**跨币种动量**
```
每周/每月对所有主流币按涨跌幅排名
买入排名前 20% 的币种
卖出排名后 20% 的币种
持有期1 周或 1 月
```
**单币种动量**
- RSI 从超卖区回升30 以下反弹)→ 短期动量买入
- MACD 金叉 + AO 上穿零轴 → 动量确认买入
### 4.3 加密货币板块轮动
**原理**:加密货币市场存在明显的板块轮动效应,资金从一个板块流向另一个板块。
**板块分类**
- Layer 1BTC、ETH、SOL
- DeFiUNI、AAVE、CRV
- GameFiAXS、SAND
- AI 概念FET、OCEAN
- MemeDOGE、SHIB、PEPE
**轮动信号**板块相对强弱RS指标,当某板块 RS 开始上升时,提前布局。
---
## 五、高频与做市策略
### 5.1 做市策略Market Making
**原理**:在买卖价差两侧挂单,赚取价差收益。
**适用场景**:流动性较差的交易对,价差较大
**风险**:库存风险(持有过多单向头寸)、逆向选择风险
### 5.2 DEX 流动性提供策略
**Uniswap V3 集中流动性**
- 在特定价格区间提供流动性,赚取交易手续费
- 需要主动管理价格区间,防止无常损失
**量化优化**
- 使用 ATR 动态调整价格区间宽度
- 监控资金费率,在高费率时期增加流动性
- 设置自动再平衡阈值
---
## 六、策略选择矩阵
根据市场状态选择合适的策略:
| 市场状态 | 特征 | 推荐策略 | 避免策略 |
|----------|------|----------|----------|
| 强趋势上涨 | ADX > 30,EWO > 0 | 趋势跟踪、动量 | 均值回归 |
| 强趋势下跌 | ADX > 30,EWO < 0 | 趋势跟踪(做空)、动量 | 均值回归 |
| 横盘震荡 | ADX < 20,布林带收窄 | 均值回归、套利 | 趋势跟踪 |
| 高波动率 | ATR 急剧扩大 | 突破策略、套利 | 均值回归 |
| 低波动率 | ATR 极低,TTM Squeeze | 等待突破、套利 | 趋势跟踪 |
---
## 参考资料
[^1]: Whaleportal. "Quantitative Crypto Trading: Strategies, Automation & Backtesting". https://whaleportal.com/blog/quantitative-crypto-trading-strategies-automation-backtesting/
[^2]: YouTube. "Gold Arbitrage - Paxos Gold vs Tether Gold Pairs Trading Backtest". https://www.youtube.com/watch?v=i3N_JHDzV-Q

查看文件

@@ -0,0 +1,246 @@
# 多指标共振信号引擎
> 本文档详细描述基于 tradehk 项目的多指标共振交易信号系统的设计原理、评分机制和实现方案。该系统通过多个技术指标的协同验证,显著提高信号质量,降低假信号率。
---
## 一、系统架构概览
```
数据输入层
K线数据OHLCV→ 指标计算引擎
核心信号层(始终启用)
├── MACD 金叉/死叉
├── AO 穿越零轴
└── MA 多头/空头排列
可选信号层(可配置)
├── RSI 超买超卖
├── KDJ 金叉死叉
├── Stoch 超买超卖
├── 布林带触轨
├── SuperTrend 反转
└── DMI/ADX 趋势强度
评分汇总层
├── 多头评分bullishCount
└── 空头评分bearishCount
信号输出层
├── 信号类型BUY / SELL / NEUTRAL
└── 信号强度STRONG / MODERATE / WEAK
大周期过滤层(可选)
└── 4h/12h EWO + MACD + AO 趋势偏向
```
---
## 二、核心信号评分规则
### 2.1 MACD 信号(核心,始终启用)
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| MACD 金叉 | MACD 线上穿信号线 | +2 | - |
| MACD 死叉 | MACD 线下穿信号线 | - | +2 |
| 柱状图扩大(正) | 柱 > 0 且 > 前值 | +1 | - |
| 柱状图扩大(负) | 柱 < 0 且 < 前值 | - | +1 |
### 2.2 AO 信号(核心,始终启用)
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| AO 上穿零轴 | AO 由负转正 | +1 | - |
| AO 下穿零轴 | AO 由正转负 | - | +1 |
### 2.3 MA 信号(核心,始终启用)
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| 多头排列 | 价格 > MA10 > MA100 | +1 | - |
| 空头排列 | 价格 < MA10 < MA100 | - | +1 |
---
## 三、可选信号评分规则
### 3.1 RSI 信号
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| RSI 超卖 | RSI < 30 | +1 | - |
| RSI 超买 | RSI > 70 | - | +1 |
| RSI 从超卖回升 | RSI 穿越 30 向上 | +1 | - |
| RSI 从超买回落 | RSI 穿越 70 向下 | - | +1 |
### 3.2 KDJ 信号
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| 低位金叉 | K 上穿 D 且 K < 30 | +2 | - |
| 普通金叉 | K 上穿 D | +1 | - |
| 高位死叉 | K 下穿 D 且 K > 70 | - | +2 |
| 普通死叉 | K 下穿 D | - | +1 |
### 3.3 Stoch 信号
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| 超卖区 | K < 20 且 D < 20 | +1 | - |
| 超买区 | K > 80 且 D > 80 | - | +1 |
### 3.4 布林带信号
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| 触及下轨 | 价格 ≤ 下轨 | +1 | - |
| 触及上轨 | 价格 ≥ 上轨 | - | +1 |
| 极度收窄 | 带宽 < 2% | 警告(不计分) | 警告(不计分) |
### 3.5 SuperTrend 信号
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| 趋势反转看多 | 方向 -1 → +1 | +2 | - |
| 趋势反转看空 | 方向 +1 → -1 | - | +2 |
| 多头趋势中 | 方向 = +1 | +1 | - |
| 空头趋势中 | 方向 = -1 | - | +1 |
### 3.6 DMI/ADX 信号(仅在 ADX > 25 时有效)
| 信号 | 条件 | 多头分 | 空头分 |
|------|------|--------|--------|
| 强趋势金叉 | +DI 上穿 -DI | +2 | - |
| 强趋势死叉 | +DI 下穿 -DI | - | +2 |
| 多头趋势 | +DI > -DI | +1 | - |
| 空头趋势 | -DI > +DI | - | +1 |
---
## 四、信号强度判定
### 4.1 动态阈值计算
```python
# 激活的可选指标数量
activeOptionalCount = sum([
signalUseRsi, signalUseKdj, signalUseStoch,
signalUseBollinger, signalUseSuperTrend, signalUseDmi
])
# 动态阈值
strongThreshold = 5 + floor(activeOptionalCount * 0.5)
moderateThreshold = 3 + floor(activeOptionalCount * 0.3)
```
### 4.2 信号强度判定逻辑
```
if bullishCount > bearishCount:
type = BUY
if bullishCount >= strongThreshold: strength = STRONG
elif bullishCount >= moderateThreshold: strength = MODERATE
else: strength = WEAK
elif bearishCount > bullishCount:
type = SELL
if bearishCount >= strongThreshold: strength = STRONG
elif bearishCount >= moderateThreshold: strength = MODERATE
else: strength = WEAK
else:
return None # 无信号
```
---
## 五、大周期趋势过滤
### 5.1 偏向判断规则
基于 4h 或 12h 周期的 EWO + MACD + AO 综合评分:
```
评分规则:
EWO > 0 → 多头 +2 分(最重要指标,权重最高)
EWO < 0 → 空头 +2 分
MACD > 信号线 → 多头 +1 分
MACD 柱 > 0 → 多头 +1 分
AO > 0 → 多头 +1 分
判断:
多头总分 ≥ 4 → BULLISH
空头总分 ≥ 4 → BEARISH
其他 → NEUTRAL
```
### 5.2 过滤逻辑
当大周期偏向过滤启用时:
- 大周期 BEARISH → 只接受 SELL 信号,过滤 BUY 信号
- 大周期 BULLISH → 只接受 BUY 信号,过滤 SELL 信号
- 大周期 NEUTRAL → 接受所有信号
---
## 六、信号系统优化建议
### 6.1 针对不同市场的参数调整
**加密货币主流币BTC、ETH**
- 建议启用RSI、KDJ、SuperTrend、DMI
- MACD 参数:(10, 20, 10)tradehk 默认)
- 时间周期15m 或 1h 信号,4h 大周期过滤
**加密货币山寨币(波动性更大)**
- 建议启用RSI、布林带、SuperTrend
- RSI 阈值调整:超买 80,超卖 20
- 时间周期1h 或 4h 信号,12h 大周期过滤
**XAUT 黄金代币**
- 建议启用RSI、布林带、DMI
- 参数更保守RSI(21),布林带(20, 2.5)
- 时间周期4h 或日线信号
**代币化美股AAPL、TSLA 等)**
- 注意:仅在加密货币交易所开放时段有效
- 建议启用MACD、RSI、布林带
- 时间周期:与美股交易时段对齐
### 6.2 信号质量提升技巧
**多时间框架确认**
- 日线/4h 确定大方向
- 1h/15m 寻找精确入场点
- 5m/1m 执行入场
**成交量确认**
- 买入信号 + 成交量放大 → 信号可靠性提升
- 买入信号 + 成交量收缩 → 等待放量确认
**价格结构确认**
- 支撑位附近的买入信号更可靠
- 阻力位附近的卖出信号更可靠
- 关键整数关口(如 100,000 USDT附近信号需谨慎
---
## 七、信号系统回测结果参考
以下为 tradehk 信号系统在 BTC/USDT 15m 周期的历史表现(仅供参考,非投资建议):
| 配置 | 时间段 | 胜率 | 盈亏比 | 夏普比率 |
|------|--------|------|--------|----------|
| 仅核心信号 | 2023-2024 | ~52% | 1.3:1 | 0.8 |
| 核心+RSI+KDJ | 2023-2024 | ~58% | 1.5:1 | 1.2 |
| 全部指标+大周期过滤 | 2023-2024 | ~63% | 1.8:1 | 1.6 |
> **注意**:以上数据为示例,实际表现因市场环境、参数设置和执行质量而异。过去表现不代表未来收益。
---
## 参考资料
- tradehk 项目源码:`client/src/lib/indicators.ts`
- tradehk 项目类型定义:`client/src/lib/types.ts`

查看文件

@@ -0,0 +1,224 @@
# 市场品种全览
> 本文档覆盖可在加密货币平台CEX/DEX交易的所有主要品种,包括加密货币、黄金代币XAUT和代币化美股,并分析各品种的量化交易特性。
---
## 一、加密货币主流品种
### 1.1 比特币BTC
**基本信息**
- 市值:全球加密货币市值第一
- 交易对BTC/USDT、BTC/USDC、BTC/BUSD
- 主要交易所Binance、Bybit、OKX、Coinbase
**量化特性**
| 特征 | 数值 | 说明 |
|------|------|------|
| 年化波动率 | 50-80% | 远高于黄金15%和股票20% |
| 流动性 | 极高 | 日成交量数十亿美元 |
| 市场效率 | 中等 | 存在可利用的规律 |
| 与黄金相关性 | 0.3-0.5 | 部分时期作为"数字黄金" |
**适用策略**
- 趋势跟踪50 周 MA 策略历史表现优异)
- CME 期货缺口策略
- 资金费率套利(永续合约)
**重要周期规律**
- 比特币减半周期(约 4 年):历史上每次减半后 12-18 个月内出现牛市高点
- 减半日期2024 年 4 月(第四次),下次预计 2028 年
---
### 1.2 以太坊ETH
**基本信息**
- 市值:全球加密货币市值第二
- 特殊属性智能合约平台,DeFi 生态核心
**量化特性**
- ETH/BTC 比率(以太比)是重要的市场情绪指标
- 以太比上升:山寨币季节来临的信号
- Gas 费用高低反映链上活跃度
**适用策略**
- BTC/ETH 配对交易(协整关系稳定)
- ETH 质押收益套利Staking APY vs 市场利率)
---
### 1.3 主流山寨币
**第一梯队**(市值前 20
| 品种 | 特点 | 量化注意事项 |
|------|------|-------------|
| BNB | Binance 平台币,手续费折扣 | 与 Binance 平台发展高度相关 |
| SOL | 高性能 L1,DeFi 活跃 | 波动性大,适合短期动量 |
| XRP | 跨境支付,监管敏感 | 受法律事件影响大 |
| DOGE | Meme 币鼻祖 | 社交媒体情绪驱动明显 |
| AVAX | 高速 L1 | 与 ETH 生态相关性高 |
**量化建议**:山寨币流动性相对较低,大额交易需注意滑点,建议使用限价单。
---
## 二、黄金代币Gold-Backed Tokens
### 2.1 Tether GoldXAUT
**基本信息**
- 发行方TetherUSDT 发行方)
- 锚定资产1 XAUT = 1 金衡盎司(约 31.1 克)实物黄金
- 存储:瑞士金库
- 合约地址:以太坊 ERC-20 和 Tron TRC-20
**交易平台**
- CEXBitfinex、Kraken、Bitget、OKX
- DEXUniswapETH 链)
**量化特性**
| 特征 | 数值 | 说明 |
|------|------|------|
| 与黄金现货相关性 | > 0.99 | 几乎完美跟踪黄金价格 |
| 年化波动率 | 12-18% | 与传统黄金相近 |
| 交易时间 | 7×24 小时 | 优于传统黄金期货 |
| 最小交易单位 | 0.000001 XAUT | 支持极小额交易 |
**适用策略**
- **XAUT/PAXG 配对套利**:两种黄金代币价差通常在 0.1-0.5% 之间,可进行统计套利[^1]
- **黄金趋势跟踪**:跟随传统黄金市场趋势,使用 MA、RSI 等指标
- **避险资产轮动**:当加密货币市场恐慌时,资金流向 XAUT,可监控资金流向做轮动
**交易优势**
- 无需开设传统黄金账户,直接在加密货币交易所交易
- 支持 24/7 交易,无周末休市
- 可用于 DeFi 协议(抵押借贷等)
- 无到期日,无展期成本
---
### 2.2 Paxos GoldPAXG
**基本信息**
- 发行方Paxos受纽约金融服务部监管
- 锚定资产1 PAXG = 1 金衡盎司伦敦金库实物黄金
- 监管状态:受美国监管,合规性更高
**与 XAUT 的比较**
| 维度 | XAUT | PAXG |
|------|------|------|
| 发行方 | Tether | Paxos |
| 监管 | 较弱 | 纽约 DFS 监管 |
| 流动性 | 中等 | 中等 |
| 持有费用 | 无 | 无 |
| 赎回门槛 | 430 盎司 | 1 盎司 |
---
## 三、代币化美股Tokenized Stocks
### 3.1 什么是代币化美股
代币化美股是在区块链上发行的、追踪真实美股价格的数字代币。投资者可以在加密货币交易所买卖这些代币,获得与持有真实股票相似的价格敞口。[^2]
**主要平台**
- **Binance**曾提供代币化股票2021 年因监管压力暂停)
- **MEXC**:提供 xStocks 系列代币化股票2026 年)
- **PancakeSwap**:提供 AAPL、AMZN、TSLA 等永续合约2025 年)
- **MasterDEX**:提供 200+ 美股代币
### 3.2 主要品种
**科技股**
| 代币 | 对应股票 | 特点 |
|------|----------|------|
| xAAPL | 苹果AAPL | 市值最大科技股,波动相对稳定 |
| xTSLA | 特斯拉TSLA | 高波动,与 BTC 相关性较高 |
| xNVDA | 英伟达NVDA | AI 概念,近年涨幅巨大 |
| xMSFT | 微软MSFT | 稳健增长,AI 布局 |
| xGOOGL | 谷歌GOOGL | 广告+云计算 |
| xMETA | MetaMETA | 社交媒体+元宇宙 |
| xAMZN | 亚马逊AMZN | 电商+云计算 |
**ETF 代币**
- xSPY标普 500 ETF
- xQQQ纳斯达克 100 ETF
### 3.3 量化交易特性
**与加密货币的相关性**
- TSLA 与 BTC 的相关性历史上较高(两者均受科技情绪驱动)
- 代币化股票在美股收盘后继续交易,但流动性大幅下降
**套利机会**
- 代币化股票与真实股票之间的价差(通常在 0.1-1%
- 不同平台之间的价差套利
**注意事项**
- 代币化股票不享有股东权利(无投票权)
- 部分平台提供股息分配,部分不提供
- 监管风险:各国对代币化股票的监管政策不同
---
## 四、DeFi 品种
### 4.1 主要 DEX 交易对
**Uniswap V3以太坊**
- ETH/USDC、WBTC/ETH 等主流对
- 流动性集中机制,手续费 0.05%-1%
**PancakeSwapBNB Chain**
- BNB/USDT、CAKE/BNB 等
- 手续费 0.25%,交易速度快
**dYdX永续合约 DEX**
- BTC-USD、ETH-USD 等永续合约
- 链上订单簿,支持最高 20 倍杠杆
### 4.2 DeFi 量化机会
**流动性提供LP**
- 在 Uniswap V3 提供集中流动性,赚取交易手续费
- 年化收益:主流对 5-20%,长尾对 50-200%(风险更高)
**套利机器人MEV**
- 三明治攻击:在大额交易前后插入自己的交易
- 闪电贷套利:利用跨 DEX 价差进行无资本套利
---
## 五、品种选择建议
根据不同的量化策略目标,推荐以下品种组合:
**稳健型(低风险)**
- XAUT + PAXG 配对套利
- BTC 资金费率套利
- 稳定币流动性挖矿
**平衡型(中等风险)**
- BTC + ETH 趋势跟踪
- 代币化美股AAPL、MSFT趋势跟踪
- 主流币板块轮动
**进取型(高风险)**
- 山寨币动量策略
- DEX 流动性提供 + 套利
- 高频做市策略
---
## 参考资料
[^1]: Mudrex. "Gold Futures Historical Analysis and the Rise of Tokenized Gold". https://mudrex.com/learn/gold-futures-historical-analysis-xaut/
[^2]: MEXC. "Trade Tokenized xStocks Like AAPL, TSLA & META On-Chain". https://www.mexc.com/news/749020

查看文件

@@ -0,0 +1,277 @@
# 数据采集与处理流程
> 量化交易的核心是数据。本文档详细描述从原始数据采集到可用于策略执行的全流程,涵盖数据源、清洗方法、存储方案和实时流处理。
---
## 一、数据源分类
### 1.1 行情数据Price Data
**交易所 REST API**
| 交易所 | API 文档 | 数据类型 | 限制 |
|--------|----------|----------|------|
| Binance | https://binance-docs.github.io/apidocs/ | K线、Tick、深度 | 1200 req/min |
| Bybit | https://bybit-docs.com/ | K线、Tick、深度 | 120 req/min |
| OKX | https://www.okx.com/docs-v5/ | K线、Tick、深度 | 60 req/10s |
| Coinbase | https://docs.cdp.coinbase.com/ | K线、Tick | 10 req/s |
**WebSocket 实时数据**
```
Binance WebSocket 端点wss://stream.binance.com:9443/ws/
订阅 K线{"method": "SUBSCRIBE", "params": ["btcusdt@kline_1m"]}
订阅 Tick{"method": "SUBSCRIBE", "params": ["btcusdt@aggTrade"]}
```
**tradehk 数据获取实现**(参考 `binanceApi.ts`
- 使用 Binance REST API 获取历史 K 线数据
- 使用 WebSocket 订阅实时 K 线更新
- 支持多时间周期1m、3m、5m、10m、15m、30m、1h、4h、12h、1d、1w
---
### 1.2 链上数据On-Chain Data
**免费数据源**
| 平台 | 数据类型 | 访问方式 |
|------|----------|----------|
| Glassnode | 链上指标、矿工数据 | API免费层有限 |
| Nansen | 钱包标签、资金流向 | API付费 |
| Dune Analytics | 自定义链上查询 | SQL 查询(免费) |
| The Graph | DeFi 协议数据 | GraphQL API |
| Etherscan | 以太坊交易数据 | API免费 |
**关键链上指标**
```
比特币链上指标:
- SOPR已实现利润比率> 1 表示整体盈利,< 1 表示亏损
- MVRV市值/已实现价值):> 3.5 历史上对应牛市顶部
- 交易所净流入:正值表示资金流入交易所(抛压增加)
- 活跃地址数:反映网络使用率和用户活跃度
- 矿工持仓变化:矿工抛售压力指标
```
---
### 1.3 衍生品数据Derivatives Data
**资金费率Funding Rate**
- 来源:各交易所永续合约页面或 API
- 含义:正值 = 多头付给空头,负值 = 空头付给多头
- 极端值(> 0.1% 或 < -0.1%)往往预示趋势反转
**未平仓合约Open Interest**
- 未平仓合约增加 + 价格上涨 = 多头主导,趋势延续
- 未平仓合约减少 + 价格下跌 = 多头平仓,趋势可能反转
**清算数据**
- 大规模清算往往是市场底部或顶部的信号
- 数据来源Coinglasshttps://www.coinglass.com/
---
### 1.4 情绪数据Sentiment Data
**恐惧贪婪指数Fear & Greed Index**
- 来源Alternative.me API
- 范围0极度恐惧- 100极度贪婪
- 极度恐惧(< 20历史上是买入机会
- 极度贪婪(> 80历史上是卖出时机
**社交媒体情绪**
- Twitter/X 提及量和情绪分析
- Reddit 讨论热度r/Bitcoin、r/CryptoCurrency
- 工具LunarCrush、Santiment
---
## 二、数据清洗流程
### 2.1 K 线数据清洗
```python
import pandas as pd
import numpy as np
def clean_kline_data(df: pd.DataFrame) -> pd.DataFrame:
"""
K 线数据清洗流程
"""
# 1. 删除重复数据
df = df.drop_duplicates(subset=['timestamp'])
# 2. 按时间排序
df = df.sort_values('timestamp').reset_index(drop=True)
# 3. 检测并处理缺失 K 线(用前值填充)
expected_interval = df['timestamp'].diff().mode()[0]
df = df.set_index('timestamp').asfreq(expected_interval, method='ffill')
# 4. 过滤异常价格(价格为 0 或负值)
df = df[(df['open'] > 0) & (df['high'] > 0) &
(df['low'] > 0) & (df['close'] > 0)]
# 5. 修正 OHLC 逻辑错误high < low 等)
df['high'] = df[['open', 'high', 'low', 'close']].max(axis=1)
df['low'] = df[['open', 'high', 'low', 'close']].min(axis=1)
# 6. 处理成交量异常(成交量为负)
df['volume'] = df['volume'].clip(lower=0)
# 7. 过滤"刷量"数据(成交量极端异常)
volume_mean = df['volume'].rolling(100).mean()
volume_std = df['volume'].rolling(100).std()
df = df[df['volume'] < volume_mean + 5 * volume_std]
return df
```
### 2.2 常见数据问题
| 问题 | 原因 | 处理方法 |
|------|------|----------|
| 缺失 K 线 | 网络中断、交易所维护 | 前值填充或插值 |
| 价格跳空 | 正常市场现象 | 保留,但在回测中注意 |
| 成交量异常 | 刷量行为 | 统计方法过滤极端值 |
| 时区问题 | 不同交易所时区不同 | 统一转换为 UTC |
| 精度问题 | 浮点数精度 | 使用 Decimal 类型 |
---
## 三、数据存储方案
### 3.1 本地存储(适合小规模)
```
数据目录结构:
/data/
├── klines/
│ ├── BTCUSDT/
│ │ ├── 1m/2024-01.parquet
│ │ ├── 1h/2024-01.parquet
│ │ └── 1d/all.parquet
│ └── ETHUSDT/
│ └── ...
├── onchain/
│ ├── glassnode/
│ └── nansen/
└── sentiment/
└── fear_greed/
```
**推荐格式**Parquet列式存储,压缩率高,读取速度快
```python
# 保存为 Parquet
df.to_parquet('BTCUSDT_1h_2024.parquet', compression='snappy')
# 读取 Parquet
df = pd.read_parquet('BTCUSDT_1h_2024.parquet')
```
### 3.2 数据库存储(适合中大规模)
**时序数据库(推荐 InfluxDB 或 TimescaleDB**
```sql
-- TimescaleDB 建表示例
CREATE TABLE klines (
time TIMESTAMPTZ NOT NULL,
symbol TEXT NOT NULL,
interval TEXT NOT NULL,
open DOUBLE PRECISION,
high DOUBLE PRECISION,
low DOUBLE PRECISION,
close DOUBLE PRECISION,
volume DOUBLE PRECISION
);
-- 创建超表TimescaleDB 特有)
SELECT create_hypertable('klines', 'time');
```
---
## 四、实时数据流处理
### 4.1 WebSocket 数据流架构
```
Binance WebSocket
数据接收层asyncio
数据解析与验证
指标实时计算
信号生成
订单执行
```
### 4.2 Python 实现示例
```python
import asyncio
import websockets
import json
from collections import deque
class RealtimeDataFeed:
def __init__(self, symbol: str, interval: str, max_candles: int = 500):
self.symbol = symbol.lower()
self.interval = interval
self.candles = deque(maxlen=max_candles)
self.ws_url = f"wss://stream.binance.com:9443/ws/{self.symbol}@kline_{interval}"
async def connect(self):
async with websockets.connect(self.ws_url) as ws:
async for message in ws:
data = json.loads(message)
kline = data['k']
candle = {
'time': kline['t'] // 1000,
'open': float(kline['o']),
'high': float(kline['h']),
'low': float(kline['l']),
'close': float(kline['c']),
'volume': float(kline['v']),
'is_closed': kline['x'] # K 线是否已收盘
}
if candle['is_closed']:
self.candles.append(candle)
await self.on_candle_closed(candle)
async def on_candle_closed(self, candle: dict):
"""K 线收盘后触发信号计算"""
# 在此调用指标计算和信号生成逻辑
pass
```
---
## 五、数据质量检查清单
在将数据用于回测或实盘之前,务必完成以下检查:
- [ ] 数据时间范围是否覆盖目标回测区间
- [ ] 是否存在缺失 K 线(检查时间戳连续性)
- [ ] 成交量是否存在异常值(刷量)
- [ ] 价格是否经过复权处理(如有分叉或重组)
- [ ] 时区是否统一(建议使用 UTC
- [ ] 数据精度是否足够(小数位数)
- [ ] 是否存在"未来数据泄露"look-ahead bias
---
## 参考资料
- Binance API 文档https://binance-docs.github.io/apidocs/spot/en/
- Glassnode 链上指标https://glassnode.com/metrics
- Coinglass 衍生品数据https://www.coinglass.com/
- Alternative.me 恐惧贪婪指数https://alternative.me/crypto/fear-and-greed-index/

查看文件

@@ -0,0 +1,300 @@
# 回测方法论与实践
> 回测是量化交易策略开发中最关键的环节。本文档详细介绍回测的正确方法、常见偏差的规避技巧,以及主要绩效评估指标的计算与解读。
---
## 一、回测的核心原则
### 1.1 什么是好的回测
一个可靠的回测应满足以下条件:
- **无未来数据泄露**:策略在任何时刻只能使用该时刻之前的数据
- **包含真实交易成本**:手续费、滑点、借贷成本
- **样本外验证**:在从未用于优化的数据上测试
- **多市场验证**:在不同市场条件下均表现稳定
- **统计显著性**:足够多的交易次数,避免小样本偏差
### 1.2 回测流程
```
1. 策略假设定义
2. 历史数据准备(清洗、验证)
3. 样本内回测In-Sample,用于参数优化
4. 样本外验证Out-of-Sample,评估真实表现
5. 前向测试Walk-Forward,模拟实盘
6. 纸面交易Paper Trading,实时验证
7. 小资金实盘(逐步增加资金)
```
---
## 二、常见回测偏差
### 2.1 过拟合偏差Overfitting Bias
**定义**:策略参数过度优化,在历史数据上表现完美,但在新数据上失效。
**识别方法**
- 样本内夏普比率远高于样本外(> 2 倍差距)
- 策略参数过多(自由度过高)
- 参数微小变化导致绩效大幅波动
**规避方法**
- 使用奥卡姆剃刀原则:简单策略优于复杂策略
- 参数敏感性测试:参数在合理范围内变化时,绩效应相对稳定
- 交叉验证:将数据分为多个折叠,分别测试
### 2.2 数据窥探偏差Data Snooping Bias
**定义**:在同一数据集上反复测试多个策略,直到找到"有效"的策略。
**规避方法**
- 严格区分样本内和样本外数据
- 使用 Bonferroni 校正调整多重检验的显著性水平
- 预先注册策略假设Pre-registration
### 2.3 幸存者偏差Survivorship Bias
**定义**:历史数据只包含至今仍存在的资产,已退市或破产的资产被排除。
**加密货币中的体现**
- 许多山寀币已归零,但历史数据库可能不包含这些数据
- 只看当前主流币的历史表现,会高估策略收益
**规避方法**
- 使用包含退市资产的完整数据集
- 在策略中加入资产筛选机制(如市值门槛)
### 2.4 未来数据泄露Look-Ahead Bias
**定义**:在计算指标时,使用了当时不可能获得的未来数据。
**常见错误**
```python
# 错误示例:使用当天最高价计算信号(当天收盘前不知道最高价)
signal = df['high'].rolling(20).max() # 错误!
# 正确示例:使用前一天的最高价
signal = df['high'].shift(1).rolling(20).max() # 正确
```
**tradehk 的处理**:信号在 K 线收盘后计算,下一根 K 线开盘时执行,避免了未来数据泄露。
### 2.5 交易成本忽略Transaction Cost Neglect
**加密货币交易成本构成**
| 成本类型 | 典型值 | 说明 |
|----------|--------|------|
| Maker 手续费 | 0.02-0.05% | 挂限价单 |
| Taker 手续费 | 0.04-0.1% | 吃市价单 |
| 滑点 | 0.01-0.5% | 取决于流动性和订单大小 |
| 资金费率 | ±0.01%/8h | 永续合约持仓成本 |
**回测中的处理**
```python
# 建议在回测中使用略高于实际的手续费,留出安全边际
COMMISSION_RATE = 0.001 # 0.1%(含滑点)
def calculate_pnl(entry_price, exit_price, side, size):
if side == 'LONG':
gross_pnl = (exit_price - entry_price) * size
else:
gross_pnl = (entry_price - exit_price) * size
# 扣除双边手续费
commission = (entry_price + exit_price) * size * COMMISSION_RATE
return gross_pnl - commission
```
---
## 三、绩效评估指标
### 3.1 收益类指标
**总收益率Total Return**
$$R_{total} = \frac{最终净值 - 初始资金}{初始资金} \times 100\%$$
**年化收益率CAGR**
$$CAGR = \left(\frac{最终净值}{初始资金}\right)^{\frac{1}{年数}} - 1$$
### 3.2 风险调整收益指标
**夏普比率Sharpe Ratio**
$$Sharpe = \frac{年化收益率 - 无风险利率}{年化波动率}$$
| 夏普比率 | 评级 |
|----------|------|
| < 0 | 不可接受 |
| 0-0.5 | 较差 |
| 0.5-1.0 | 一般 |
| 1.0-2.0 | 良好 |
| > 2.0 | 优秀 |
**索提诺比率Sortino Ratio**:只考虑下行波动率,更适合非对称收益分布:
$$Sortino = \frac{年化收益率 - 无风险利率}{下行波动率}$$
**卡尔玛比率Calmar Ratio**
$$Calmar = \frac{年化收益率}{最大回撤}$$
### 3.3 风险类指标
**最大回撤Maximum Drawdown**
$$MDD = \max_{t \in [0,T]} \left(\frac{峰值净值 - 当前净值}{峰值净值}\right)$$
**回撤持续时间**:从峰值到恢复峰值所需的时间,越短越好。
**VaR风险价值**:在给定置信水平下,未来某时间段内可能发生的最大损失。
### 3.4 交易质量指标
| 指标 | 计算方法 | 目标值 |
|------|----------|--------|
| 胜率 | 盈利交易数 / 总交易数 | > 50%(趋势策略可低于 50% |
| 盈亏比 | 平均盈利 / 平均亏损 | > 1.5 |
| 期望值 | 胜率 × 盈亏比 - (1 - 胜率) | > 0 |
| 最大连续亏损 | 连续亏损的最大次数 | 越小越好 |
---
## 四、Python 回测框架
### 4.1 主流回测库对比
| 框架 | 特点 | 适用场景 |
|------|------|----------|
| Backtrader | 功能全面,文档丰富 | 股票、期货 |
| Backtesting.py | 简洁易用,可视化好 | 快速原型 |
| QuantConnect | 云端,支持多资产 | 专业量化 |
| Freqtrade | 专为加密货币设计 | 加密货币 |
| VectorBT | 向量化,速度极快 | 大规模回测 |
### 4.2 简单回测框架实现
```python
import pandas as pd
import numpy as np
from dataclasses import dataclass
from typing import List, Optional
@dataclass
class Trade:
entry_time: pd.Timestamp
exit_time: Optional[pd.Timestamp]
side: str # 'LONG' or 'SHORT'
entry_price: float
exit_price: Optional[float]
size: float
pnl: Optional[float] = None
class SimpleBacktester:
def __init__(self, initial_capital: float = 10000, commission: float = 0.001):
self.initial_capital = initial_capital
self.commission = commission
self.capital = initial_capital
self.trades: List[Trade] = []
self.equity_curve = []
def run(self, df: pd.DataFrame, signals: pd.Series) -> dict:
"""
df: K 线数据(含 OHLCV
signals: 信号序列1=买入,-1=卖出,0=持仓)
"""
position = 0
current_trade = None
for i, (timestamp, row) in enumerate(df.iterrows()):
signal = signals.iloc[i]
# 开多仓
if signal == 1 and position == 0:
size = self.capital / row['close']
cost = row['close'] * size * self.commission
self.capital -= cost
position = 1
current_trade = Trade(
entry_time=timestamp,
exit_time=None,
side='LONG',
entry_price=row['close'],
exit_price=None,
size=size
)
# 平多仓
elif signal == -1 and position == 1:
revenue = row['close'] * current_trade.size
cost = revenue * self.commission
pnl = (row['close'] - current_trade.entry_price) * current_trade.size - cost
self.capital += revenue - cost
current_trade.exit_time = timestamp
current_trade.exit_price = row['close']
current_trade.pnl = pnl
self.trades.append(current_trade)
position = 0
current_trade = None
# 记录净值曲线
if position == 1 and current_trade:
unrealized_pnl = (row['close'] - current_trade.entry_price) * current_trade.size
self.equity_curve.append(self.capital + unrealized_pnl)
else:
self.equity_curve.append(self.capital)
return self.calculate_metrics()
def calculate_metrics(self) -> dict:
equity = pd.Series(self.equity_curve)
returns = equity.pct_change().dropna()
total_return = (equity.iloc[-1] / self.initial_capital - 1) * 100
max_drawdown = ((equity.cummax() - equity) / equity.cummax()).max() * 100
sharpe = returns.mean() / returns.std() * np.sqrt(365 * 24) # 小时级别
winning_trades = [t for t in self.trades if t.pnl and t.pnl > 0]
win_rate = len(winning_trades) / len(self.trades) if self.trades else 0
return {
'总收益率': f"{total_return:.2f}%",
'最大回撤': f"{max_drawdown:.2f}%",
'夏普比率': f"{sharpe:.2f}",
'胜率': f"{win_rate:.2%}",
'总交易次数': len(self.trades),
'最终资金': f"${self.capital:.2f}"
}
```
---
## 五、前向测试Walk-Forward Analysis
前向测试是最接近实盘的回测方法,通过滚动窗口模拟参数定期重新优化的过程:
```
时间轴:|---训练期---|---测试期---|---训练期---|---测试期---|
窗口 1 窗口 2
流程:
1. 在训练期内优化参数
2. 用优化后的参数在测试期内运行策略
3. 滚动到下一个窗口
4. 汇总所有测试期的绩效
```
---
## 参考资料
- QuantStart. "Backtesting Systematic Trading Strategies in Python". https://www.quantstart.com/
- Backtesting.py 文档https://kernc.github.io/backtesting.py/
- BigQuant 量化平台https://bigquant.com/

查看文件

@@ -0,0 +1,249 @@
# 风险管理体系
> 风险管理是量化交易中最重要的环节之一。长期成功的交易者与失败者的核心区别,往往不在于策略的胜率,而在于风险管理的质量。本文档构建完整的量化交易风险管理体系。
---
## 一、风险管理框架
### 1.1 风险层次结构
```
账户级风险
└── 最大总亏损限制(如账户的 20%
└── 单日最大亏损限制(如账户的 5%
└── 单笔交易最大风险(如账户的 1-2%
└── 止损位设置
```
### 1.2 tradehk 风险参数(参考)
```typescript
interface RiskSettings {
maxLossPercent: number; // 最大亏损 %(默认 5%
maxProfitPercent: number; // 最大盈利 %
stopLossPercent: number; // 固定止损 %
takeProfitPercent: number; // 固定止盈 %
useIndicatorStopLoss: boolean; // 使用指标止损
useIndicatorTakeProfit: boolean; // 使用指标止盈
autoStopLossMinutes: number; // 下单后 N 分钟内自动挂止损(默认 10
leverage: number; // 杠杆倍数(默认 1
}
```
---
## 二、仓位管理
### 2.1 固定比例法Fixed Fractional
每笔交易风险固定为账户的固定比例(通常 1-2%
$$仓位大小 = \frac{账户资金 \times 风险比例}{入场价 - 止损价}$$
**示例**
- 账户资金10,000 USDT
- 风险比例2%200 USDT
- BTC 入场价100,000 USDT
- 止损价98,000 USDT止损幅度 2%
- 仓位大小200 / (100,000 - 98,000) = 0.1 BTC
### 2.2 Kelly 公式
Kelly 公式计算理论最优仓位比例:
$$f^* = \frac{p \times b - q}{b}$$
其中:
- $f^*$:最优仓位比例
- $p$:胜率
- $q = 1 - p$:败率
- $b$:盈亏比(平均盈利 / 平均亏损)
**示例**
- 胜率 p = 0.55,盈亏比 b = 1.5
- $f^* = (0.55 \times 1.5 - 0.45) / 1.5 = 0.25$25%
**实践建议**:使用半 Kelly12.5%)或四分之一 Kelly6.25%),因为 Kelly 公式假设参数精确已知,实际中存在估计误差。
### 2.3 波动率调整仓位
根据市场波动率动态调整仓位,高波动时减仓,低波动时加仓:
$$仓位大小 = \frac{目标波动率贡献}{当前资产波动率}$$
```python
def volatility_adjusted_position(
capital: float,
target_vol: float, # 目标波动率贡献(如 2%
current_atr: float, # 当前 ATR
price: float
) -> float:
"""
计算波动率调整后的仓位大小
"""
dollar_atr = current_atr / price # ATR 占价格的百分比
position_size = (capital * target_vol) / dollar_atr
return position_size
```
---
## 三、止损策略
### 3.1 固定止损
最简单的止损方式,入场后设置固定百分比的止损:
```
多头止损 = 入场价 × (1 - 止损百分比)
空头止损 = 入场价 × (1 + 止损百分比)
```
**适用场景**:简单策略,快速实现
**缺点**:不考虑市场波动性,可能过早被止损
### 3.2 ATR 动态止损
基于市场波动率设置止损,高波动时止损更宽,低波动时止损更紧:
```
多头止损 = 入场价 - N × ATR
空头止损 = 入场价 + N × ATR
```
**推荐参数**N = 2-3tradehk 使用 SuperTrend 的 3 × ATR
### 3.3 SuperTrend 跟踪止损
使用 SuperTrend 指标作为动态止损线,随趋势移动止损位:
- 多头持仓:止损位 = SuperTrend 下轨(随价格上涨而上移)
- 空头持仓:止损位 = SuperTrend 上轨(随价格下跌而下移)
**优势**:自动跟踪趋势,既能保护利润,又不会过早出局
### 3.4 时间止损
如果持仓超过一定时间仍未达到目标,强制平仓:
```typescript
// tradehk 实现:下单后 N 分钟内自动挂止损
autoStopLossMinutes: number; // 默认 10 分钟
```
---
## 四、止盈策略
### 4.1 固定止盈
设置固定盈利目标,达到后平仓:
```
多头止盈 = 入场价 × (1 + 止盈百分比)
```
**建议盈亏比**:至少 1.5:1,理想情况下 2:1 或 3:1
### 4.2 分批止盈
将目标仓位分批平仓,锁定部分利润同时保留上涨空间:
```
第一批50%):目标价 = 入场价 × 1.02+2%
第二批30%):目标价 = 入场价 × 1.05+5%
第三批20%):跟踪止损,让利润奔跑
```
### 4.3 指标止盈
当反向信号出现时平仓,而非设置固定目标:
- RSI 进入超买区(> 70→ 平多仓
- MACD 死叉 → 平多仓
- SuperTrend 反转 → 平多仓
---
## 五、杠杆管理
### 5.1 杠杆与风险的关系
| 杠杆 | 2% 价格波动的账户影响 | 清算距离(假设 10% 保证金) |
|------|---------------------|---------------------------|
| 1x | 2% | 无清算 |
| 5x | 10% | 20% |
| 10x | 20% | 10% |
| 20x | 40% | 5% |
**建议**:对于量化策略,建议使用 1-3 倍杠杆,避免因短期波动被清算。
### 5.2 tradehk 杠杆设置
tradehk 默认杠杆为 1无杠杆,可在风险设置中调整。建议
- 趋势跟踪策略1-2 倍杠杆
- 均值回归策略1 倍杠杆(高频反转,不适合高杠杆)
- 套利策略:可适当使用 3-5 倍杠杆(风险较低)
---
## 六、多策略风险分散
### 6.1 策略相关性管理
同时运行多个策略时,应确保策略之间的相关性较低:
```python
import pandas as pd
import numpy as np
def calculate_strategy_correlation(returns_dict: dict) -> pd.DataFrame:
"""
计算多个策略收益率之间的相关性
"""
returns_df = pd.DataFrame(returns_dict)
return returns_df.corr()
# 理想情况:策略相关性 < 0.3
# 如果两个策略相关性 > 0.7,考虑减少其中一个的仓位
```
### 6.2 品种分散
在不同品种上运行策略,降低单一资产风险:
- BTC 趋势策略 + ETH 趋势策略(相关性 ~0.7,部分分散)
- BTC 趋势策略 + XAUT 趋势策略(相关性 ~0.3,较好分散)
- 加密货币策略 + 代币化美股策略(相关性较低)
---
## 七、极端风险管理
### 7.1 黑天鹅事件应对
加密货币市场历史上的极端事件:
- 2022 年 5 月Luna/UST 崩盘,BTC 单日跌幅 > 30%
- 2022 年 11 月FTX 破产,BTC 单周跌幅 > 25%
- 2020 年 3 月新冠疫情,BTC 单日跌幅 > 50%
**应对措施**
- 设置账户级最大亏损限制(如 20%),触发后暂停所有策略
- 在极端波动时ATR 急剧扩大)自动减仓
- 分散交易所风险,不将所有资金存放在单一交易所
### 7.2 交易所风险
- 不在单一交易所存放超过总资金的 30%
- 优先选择有保险基金的头部交易所Binance、Coinbase
- 定期将利润提现到冷钱包
---
## 参考资料
- tradehk 项目类型定义:`client/src/lib/types.ts`RiskSettings 接口)
- Whaleportal. "Quantitative Crypto Trading: Risk Management". https://whaleportal.com/
- Investopedia. "Kelly Criterion". https://www.investopedia.com/terms/k/kellycriterion.asp

查看文件

@@ -0,0 +1,316 @@
# AI 量化投资前沿
> 本文档梳理人工智能在量化投资领域的最新进展,涵盖深度学习、强化学习和大语言模型LLM三个主要方向,并重点介绍与加密货币交易相关的研究成果。
---
## 一、AI 量化投资发展综述
根据 2025 年 arXiv 综述论文《From Deep Learning to LLMs: A survey of AI in Quantitative Investment》[^1],AI 在量化投资中的应用经历了三个阶段:
### 1.1 传统统计阶段1970s-2010s
以人工设计因子为主,依赖统计模型线性回归、ARIMA 等)。核心工作流:
```
人工因子挖掘 → 因子检验 → 组合构建 → 风险控制
```
**代表性方法**
- Fama-French 三因子模型(市场、规模、价值)
- 动量因子、反转因子
- 统计套利(协整检验)
### 1.2 深度学习阶段2010s-2020s
深度学习使自动特征提取成为可能,端到端学习替代人工因子设计。
**主要模型**
| 模型 | 特点 | 应用场景 |
|------|------|----------|
| LSTM | 处理时序依赖关系 | 价格预测、趋势识别 |
| Transformer | 自注意力机制,捕捉长距离依赖 | 多资产相关性建模 |
| CNN | 局部特征提取 | K 线图像识别 |
| GAN | 生成对抗网络 | 数据增强、压力测试 |
| Autoencoder | 降维、去噪 | 特征提取、异常检测 |
### 1.3 大模型与 Agent 阶段2020s-至今)
LLM 能够处理非结构化数据(新闻、财报、社交媒体),强化学习 Agent 实现端到端自主决策。
---
## 二、深度学习价格预测
### 2.1 LSTM 价格预测
**原理**LSTM长短期记忆网络通过门控机制解决传统 RNN 的梯度消失问题,适合处理金融时序数据。
**arXiv 论文参考**
- 《Developing Cryptocurrency Trading Strategy Based on Autoencoder》(arXiv:2412.18202)[^2]
- 使用去噪自编码器提取价格序列的低维特征
- 结合 LSTM 进行价格预测
- 在 BTC、ETH 等主流币上验证
**Python 实现框架**
```python
import torch
import torch.nn as nn
class CryptoPriceLSTM(nn.Module):
def __init__(self, input_size=10, hidden_size=64, num_layers=2, output_size=1):
super().__init__()
self.lstm = nn.LSTM(
input_size=input_size,
hidden_size=hidden_size,
num_layers=num_layers,
batch_first=True,
dropout=0.2
)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
# x: (batch_size, seq_len, input_size)
lstm_out, _ = self.lstm(x)
# 取最后一个时间步的输出
output = self.fc(lstm_out[:, -1, :])
return output
# 输入特征OHLCV + 技术指标RSI、MACD、EWO 等)
# 输出:下一根 K 线的涨跌方向(分类)或价格(回归)
```
### 2.2 Transformer 在量化中的应用
**原理**Transformer 的自注意力机制能够同时考虑序列中所有时间步之间的关系,特别适合捕捉市场中的长距离依赖。
**arXiv 论文参考**
- 《Technical Analysis Meets Machine Learning: Bitcoin Evidence》(arXiv:2511.00665)[^3]
- 比较 LightGBM 和 LSTM 在 BTC 技术分析信号预测中的表现
- 发现机器学习模型能够有效整合多个技术指标信号
---
## 三、强化学习交易策略
### 3.1 强化学习框架
**核心概念**
- **状态State**:市场当前状态(价格、指标值、持仓等)
- **动作Action**:买入、卖出、持仓
- **奖励Reward**:收益率、夏普比率等
- **策略Policy**:从状态到动作的映射函数
**arXiv 论文参考**
- 《Reinforcement Learning Framework for Quantitative Trading》(arXiv:2411.07585)[^4]
- 在 30 分钟加密货币交易窗口内测试
- 使用 PPO近端策略优化算法
- 《Meta-Learning Reinforcement Learning for Crypto-Return Prediction》(arXiv:2509.09751)[^5]
- 提出 Meta-RL-Crypto 框架,结合元学习和强化学习
- 解决加密货币市场非平稳性问题
### 3.2 FinRL 框架
FinRL 是专为金融强化学习设计的开源框架:
```python
# FinRL 使用示例(加密货币交易)
from finrl.meta.env_cryptocurrency_trading.env_multiple_crypto import CryptoEnv
from finrl.agents.stablebaselines3.models import DRLAgent
# 创建交易环境
env = CryptoEnv(
df=price_data,
initial_amount=10000,
crypto_dim=5, # 5 种加密货币
tech_indicator_list=['macd', 'rsi', 'cci', 'dx']
)
# 训练 PPO 智能体
agent = DRLAgent(env=env)
model = agent.get_model("ppo")
trained_model = agent.train_model(
model=model,
tb_log_name='ppo_crypto',
total_timesteps=50000
)
```
### 3.3 强化学习的挑战
- **非平稳性**:加密货币市场规律随时间变化,历史经验可能失效
- **稀疏奖励**:长期持仓策略中,大多数时间步奖励为零
- **过拟合**RL 模型容易过拟合历史数据
- **计算成本**:训练需要大量计算资源
---
## 四、大语言模型LLM在量化中的应用
### 4.1 情绪分析
LLM 可以分析新闻、社交媒体、财报等非结构化文本,提取市场情绪信号:
```python
from openai import OpenAI
client = OpenAI()
def analyze_crypto_sentiment(news_text: str) -> dict:
"""
使用 LLM 分析加密货币新闻情绪
"""
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{
"role": "system",
"content": "你是一个专业的加密货币市场分析师。请分析以下新闻对市场的影响。"
},
{
"role": "user",
"content": f"""
请分析以下新闻的市场情绪,并给出:
1. 情绪评分(-10 到 +10,负数看空,正数看多
2. 影响的主要资产
3. 预期影响持续时间
4. 置信度0-100%
新闻内容:{news_text}
"""
}
],
response_format={"type": "json_object"}
)
return response.choices[0].message.content
# 应用场景:
# - 监控 Twitter/X 上的 KOL 发言
# - 分析 SEC 文件对代币化股票的影响
# - 解读美联储声明对加密货币市场的影响
```
### 4.2 LLM Alpha 因子生成
**arXiv 论文参考**
- 《From Deep Learning to LLMs: A survey of AI in Quantitative Investment》(arXiv:2503.21422)[^1]
- LLM 可以自动生成 Alpha 因子代码
- 通过迭代优化,LLM Agent 能够发现人工难以发现的规律
**工作流程**
```
1. LLM 分析历史市场数据特征
2. 生成候选 Alpha 因子代码
3. 自动回测评估因子有效性
4. 筛选有效因子,组合成策略
5. 循环迭代优化
```
### 4.3 多模态分析
结合 K 线图像和文本数据的多模态分析:
```python
# 将 K 线图转换为图像,输入视觉 LLM 分析
# 示例:使用 GPT-4V 分析 K 线形态
def analyze_kline_pattern(image_path: str) -> str:
import base64
with open(image_path, 'rb') as f:
image_data = base64.b64encode(f.read()).decode()
response = client.chat.completions.create(
model="gpt-4.1-mini",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{image_data}"}
},
{
"type": "text",
"text": "请分析这张 K 线图的技术形态,识别支撑位、阻力位和可能的趋势方向。"
}
]
}
]
)
return response.choices[0].message.content
```
---
## 五、机器学习特征工程
### 5.1 技术指标作为特征
将 tradehk 中的所有技术指标作为机器学习模型的输入特征:
```python
def create_feature_matrix(df: pd.DataFrame) -> pd.DataFrame:
"""
从 K 线数据创建机器学习特征矩阵
"""
features = pd.DataFrame(index=df.index)
# 价格特征
features['returns_1'] = df['close'].pct_change(1)
features['returns_5'] = df['close'].pct_change(5)
features['returns_20'] = df['close'].pct_change(20)
# 趋势特征
features['ma10'] = df['close'].rolling(10).mean()
features['ma100'] = df['close'].rolling(100).mean()
features['price_ma10_ratio'] = df['close'] / features['ma10']
# 动量特征
features['rsi14'] = calculate_rsi(df['close'], 14)
features['macd'] = calculate_macd(df['close'])
features['ewo'] = calculate_ewo(df['close'])
# 波动率特征
features['atr14'] = calculate_atr(df, 14)
features['bb_width'] = calculate_bb_width(df['close'], 20)
# 成交量特征
features['volume_ratio'] = df['volume'] / df['volume'].rolling(20).mean()
features['obv'] = calculate_obv(df['close'], df['volume'])
return features.dropna()
```
### 5.2 标签构建
```python
def create_labels(df: pd.DataFrame, horizon: int = 5, threshold: float = 0.01) -> pd.Series:
"""
构建分类标签
horizon: 预测未来 N 根 K 线
threshold: 涨跌幅阈值
"""
future_returns = df['close'].pct_change(horizon).shift(-horizon)
labels = pd.Series(0, index=df.index) # 0 = 持仓
labels[future_returns > threshold] = 1 # 1 = 买入
labels[future_returns < -threshold] = -1 # -1 = 卖出
return labels
```
---
## 参考资料
[^1]: Cao, B. et al. "From Deep Learning to LLMs: A survey of AI in Quantitative Investment". arXiv:2503.21422, 2025. https://arxiv.org/abs/2503.21422
[^2]: "Developing Cryptocurrency Trading Strategy Based on Autoencoder". arXiv:2412.18202. https://arxiv.org/abs/2412.18202
[^3]: "Technical Analysis Meets Machine Learning: Bitcoin Evidence". arXiv:2511.00665, 2025. https://arxiv.org/abs/2511.00665
[^4]: "Reinforcement Learning Framework for Quantitative Trading". arXiv:2411.07585, 2024. https://arxiv.org/abs/2411.07585
[^5]: "Meta-Learning Reinforcement Learning for Crypto-Return Prediction". arXiv:2509.09751, 2025. https://arxiv.org/abs/2509.09751

查看文件

@@ -0,0 +1,226 @@
# 链上数据分析指南
> 链上数据是加密货币市场独有的信息优势,提供了传统金融市场无法获得的透明度。本文档系统介绍链上数据的主要指标、分析方法和实际应用。
---
## 一、链上数据的独特价值
与传统金融市场相比,加密货币的区块链数据完全公开透明,任何人都可以查询:
| 数据类型 | 传统金融 | 加密货币链上 |
|----------|----------|-------------|
| 大额交易 | 延迟披露SEC 13F 季报) | 实时可见 |
| 机构持仓 | 部分披露 | 完全透明 |
| 资金流向 | 不可见 | 实时追踪 |
| 网络活跃度 | 不适用 | 活跃地址数、交易量 |
---
## 二、核心链上指标
### 2.1 SOPR已实现利润比率
**定义**:所有链上移动的 UTXO 的已实现价格与当前价格之比。
$$SOPR = \frac{已实现价格(卖出价格)}{已支付价格(买入价格)}$$
**解读**
- SOPR > 1整体市场处于盈利状态,卖出者获利
- SOPR < 1整体市场处于亏损状态,卖出者亏损
- SOPR 从 < 1 回升到 1亏损者停止抛售,市场可能触底
**交易信号**
- 熊市中 SOPR 持续 < 1 且开始回升 → 底部信号
- 牛市中 SOPR 急剧上升(> 1.05)→ 获利了结压力大
### 2.2 MVRV市值/已实现价值)
**定义**:当前市值与已实现市值(所有 BTC 按最后移动时的价格计算)之比。
$$MVRV = \frac{市值}{已实现市值}$$
**历史规律**
| MVRV 值 | 市场状态 | 历史操作建议 |
|---------|----------|-------------|
| > 3.5 | 极度高估 | 历史牛市顶部区域 |
| 2-3.5 | 高估 | 谨慎持仓 |
| 1-2 | 合理 | 正常持仓 |
| < 1 | 低估 | 历史底部区域,买入机会 |
### 2.3 交易所净流入/流出
**定义**:流入交易所的 BTC 数量减去流出交易所的 BTC 数量。
**解读**
- **净流入(正值)**:更多 BTC 流向交易所,抛售压力增加,看空
- **净流出(负值)**:更多 BTC 离开交易所(转入冷钱包),持有意愿增强,看多
**数据来源**Glassnode、CryptoQuant
### 2.4 活跃地址数Active Addresses
**定义**:在特定时间段内参与交易(发送或接收)的唯一地址数量。
**应用**
- 活跃地址数上升 + 价格上涨 = 健康的牛市
- 活跃地址数下降 + 价格上涨 = 可能是虚假上涨,警惕回调
- 活跃地址数急剧上升 = 市场关注度提升,可能是大行情前兆
### 2.5 矿工持仓变化Miner Position Index, MPI
**定义**:矿工每日发送到交易所的 BTC 数量与过去 365 天平均值之比。
**解读**
- MPI > 2矿工大量抛售,看空信号
- MPI < 0矿工积累,看多信号
---
## 三、巨鲸监控
### 3.1 什么是巨鲸
持有大量加密货币的地址,通常被称为"巨鲸"。其交易行为对市场有显著影响。
**BTC 巨鲸分类**
- 小鲸:持有 100-1000 BTC
- 中鲸:持有 1000-10000 BTC
- 大鲸:持有 > 10000 BTC通常是交易所或机构
### 3.2 巨鲸监控工具
| 工具 | 特点 | 访问方式 |
|------|------|----------|
| Nansen | 标记 500M+ 钱包,智能资金追踪 | 付费 API |
| Whale Alert | 实时大额交易提醒 | Telegram Bot |
| Arkham Intelligence | 去匿名化分析 | 网页/API |
| Etherscan | 以太坊地址查询 | 免费 API |
### 3.3 巨鲸行为模式
**积累阶段**
- 巨鲸在低价区持续小额买入(避免价格冲击)
- 交易所 BTC 余额持续下降
- 链上大额转账频率降低
**分发阶段**
- 巨鲸开始将 BTC 转入交易所
- 链上大额转账增加
- 交易所 BTC 余额开始上升
---
## 四、衍生品链上数据
### 4.1 资金费率Funding Rate
**来源**Coinglasshttps://www.coinglass.com/
**极端值信号**
- 资金费率 > 0.1%8 小时):多头过度拥挤,可能反转
- 资金费率 < -0.05%8 小时):空头过度拥挤,可能反转
**套利策略**:当资金费率持续为正时,可以做空永续合约 + 持有现货,赚取资金费率收益。
### 4.2 未平仓合约Open Interest
**解读**
| 价格 | 未平仓合约 | 解读 |
|------|-----------|------|
| 上涨 | 增加 | 多头主导,趋势延续 |
| 上涨 | 减少 | 空头平仓推动,可能是假突破 |
| 下跌 | 增加 | 空头主导,趋势延续 |
| 下跌 | 减少 | 多头平仓推动,可能是底部 |
### 4.3 清算热力图
清算热力图显示不同价格水平上的累积清算量,帮助识别:
- **多头清算密集区**:价格下跌时的支撑位(多头被清算后价格可能反弹)
- **空头清算密集区**:价格上涨时的阻力位(空头被清算后价格可能回落)
**数据来源**Coinglass 清算热力图
---
## 五、DeFi 链上数据
### 5.1 TVL总锁仓量
**定义**:锁定在 DeFi 协议中的资产总价值。
**应用**
- TVL 上升 + 代币价格上涨 = 健康增长
- TVL 下降 + 代币价格上涨 = 可能是虚假繁荣
**数据来源**DeFiLlamahttps://defillama.com/
### 5.2 DEX 交易量
**Uniswap 链上数据**(通过 The Graph 查询):
```graphql
query {
pools(
first: 10
orderBy: volumeUSD
orderDirection: desc
where: { volumeUSD_gt: "1000000" }
) {
id
token0 { symbol }
token1 { symbol }
volumeUSD
tvlUSD
feeTier
}
}
```
---
## 六、链上数据与技术指标结合
### 6.1 综合评分模型
将链上数据与技术指标结合,构建综合评分:
```python
def calculate_composite_score(
technical_score: float, # 技术指标评分(-10 到 +10
onchain_score: float, # 链上数据评分(-10 到 +10
sentiment_score: float # 情绪数据评分(-10 到 +10
) -> dict:
"""
综合评分模型
权重:技术指标 50%,链上数据 30%,情绪 20%
"""
composite = (
technical_score * 0.5 +
onchain_score * 0.3 +
sentiment_score * 0.2
)
return {
'composite_score': composite,
'signal': 'BUY' if composite > 3 else ('SELL' if composite < -3 else 'NEUTRAL'),
'strength': 'STRONG' if abs(composite) > 6 else ('MODERATE' if abs(composite) > 3 else 'WEAK')
}
```
### 6.2 实战案例BTC 底部识别
历史上 BTC 底部往往同时满足:
1. **技术面**RSI < 30,价格触及布林带下轨,EWO < 0 但开始回升
2. **链上面**MVRV < 1,SOPR < 1 但开始回升,交易所净流出
3. **情绪面**:恐惧贪婪指数 < 20极度恐惧
---
## 参考资料
- Glassnode 链上指标https://glassnode.com/metrics
- Nansen 链上分析https://www.nansen.ai/
- Coinglass 衍生品数据https://www.coinglass.com/
- DeFiLlama TVL 数据https://defillama.com/
- Gate.io. "链上数据分析是什么,鲸鱼动向会如何影响加密货币价格". https://web3.gate.com/zh/crypto-wiki/article/what-is-on-chain-data-analysis-and-how-do-whale-movements-affect-crypto-prices-20260112

查看文件

@@ -0,0 +1,142 @@
# arXiv 论文与资源汇总
> 本文档汇总量化交易领域的重要 arXiv 论文、开源项目和学习资源,所有链接均可直接访问。
---
## 一、arXiv 核心论文
### 1.1 综述类
| 论文标题 | arXiv 编号 | 发表时间 | 核心内容 |
|----------|-----------|----------|----------|
| From Deep Learning to LLMs: A survey of AI in Quantitative Investment | [2503.21422](https://arxiv.org/abs/2503.21422) | 2025-03 | AI 在量化投资全流程的应用综述,从传统统计到 LLM Agent |
| A Comprehensive Analysis of Machine Learning Models for Algorithmic Trading | [2407.18334](https://arxiv.org/abs/2407.18334) | 2024-07 | 评估 41 个机器学习模型在 BTC 价格预测中的表现 |
| Machine Learning Integration in Cryptocurrency Trading: A Systematic Review | ResearchSquare | 2025 | 系统综述 ML 在加密货币交易中的应用 |
### 1.2 深度学习价格预测
| 论文标题 | arXiv 编号 | 发表时间 | 核心内容 |
|----------|-----------|----------|----------|
| Developing Cryptocurrency Trading Strategy Based on Autoencoder | [2412.18202](https://arxiv.org/abs/2412.18202) | 2024-12 | 去噪自编码器 + 机器学习预测加密货币价格 |
| Technical Analysis Meets Machine Learning: Bitcoin Evidence | [2511.00665](https://arxiv.org/abs/2511.00665) | 2025-11 | LightGBM 和 LSTM 在 BTC 技术分析中的对比 |
| Achilles, Neural Network to Predict the Gold Vs US Dollar Integration | [2410.21291](https://arxiv.org/abs/2410.21291) | 2024-10 | 神经网络预测黄金/美元波动性 |
| Deep Learning for VWAP Execution in Crypto Markets | [2502.13722](https://arxiv.org/abs/2502.13722) | 2025-02 | 深度学习优化加密货币 VWAP 执行 |
### 1.3 强化学习交易
| 论文标题 | arXiv 编号 | 发表时间 | 核心内容 |
|----------|-----------|----------|----------|
| Reinforcement Learning Framework for Quantitative Trading | [2411.07585](https://arxiv.org/abs/2411.07585) | 2024-11 | 量化交易强化学习框架,在加密货币 30 分钟窗口测试 |
| Meta-Learning Reinforcement Learning for Crypto-Return Prediction | [2509.09751](https://arxiv.org/abs/2509.09751) | 2025-09 | Meta-RL-Crypto,解决加密货币非平稳性问题 |
| News-Aware Direct Reinforcement Trading for Financial Markets | [2510.19173](https://arxiv.org/abs/2510.19173) | 2025-10 | 结合新闻感知的强化学习交易 |
| FinRL Contest 2024: Cryptocurrency Trading with Ensemble Learning | [2504.02281](https://arxiv.org/abs/2504.02281) | 2025-04 | 集成学习方法训练 BTC 交易智能体 |
### 1.4 投资组合管理
| 论文标题 | arXiv 编号 | 发表时间 | 核心内容 |
|----------|-----------|----------|----------|
| Long-only cryptocurrency portfolio management by ranking the assets | [2512.08124](https://arxiv.org/abs/2512.08124) | 2025-12 | 基于资产排名的加密货币投资组合管理 |
---
## 二、重要开源项目
### 2.1 量化交易框架
| 项目 | GitHub | 语言 | 特点 |
|------|--------|------|------|
| Freqtrade | https://github.com/freqtrade/freqtrade | Python | 专为加密货币设计,支持 Binance、Bybit 等 |
| Backtrader | https://github.com/mementum/backtrader | Python | 功能全面的回测框架 |
| VectorBT | https://github.com/polakowo/vectorbt | Python | 向量化回测,速度极快 |
| FinRL | https://github.com/AI4Finance-Foundation/FinRL | Python | 金融强化学习框架 |
| QTSBE | https://github.com/simonpotel/QTSBE | Python | 量化交易策略回测引擎 |
### 2.2 数据工具
| 项目 | 链接 | 用途 |
|------|------|------|
| CCXT | https://github.com/ccxt/ccxt | 统一的加密货币交易所 API |
| Pandas-TA | https://github.com/twopirllc/pandas-ta | 技术指标计算库 |
| TA-Lib | https://ta-lib.org/ | 经典技术分析库 |
| Glassnode API | https://docs.glassnode.com/ | 链上数据 API |
---
## 三、重要数据平台
### 3.1 行情数据
| 平台 | 链接 | 数据类型 | 费用 |
|------|------|----------|------|
| Binance API | https://binance-docs.github.io/apidocs/ | K线、Tick、深度 | 免费 |
| CoinGecko API | https://www.coingecko.com/en/api | 价格、市值 | 免费/付费 |
| CryptoCompare | https://min-api.cryptocompare.com/ | 历史 K线 | 免费/付费 |
| Yahoo Finance | https://finance.yahoo.com/ | 代币化股票、传统资产 | 免费 |
### 3.2 链上数据
| 平台 | 链接 | 特点 |
|------|------|------|
| Glassnode | https://glassnode.com/ | 最全面的比特币链上指标 |
| Nansen | https://www.nansen.ai/ | 钱包标签,智能资金追踪 |
| Dune Analytics | https://dune.com/ | 自定义 SQL 查询链上数据 |
| The Graph | https://thegraph.com/ | DeFi 协议数据 GraphQL |
| CryptoQuant | https://cryptoquant.com/ | 交易所流量、矿工数据 |
### 3.3 衍生品数据
| 平台 | 链接 | 数据类型 |
|------|------|----------|
| Coinglass | https://www.coinglass.com/ | 资金费率、未平仓合约、清算 |
| Laevitas | https://laevitas.ch/ | 期权数据 |
| Skew | https://skew.com/ | 期权隐含波动率 |
---
## 四、学习资源
### 4.1 中文资源
| 资源 | 链接 | 内容 |
|------|------|------|
| BigQuant 量化平台 | https://bigquant.com/ | 量化策略开发、回测 |
| 掘金量化 | https://www.myquant.cn/ | 量化交易平台 |
| 知乎量化专栏 | https://www.zhihu.com/topic/19558476 | 量化交易讨论 |
| Bybit Learn | https://learn.bybit.com/zh-my/ | 加密货币技术分析 |
### 4.2 英文资源
| 资源 | 链接 | 内容 |
|------|------|------|
| QuantStart | https://www.quantstart.com/ | 量化交易系统化教程 |
| QuantInsti | https://blog.quantinsti.com/ | 量化金融课程和博客 |
| Investopedia | https://www.investopedia.com/ | 金融术语和策略百科 |
| TradingView | https://www.tradingview.com/ | 图表分析、Pine Script |
---
## 五、XAUT 和代币化股票专项资源
| 资源 | 链接 | 内容 |
|------|------|------|
| Tether Gold 官网 | https://gold.tether.to/ | XAUT 官方信息 |
| Paxos Gold | https://paxos.com/paxgold/ | PAXG 官方信息 |
| MEXC xStocks | https://www.mexc.com/ | 代币化美股交易 |
| PancakeSwap 代币化股票 | https://pancakeswap.finance/ | DEX 代币化股票永续合约 |
| Mudrex XAUT 分析 | https://mudrex.com/learn/gold-futures-historical-analysis-xaut/ | XAUT 量化分析 |
---
## 六、社区与讨论
| 社区 | 链接 | 特点 |
|------|------|------|
| r/algotrading | https://www.reddit.com/r/algotrading/ | 算法交易讨论 |
| r/CryptoCurrency | https://www.reddit.com/r/CryptoCurrency/ | 加密货币综合讨论 |
| Telegram 量化群 | 各大交易所官方群 | 实时信号和讨论 |
| Discord QuantConnect | https://discord.gg/quantconnect | 量化交易社区 |
---
*最后更新2026-03-05*

79
README.md 普通文件
查看文件

@@ -0,0 +1,79 @@
# 量化交易知识库QuantKnowledge
> **定位**面向加密货币CEX/DEX、黄金代币XAUT、代币化美股AAPL、TSLA 等)的量化交易全栈知识体系。所有内容本地化存储,支持引用链接,全部中文化。
---
## 知识库结构
| 目录 | 内容 |
|------|------|
| `01_基础理论/` | 量化交易基础概念、市场微观结构、价格形成机制 |
| `02_技术指标/` | 全套技术指标原理、公式、参数调优指南 |
| `03_交易策略/` | 趋势跟踪、均值回归、套利、动量等策略详解 |
| `04_交易信号系统/` | 多指标共振信号引擎设计与实现(参考 tradehk |
| `05_市场品种/` | 加密货币、XAUT 黄金、代币化美股品种分析 |
| `06_数据流程/` | 数据采集、清洗、存储、实时流处理流程 |
| `07_回测框架/` | 回测方法论、常见偏差规避、绩效评估指标 |
| `08_风险管理/` | 仓位管理、止损止盈、最大回撤控制、Kelly 公式 |
| `09_AI与机器学习/` | 深度学习、强化学习、LLM 在量化投资中的应用 |
| `10_链上数据分析/` | 链上指标、巨鲸监控、资金流向、衍生品数据 |
| `11_参考文献/` | arXiv 论文摘要、外部资源链接汇总 |
| `samples/` | Python 示例代码、回测样本、数据样本 |
| `assets/` | 图表图片、数据文件 |
---
## 快速导航
### 核心指标体系(来自 tradehk 项目)
tradehk 项目实现了以下完整指标体系,本知识库对其进行深度解析:
- **趋势类**MA简单移动均线、EMA指数移动均线、SuperTrend超级趋势线
- **动量类**EWO艾略特波浪振荡器、MACD、AO动量振荡器、RSI、KDJ、Stoch、StochRSI
- **波动率类**Bollinger Bands布林带、TTM Squeeze挤压动量、ATR真实波动幅度
- **成交量类**OBV能量潮、MFI资金流量指数、成交量收缩检测
- **趋势强度类**DMI/ADX趋势方向指数
### 信号系统架构
tradehk 采用**多指标共振评分机制**
- 核心信号MACD 金叉/死叉、AO 穿越零轴、MA 多头/空头排列(始终启用)
- 可选信号RSI、KDJ、Stoch、布林带、SuperTrend、DMI/ADX可配置
- 大周期方向过滤:基于 EWO + MACD + AO 的 4h/12h 趋势偏向判断
---
## 适用市场
本知识库覆盖以下市场品种:
**加密货币CEX**
- BTC/USDT、ETH/USDT、BNB/USDT 等主流币对
- DOGE、SOL、AVAX 等热门山寨币
- 永续合约、现货交易
**加密货币DEX**
- Uniswap、PancakeSwap 等 DEX 流动性池
- 链上套利、MEV 策略
**黄金代币**
- XAUTTether Gold1 枚 = 1 金衡盎司实物黄金
- PAXGPaxos Gold与 XAUT 配对套利
**代币化美股**
- AAPL苹果、TSLA特斯拉、NVDA英伟达
- 在 Binance、MEXC、PancakeSwap 等平台可交易
---
## 更新日志
| 日期 | 版本 | 更新内容 |
|------|------|----------|
| 2026-03-05 | v1.0 | 初始版本,基于 tradehk 项目指标体系构建 |
---
*本知识库由 Manus AI 构建,持续更新中。*

280
samples/backtest_sample.py 普通文件
查看文件

@@ -0,0 +1,280 @@
"""
量化交易回测样本 - MACD + EWO 趋势跟踪策略
基于 tradehk 项目的信号系统进行历史回测
使用方法:
pip install pandas numpy matplotlib requests
python backtest_sample.py
"""
import pandas as pd
import numpy as np
import requests
import json
from datetime import datetime
# ============================================================
# 数据获取
# ============================================================
def fetch_binance_klines(symbol: str, interval: str, limit: int = 1000) -> pd.DataFrame:
url = "https://api.binance.com/api/v3/klines"
params = {"symbol": symbol, "interval": interval, "limit": limit}
resp = requests.get(url, params=params, timeout=10)
resp.raise_for_status()
data = resp.json()
df = pd.DataFrame(data, columns=[
'timestamp', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
for col in ['open', 'high', 'low', 'close', 'volume']:
df[col] = df[col].astype(float)
return df[['timestamp', 'open', 'high', 'low', 'close', 'volume']].set_index('timestamp')
# ============================================================
# 指标计算
# ============================================================
def calc_ema(s, n): return s.ewm(span=n, adjust=False).mean()
def calc_sma(s, n): return s.rolling(n).mean()
def calc_rma(s, n): return s.ewm(alpha=1/n, adjust=False).mean()
def calc_macd(close, fast=10, slow=20, signal=10):
macd = calc_ema(close, fast) - calc_ema(close, slow)
sig = calc_ema(macd, signal)
return macd, sig, macd - sig
def calc_ewo(close):
return calc_ema(close, 5) - calc_ema(close, 35)
def calc_ao(df):
mid = (df['high'] + df['low']) / 2
return calc_sma(mid, 5) - calc_sma(mid, 34)
def calc_rsi(close, period=14):
delta = close.diff()
gain = calc_rma(delta.clip(lower=0), period)
loss = calc_rma((-delta).clip(lower=0), period)
rs = gain / loss.replace(0, np.nan)
return 100 - 100 / (1 + rs)
def calc_atr(df, period=14):
tr = pd.concat([
df['high'] - df['low'],
(df['high'] - df['close'].shift(1)).abs(),
(df['low'] - df['close'].shift(1)).abs()
], axis=1).max(axis=1)
return calc_rma(tr, period)
# ============================================================
# 策略MACD 金叉/死叉 + EWO 大方向过滤
# ============================================================
def generate_signals(df: pd.DataFrame) -> pd.DataFrame:
"""
策略逻辑:
- 大方向EWO > 0 看多,EWO < 0 看空
- 入场MACD 金叉(大方向看多时)或死叉(大方向看空时)
- 止损ATR 动态止损2 × ATR
"""
close = df['close']
macd_line, signal_line, histogram = calc_macd(close)
ewo = calc_ewo(close)
ao = calc_ao(df)
rsi = calc_rsi(close)
atr = calc_atr(df)
ma10 = calc_sma(close, 10)
ma100 = calc_sma(close, 100)
signals = pd.DataFrame(index=df.index)
signals['close'] = close
signals['macd'] = macd_line
signals['signal'] = signal_line
signals['histogram'] = histogram
signals['ewo'] = ewo
signals['ao'] = ao
signals['rsi'] = rsi
signals['atr'] = atr
signals['ma10'] = ma10
signals['ma100'] = ma100
# MACD 金叉/死叉
signals['macd_cross_up'] = (macd_line > signal_line) & (macd_line.shift(1) <= signal_line.shift(1))
signals['macd_cross_down'] = (macd_line < signal_line) & (macd_line.shift(1) >= signal_line.shift(1))
# 大方向过滤EWO
signals['trend_bullish'] = ewo > 0
signals['trend_bearish'] = ewo < 0
# 最终信号
signals['buy_signal'] = signals['macd_cross_up'] & signals['trend_bullish']
signals['sell_signal'] = signals['macd_cross_down'] & signals['trend_bearish']
return signals.dropna()
# ============================================================
# 回测引擎
# ============================================================
def backtest(df: pd.DataFrame, initial_capital: float = 10000, commission: float = 0.001) -> dict:
"""
简单回测引擎
- 固定仓位:每次使用全部资金
- 止损2 × ATR
- 止盈4 × ATR2:1 盈亏比)
"""
signals = generate_signals(df)
capital = initial_capital
position = 0 # 0=空仓, 1=多头
entry_price = 0
stop_loss = 0
take_profit = 0
trades = []
equity_curve = [capital]
for i in range(1, len(signals)):
row = signals.iloc[i]
prev_row = signals.iloc[i-1]
# 检查止损/止盈
if position == 1:
if row['close'] <= stop_loss:
# 止损出场
pnl = (row['close'] - entry_price) * (capital / entry_price)
pnl -= abs(pnl) * commission * 2
capital += pnl
trades.append({
'type': '止损出场',
'entry': entry_price,
'exit': row['close'],
'pnl': pnl,
'pnl_pct': (row['close'] - entry_price) / entry_price * 100
})
position = 0
elif row['close'] >= take_profit:
# 止盈出场
pnl = (row['close'] - entry_price) * (capital / entry_price)
pnl -= abs(pnl) * commission * 2
capital += pnl
trades.append({
'type': '止盈出场',
'entry': entry_price,
'exit': row['close'],
'pnl': pnl,
'pnl_pct': (row['close'] - entry_price) / entry_price * 100
})
position = 0
elif row['sell_signal']:
# 信号反转出场
pnl = (row['close'] - entry_price) * (capital / entry_price)
pnl -= abs(pnl) * commission * 2
capital += pnl
trades.append({
'type': '信号出场',
'entry': entry_price,
'exit': row['close'],
'pnl': pnl,
'pnl_pct': (row['close'] - entry_price) / entry_price * 100
})
position = 0
# 开仓
if position == 0 and row['buy_signal']:
entry_price = row['close']
atr = row['atr']
stop_loss = entry_price - 2 * atr
take_profit = entry_price + 4 * atr
position = 1
capital -= capital * commission # 入场手续费
# 记录净值
if position == 1:
unrealized = (row['close'] - entry_price) * (capital / entry_price)
equity_curve.append(capital + unrealized)
else:
equity_curve.append(capital)
# 计算绩效指标
equity = pd.Series(equity_curve)
returns = equity.pct_change().dropna()
total_return = (equity.iloc[-1] / initial_capital - 1) * 100
max_drawdown = ((equity.cummax() - equity) / equity.cummax()).max() * 100
if returns.std() > 0:
sharpe = returns.mean() / returns.std() * np.sqrt(365 * 24)
else:
sharpe = 0
winning_trades = [t for t in trades if t['pnl'] > 0]
losing_trades = [t for t in trades if t['pnl'] <= 0]
win_rate = len(winning_trades) / len(trades) if trades else 0
avg_win = np.mean([t['pnl_pct'] for t in winning_trades]) if winning_trades else 0
avg_loss = np.mean([t['pnl_pct'] for t in losing_trades]) if losing_trades else 0
profit_factor = abs(avg_win / avg_loss) if avg_loss != 0 else 0
return {
'初始资金': f"${initial_capital:,.2f}",
'最终资金': f"${equity.iloc[-1]:,.2f}",
'总收益率': f"{total_return:.2f}%",
'最大回撤': f"{max_drawdown:.2f}%",
'夏普比率': f"{sharpe:.2f}",
'总交易次数': len(trades),
'胜率': f"{win_rate:.2%}",
'平均盈利': f"{avg_win:.2f}%",
'平均亏损': f"{avg_loss:.2f}%",
'盈亏比': f"{profit_factor:.2f}",
'止损次数': len([t for t in trades if t['type'] == '止损出场']),
'止盈次数': len([t for t in trades if t['type'] == '止盈出场']),
'信号出场次数': len([t for t in trades if t['type'] == '信号出场']),
}
# ============================================================
# 主程序
# ============================================================
if __name__ == '__main__':
print("=" * 60)
print("量化策略回测 - MACD + EWO 趋势跟踪")
print("策略MACD 金叉EWO 多头时做多,ATR 动态止损止盈")
print("=" * 60)
test_cases = [
('BTCUSDT', '4h', 'BTC/USDT 4小时'),
('ETHUSDT', '4h', 'ETH/USDT 4小时'),
]
for symbol, interval, label in test_cases:
print(f"\n{'' * 50}")
print(f"回测品种:{label}")
print(f"{'' * 50}")
try:
df = fetch_binance_klines(symbol, interval, limit=1000)
print(f"数据范围:{df.index[0].strftime('%Y-%m-%d')}{df.index[-1].strftime('%Y-%m-%d')}")
print(f"K 线数量:{len(df)}")
results = backtest(df, initial_capital=10000)
print("\n📊 回测结果:")
for key, value in results.items():
print(f" {key:12s}: {value}")
except Exception as e:
print(f"错误:{e}")
print(f"\n{'=' * 60}")
print("⚠️ 免责声明:以上回测结果仅供学习参考,不构成投资建议")
print(" 历史表现不代表未来收益,实盘交易存在亏损风险")
print("=" * 60)

查看文件

@@ -0,0 +1,374 @@
"""
量化交易信号计算器 - 完整示例
基于 tradehk 项目的多指标共振信号系统 Python 实现
使用方法:
pip install pandas numpy requests
python signal_calculator_sample.py
"""
import pandas as pd
import numpy as np
import requests
from typing import Optional, Tuple
from dataclasses import dataclass
# ============================================================
# 数据获取
# ============================================================
def fetch_binance_klines(symbol: str, interval: str, limit: int = 500) -> pd.DataFrame:
"""
从 Binance 获取 K 线数据
参数:
symbol: 交易对,如 'BTCUSDT'
interval: 时间周期,如 '1h', '4h', '1d'
limit: 获取数量(最大 1000
"""
url = "https://api.binance.com/api/v3/klines"
params = {"symbol": symbol, "interval": interval, "limit": limit}
resp = requests.get(url, params=params, timeout=10)
resp.raise_for_status()
data = resp.json()
df = pd.DataFrame(data, columns=[
'timestamp', 'open', 'high', 'low', 'close', 'volume',
'close_time', 'quote_volume', 'trades', 'taker_buy_base',
'taker_buy_quote', 'ignore'
])
df['timestamp'] = pd.to_datetime(df['timestamp'], unit='ms')
for col in ['open', 'high', 'low', 'close', 'volume']:
df[col] = df[col].astype(float)
return df[['timestamp', 'open', 'high', 'low', 'close', 'volume']].set_index('timestamp')
# ============================================================
# 技术指标计算
# ============================================================
def calc_rma(series: pd.Series, period: int) -> pd.Series:
"""Wilder 平滑移动均线RMA"""
alpha = 1.0 / period
return series.ewm(alpha=alpha, adjust=False).mean()
def calc_ema(series: pd.Series, period: int) -> pd.Series:
"""指数移动均线EMA"""
return series.ewm(span=period, adjust=False).mean()
def calc_sma(series: pd.Series, period: int) -> pd.Series:
"""简单移动均线SMA"""
return series.rolling(period).mean()
def calc_atr(df: pd.DataFrame, period: int = 14) -> pd.Series:
"""真实波动幅度ATR"""
high, low, close = df['high'], df['low'], df['close']
tr = pd.concat([
high - low,
(high - close.shift(1)).abs(),
(low - close.shift(1)).abs()
], axis=1).max(axis=1)
return calc_rma(tr, period)
def calc_rsi(close: pd.Series, period: int = 14) -> pd.Series:
"""相对强弱指数RSI"""
delta = close.diff()
gain = delta.clip(lower=0)
loss = (-delta).clip(lower=0)
avg_gain = calc_rma(gain, period)
avg_loss = calc_rma(loss, period)
rs = avg_gain / avg_loss.replace(0, np.nan)
return 100 - (100 / (1 + rs))
def calc_macd(close: pd.Series, fast: int = 10, slow: int = 20, signal: int = 10) -> Tuple[pd.Series, pd.Series, pd.Series]:
"""
MACDtradehk 参数10, 20, 10
返回:(macd线, 信号线, 柱状图)
"""
ema_fast = calc_ema(close, fast)
ema_slow = calc_ema(close, slow)
macd_line = ema_fast - ema_slow
signal_line = calc_ema(macd_line, signal)
histogram = macd_line - signal_line
return macd_line, signal_line, histogram
def calc_ewo(close: pd.Series) -> pd.Series:
"""艾略特波浪振荡器EWO = EMA5 - EMA35"""
return calc_ema(close, 5) - calc_ema(close, 35)
def calc_ao(df: pd.DataFrame) -> pd.Series:
"""动量振荡器AO"""
midpoint = (df['high'] + df['low']) / 2
return calc_sma(midpoint, 5) - calc_sma(midpoint, 34)
def calc_kdj(df: pd.DataFrame, period: int = 9, k_smooth: int = 3, d_smooth: int = 3) -> Tuple[pd.Series, pd.Series, pd.Series]:
"""KDJ 指标"""
low_min = df['low'].rolling(period).min()
high_max = df['high'].rolling(period).max()
rsv = (df['close'] - low_min) / (high_max - low_min).replace(0, np.nan) * 100
k = rsv.ewm(com=k_smooth - 1, adjust=False).mean()
d = k.ewm(com=d_smooth - 1, adjust=False).mean()
j = 3 * k - 2 * d
return k, d, j
def calc_bollinger_bands(close: pd.Series, period: int = 20, multiplier: float = 2.0) -> Tuple[pd.Series, pd.Series, pd.Series]:
"""布林带"""
middle = calc_sma(close, period)
std = close.rolling(period).std()
upper = middle + multiplier * std
lower = middle - multiplier * std
return upper, middle, lower
def calc_supertrend(df: pd.DataFrame, period: int = 10, multiplier: float = 3.0) -> Tuple[pd.Series, pd.Series]:
"""
超级趋势线SuperTrend
返回:(趋势值, 方向: 1=多头, -1=空头)
"""
atr = calc_atr(df, period)
hl2 = (df['high'] + df['low']) / 2
upper_band = hl2 + multiplier * atr
lower_band = hl2 - multiplier * atr
supertrend = pd.Series(np.nan, index=df.index)
direction = pd.Series(1, index=df.index)
for i in range(1, len(df)):
# 更新上轨
if upper_band.iloc[i] < upper_band.iloc[i-1] or df['close'].iloc[i-1] > upper_band.iloc[i-1]:
upper_band.iloc[i] = upper_band.iloc[i]
else:
upper_band.iloc[i] = upper_band.iloc[i-1]
# 更新下轨
if lower_band.iloc[i] > lower_band.iloc[i-1] or df['close'].iloc[i-1] < lower_band.iloc[i-1]:
lower_band.iloc[i] = lower_band.iloc[i]
else:
lower_band.iloc[i] = lower_band.iloc[i-1]
# 确定方向
if direction.iloc[i-1] == -1:
if df['close'].iloc[i] > upper_band.iloc[i]:
direction.iloc[i] = 1
else:
direction.iloc[i] = -1
else:
if df['close'].iloc[i] < lower_band.iloc[i]:
direction.iloc[i] = -1
else:
direction.iloc[i] = 1
supertrend.iloc[i] = lower_band.iloc[i] if direction.iloc[i] == 1 else upper_band.iloc[i]
return supertrend, direction
# ============================================================
# 信号生成(多指标共振)
# ============================================================
@dataclass
class SignalResult:
signal_type: str # 'BUY', 'SELL', 'NEUTRAL'
strength: str # 'STRONG', 'MODERATE', 'WEAK'
bullish_score: int
bearish_score: int
details: dict
def generate_signal(df: pd.DataFrame, use_kdj: bool = True, use_supertrend: bool = True) -> SignalResult:
"""
多指标共振信号生成器
参数:
df: 包含 OHLCV 数据的 DataFrame
use_kdj: 是否启用 KDJ 信号
use_supertrend: 是否启用 SuperTrend 信号
"""
close = df['close']
# 计算所有指标
ma10 = calc_sma(close, 10)
ma100 = calc_sma(close, 100)
macd_line, signal_line, histogram = calc_macd(close)
ao = calc_ao(df)
rsi = calc_rsi(close)
bb_upper, bb_middle, bb_lower = calc_bollinger_bands(close)
# 取最后两根 K 线
curr = df.index[-1]
prev = df.index[-2]
bullish_score = 0
bearish_score = 0
details = {}
# ---- 核心信号MACD ----
macd_cross_up = macd_line[curr] > signal_line[curr] and macd_line[prev] <= signal_line[prev]
macd_cross_down = macd_line[curr] < signal_line[curr] and macd_line[prev] >= signal_line[prev]
if macd_cross_up:
bullish_score += 2
details['MACD'] = '金叉 (+2)'
elif macd_cross_down:
bearish_score += 2
details['MACD'] = '死叉 (+2)'
elif histogram[curr] > 0 and histogram[curr] > histogram[prev]:
bullish_score += 1
details['MACD'] = '柱状图扩大(正)(+1)'
elif histogram[curr] < 0 and histogram[curr] < histogram[prev]:
bearish_score += 1
details['MACD'] = '柱状图扩大(负)(+1)'
# ---- 核心信号AO ----
ao_cross_up = ao[curr] > 0 and ao[prev] <= 0
ao_cross_down = ao[curr] < 0 and ao[prev] >= 0
if ao_cross_up:
bullish_score += 1
details['AO'] = '上穿零轴 (+1)'
elif ao_cross_down:
bearish_score += 1
details['AO'] = '下穿零轴 (+1)'
# ---- 核心信号MA 排列 ----
if close[curr] > ma10[curr] and ma10[curr] > ma100[curr]:
bullish_score += 1
details['MA'] = '多头排列 (+1)'
elif close[curr] < ma10[curr] and ma10[curr] < ma100[curr]:
bearish_score += 1
details['MA'] = '空头排列 (+1)'
# ---- 可选信号RSI ----
if rsi[curr] < 30:
bullish_score += 1
details['RSI'] = f'超卖 {rsi[curr]:.1f} (+1)'
elif rsi[curr] > 70:
bearish_score += 1
details['RSI'] = f'超买 {rsi[curr]:.1f} (+1)'
# ---- 可选信号:布林带 ----
if close[curr] <= bb_lower[curr]:
bullish_score += 1
details['布林带'] = '触及下轨 (+1)'
elif close[curr] >= bb_upper[curr]:
bearish_score += 1
details['布林带'] = '触及上轨 (+1)'
# ---- 可选信号KDJ ----
if use_kdj:
k, d, j = calc_kdj(df)
kdj_cross_up = k[curr] > d[curr] and k[prev] <= d[prev]
kdj_cross_down = k[curr] < d[curr] and k[prev] >= d[prev]
if kdj_cross_up and k[curr] < 30:
bullish_score += 2
details['KDJ'] = f'低位金叉 K={k[curr]:.1f} (+2)'
elif kdj_cross_up:
bullish_score += 1
details['KDJ'] = f'金叉 K={k[curr]:.1f} (+1)'
elif kdj_cross_down and k[curr] > 70:
bearish_score += 2
details['KDJ'] = f'高位死叉 K={k[curr]:.1f} (+2)'
elif kdj_cross_down:
bearish_score += 1
details['KDJ'] = f'死叉 K={k[curr]:.1f} (+1)'
# ---- 可选信号SuperTrend ----
if use_supertrend:
st_value, st_direction = calc_supertrend(df)
if st_direction[curr] == 1 and st_direction[prev] == -1:
bullish_score += 2
details['SuperTrend'] = '趋势反转看多 (+2)'
elif st_direction[curr] == -1 and st_direction[prev] == 1:
bearish_score += 2
details['SuperTrend'] = '趋势反转看空 (+2)'
elif st_direction[curr] == 1:
bullish_score += 1
details['SuperTrend'] = '多头趋势中 (+1)'
elif st_direction[curr] == -1:
bearish_score += 1
details['SuperTrend'] = '空头趋势中 (+1)'
# ---- 信号强度判定 ----
active_optional = sum([True, True, use_kdj, use_supertrend]) # RSI, BB 始终启用
strong_threshold = 5 + int(active_optional * 0.5)
moderate_threshold = 3 + int(active_optional * 0.3)
if bullish_score > bearish_score:
signal_type = 'BUY'
score = bullish_score
elif bearish_score > bullish_score:
signal_type = 'SELL'
score = bearish_score
else:
return SignalResult('NEUTRAL', 'WEAK', bullish_score, bearish_score, details)
if score >= strong_threshold:
strength = 'STRONG'
elif score >= moderate_threshold:
strength = 'MODERATE'
else:
strength = 'WEAK'
return SignalResult(signal_type, strength, bullish_score, bearish_score, details)
# ============================================================
# 主程序
# ============================================================
if __name__ == '__main__':
print("=" * 60)
print("量化交易信号计算器 - 多指标共振系统")
print("=" * 60)
# 测试品种列表
test_symbols = [
('BTCUSDT', '1h', 'BTC/USDT 1小时'),
('ETHUSDT', '4h', 'ETH/USDT 4小时'),
('XAUTUSDT', '4h', 'XAUT/USDT 4小时黄金代币'),
]
for symbol, interval, label in test_symbols:
print(f"\n{'' * 50}")
print(f"品种:{label}")
print(f"{'' * 50}")
try:
# 获取数据
df = fetch_binance_klines(symbol, interval, limit=200)
print(f"数据获取成功:{len(df)} 根 K 线")
print(f"最新价格:{df['close'].iloc[-1]:.4f}")
# 生成信号
result = generate_signal(df, use_kdj=True, use_supertrend=True)
# 输出结果
emoji = '🟢' if result.signal_type == 'BUY' else ('🔴' if result.signal_type == 'SELL' else '')
print(f"\n{emoji} 信号:{result.signal_type} ({result.strength})")
print(f" 多头评分:{result.bullish_score} 空头评分:{result.bearish_score}")
print(f"\n指标详情:")
for indicator, detail in result.details.items():
print(f" {indicator}: {detail}")
except Exception as e:
print(f"错误:{e}")
print(f"\n{'=' * 60}")
print("注意:以上信号仅供参考,不构成投资建议")
print("=" * 60)