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黄金、代币化美股
这个提交包含在:
14
.gitignore
vendored
普通文件
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
|
||||||
129
01_基础理论/量化交易基础概念.md
普通文件
129
01_基础理论/量化交易基础概念.md
普通文件
@@ -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 等技术问题可能导致意外损失。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 四、量化交易的核心技能要求
|
||||||
|
|
||||||
|
成功的量化交易者需要具备以下能力的交叉:
|
||||||
|
|
||||||
|
```
|
||||||
|
数学/统计学
|
||||||
|
↕
|
||||||
|
编程能力 ←→ 金融知识
|
||||||
|
↕
|
||||||
|
风险管理
|
||||||
|
```
|
||||||
|
|
||||||
|
- **数学/统计学**:概率论、时间序列分析、随机过程
|
||||||
|
- **编程能力**:Python(pandas、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
|
||||||
356
02_技术指标/技术指标全集.md
普通文件
356
02_技术指标/技术指标全集.md
普通文件
@@ -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 随机 RSI(StochRSI)
|
||||||
|
|
||||||
|
**原理**:将 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(强)
|
||||||
|
- 总分 ≥ 3:MODERATE(中)
|
||||||
|
- 其他:WEAK(弱)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 参考资料
|
||||||
|
|
||||||
|
- tradehk 项目 `indicators.ts`:完整指标实现代码
|
||||||
|
- Investopedia 技术指标百科:https://www.investopedia.com/terms/t/technicalanalysis.asp
|
||||||
|
- TradingView 指标文档:https://www.tradingview.com/scripts/
|
||||||
219
03_交易策略/主要量化策略详解.md
普通文件
219
03_交易策略/主要量化策略详解.md
普通文件
@@ -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-Score:Z = (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 1(BTC、ETH、SOL)
|
||||||
|
- DeFi(UNI、AAVE、CRV)
|
||||||
|
- GameFi(AXS、SAND)
|
||||||
|
- AI 概念(FET、OCEAN)
|
||||||
|
- Meme(DOGE、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
|
||||||
246
04_交易信号系统/多指标共振信号引擎.md
普通文件
246
04_交易信号系统/多指标共振信号引擎.md
普通文件
@@ -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`
|
||||||
224
05_市场品种/市场品种全览.md
普通文件
224
05_市场品种/市场品种全览.md
普通文件
@@ -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 Gold(XAUT)
|
||||||
|
|
||||||
|
**基本信息**:
|
||||||
|
- 发行方:Tether(USDT 发行方)
|
||||||
|
- 锚定资产:1 XAUT = 1 金衡盎司(约 31.1 克)实物黄金
|
||||||
|
- 存储:瑞士金库
|
||||||
|
- 合约地址:以太坊 ERC-20 和 Tron TRC-20
|
||||||
|
|
||||||
|
**交易平台**:
|
||||||
|
- CEX:Bitfinex、Kraken、Bitget、OKX
|
||||||
|
- DEX:Uniswap(ETH 链)
|
||||||
|
|
||||||
|
**量化特性**:
|
||||||
|
|
||||||
|
| 特征 | 数值 | 说明 |
|
||||||
|
|------|------|------|
|
||||||
|
| 与黄金现货相关性 | > 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 Gold(PAXG)
|
||||||
|
|
||||||
|
**基本信息**:
|
||||||
|
- 发行方: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 | Meta(META) | 社交媒体+元宇宙 |
|
||||||
|
| 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%
|
||||||
|
|
||||||
|
**PancakeSwap(BNB 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
|
||||||
277
06_数据流程/数据采集与处理流程.md
普通文件
277
06_数据流程/数据采集与处理流程.md
普通文件
@@ -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)**:
|
||||||
|
- 未平仓合约增加 + 价格上涨 = 多头主导,趋势延续
|
||||||
|
- 未平仓合约减少 + 价格下跌 = 多头平仓,趋势可能反转
|
||||||
|
|
||||||
|
**清算数据**:
|
||||||
|
- 大规模清算往往是市场底部或顶部的信号
|
||||||
|
- 数据来源:Coinglass(https://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/
|
||||||
300
07_回测框架/回测方法论与实践.md
普通文件
300
07_回测框架/回测方法论与实践.md
普通文件
@@ -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/
|
||||||
249
08_风险管理/风险管理体系.md
普通文件
249
08_风险管理/风险管理体系.md
普通文件
@@ -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%)
|
||||||
|
|
||||||
|
**实践建议**:使用半 Kelly(12.5%)或四分之一 Kelly(6.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-3(tradehk 使用 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
|
||||||
316
09_AI与机器学习/AI量化投资前沿.md
普通文件
316
09_AI与机器学习/AI量化投资前沿.md
普通文件
@@ -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
|
||||||
226
10_链上数据分析/链上数据分析指南.md
普通文件
226
10_链上数据分析/链上数据分析指南.md
普通文件
@@ -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)
|
||||||
|
|
||||||
|
**来源**:Coinglass(https://www.coinglass.com/)
|
||||||
|
|
||||||
|
**极端值信号**:
|
||||||
|
- 资金费率 > 0.1%(8 小时):多头过度拥挤,可能反转
|
||||||
|
- 资金费率 < -0.05%(8 小时):空头过度拥挤,可能反转
|
||||||
|
|
||||||
|
**套利策略**:当资金费率持续为正时,可以做空永续合约 + 持有现货,赚取资金费率收益。
|
||||||
|
|
||||||
|
### 4.2 未平仓合约(Open Interest)
|
||||||
|
|
||||||
|
**解读**:
|
||||||
|
| 价格 | 未平仓合约 | 解读 |
|
||||||
|
|------|-----------|------|
|
||||||
|
| 上涨 | 增加 | 多头主导,趋势延续 |
|
||||||
|
| 上涨 | 减少 | 空头平仓推动,可能是假突破 |
|
||||||
|
| 下跌 | 增加 | 空头主导,趋势延续 |
|
||||||
|
| 下跌 | 减少 | 多头平仓推动,可能是底部 |
|
||||||
|
|
||||||
|
### 4.3 清算热力图
|
||||||
|
|
||||||
|
清算热力图显示不同价格水平上的累积清算量,帮助识别:
|
||||||
|
- **多头清算密集区**:价格下跌时的支撑位(多头被清算后价格可能反弹)
|
||||||
|
- **空头清算密集区**:价格上涨时的阻力位(空头被清算后价格可能回落)
|
||||||
|
|
||||||
|
**数据来源**:Coinglass 清算热力图
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 五、DeFi 链上数据
|
||||||
|
|
||||||
|
### 5.1 TVL(总锁仓量)
|
||||||
|
|
||||||
|
**定义**:锁定在 DeFi 协议中的资产总价值。
|
||||||
|
|
||||||
|
**应用**:
|
||||||
|
- TVL 上升 + 代币价格上涨 = 健康增长
|
||||||
|
- TVL 下降 + 代币价格上涨 = 可能是虚假繁荣
|
||||||
|
|
||||||
|
**数据来源**:DeFiLlama(https://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
|
||||||
142
11_参考文献/arXiv论文与资源汇总.md
普通文件
142
11_参考文献/arXiv论文与资源汇总.md
普通文件
@@ -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
普通文件
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 策略
|
||||||
|
|
||||||
|
**黄金代币**
|
||||||
|
- XAUT(Tether Gold):1 枚 = 1 金衡盎司实物黄金
|
||||||
|
- PAXG(Paxos Gold):与 XAUT 配对套利
|
||||||
|
|
||||||
|
**代币化美股**
|
||||||
|
- AAPL(苹果)、TSLA(特斯拉)、NVDA(英伟达)等
|
||||||
|
- 在 Binance、MEXC、PancakeSwap 等平台可交易
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 更新日志
|
||||||
|
|
||||||
|
| 日期 | 版本 | 更新内容 |
|
||||||
|
|------|------|----------|
|
||||||
|
| 2026-03-05 | v1.0 | 初始版本,基于 tradehk 项目指标体系构建 |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*本知识库由 Manus AI 构建,持续更新中。*
|
||||||
280
samples/backtest_sample.py
普通文件
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 × ATR(2: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)
|
||||||
374
samples/signal_calculator_sample.py
普通文件
374
samples/signal_calculator_sample.py
普通文件
@@ -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]:
|
||||||
|
"""
|
||||||
|
MACD(tradehk 参数: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)
|
||||||
在新工单中引用
屏蔽一个用户