TAStatistics
TA.CORREL() - 皮尔逊相关系数
皮尔逊相关系数 (Pearson's Correlation Coefficient)
计算两个数据序列的线性相关性,用于配对交易和套利策略。
语法
python
TA.CORREL(high, low, timeperiod=30)参数
| 参数名 | 类型 | 必选 | 默认值 | 说明 |
|---|---|---|---|---|
| high | any | 否 | - | 第一个数据序列 |
| low | any | 否 | - | 第二个数据序列 |
| timeperiod | any | 否 | - | 计算周期,默认 30 |
返回值
返回相关系数数组,范围 -1 到 +1:
- +1:完全正相关
- 0:无相关
- -1:完全负相关
计算方法
plaintext
r = Σ((x - x̄)(y - ȳ)) / √(Σ(x - x̄)² × Σ(y - ȳ)²)
其中:
x, y = 两个数据序列
x̄, ȳ = 平均值信号解读
| 相关系数 | 关系 | 应用 |
|---|---|---|
| 0.8 ~ 1.0 | 强正相关 | 配对交易、套利 |
| 0.5 ~ 0.8 | 中等正相关 | 组合优化 |
| -0.5 ~ 0.5 | 弱相关/无关 | 分散投资 |
| -0.8 ~ -0.5 | 中等负相关 | 对冲策略 |
| -1.0 ~ -0.8 | 强负相关 | 反向套利 |
基础示例
双资产相关性分析
python
def main():
while True:
# 获取BTC数据
records_btc = exchange.GetRecords()
# 切换到ETH
exchange.IO("currency", "ETH_USDT")
records_eth = exchange.GetRecords()
exchange.IO("currency", "BTC_USDT")
if len(records_btc) < 50 or len(records_eth) < 50:
Sleep(1000)
continue
btc_close = [r['Close'] for r in records_btc]
eth_close = [r['Close'] for r in records_eth]
# 计算30周期相关性
correl = TA.CORREL(btc_close, eth_close, 30)
Log(f"BTC-ETH 相关系数: {correl[-1]:.3f}")
if correl[-1] > 0.8:
Log("✅ 强正相关,适合配对交易")
elif correl[-1] > 0.5:
Log("📊 中等正相关")
elif correl[-1] < -0.5:
Log("⚠️ 负相关,可能对冲")
else:
Log("💤 弱相关或无关")
Sleep(60000)高级应用
配对交易策略
python
def main():
while True:
# 获取两个相关资产
records_btc = exchange.GetRecords()
exchange.IO("currency", "ETH_USDT")
records_eth = exchange.GetRecords()
exchange.IO("currency", "BTC_USDT")
if len(records_btc) < 100 or len(records_eth) < 100:
Sleep(1000)
continue
btc_close = [r['Close'] for r in records_btc]
eth_close = [r['Close'] for r in records_eth]
# 计算相关性
correl = TA.CORREL(btc_close, eth_close, 30)
# 只在高相关时交易
if correl[-1] > 0.8:
# 计算价格比率
ratio = [btc_close[i] / eth_close[i] for i in range(len(btc_close))]
ratio_ma = sum(ratio[-30:]) / 30
ratio_std = TA.STDDEV(ratio, 30)[-1]
# Z-score
z_score = (ratio[-1] - ratio_ma) / ratio_std
Log(f"相关性: {correl[-1]:.3f}")
Log(f"比率 Z-score: {z_score:.2f}")
# 交易信号
if z_score > 2:
Log("✅ BTC相对超买,做空BTC做多ETH")
elif z_score < -2:
Log("✅ BTC相对超卖,做多BTC做空ETH")
Sleep(60000)相关性变化监控
python
def main():
while True:
records_btc = exchange.GetRecords()
exchange.IO("currency", "ETH_USDT")
records_eth = exchange.GetRecords()
exchange.IO("currency", "BTC_USDT")
if len(records_btc) < 100:
Sleep(1000)
continue
btc_close = [r['Close'] for r in records_btc]
eth_close = [r['Close'] for r in records_eth]
# 短期和长期相关性
correl_short = TA.CORREL(btc_close, eth_close, 10)
correl_long = TA.CORREL(btc_close, eth_close, 50)
Log(f"短期相关性 (10): {correl_short[-1]:.3f}")
Log(f"长期相关性 (50): {correl_long[-1]:.3f}")
# 相关性变化
if correl_short[-1] > correl_long[-1] + 0.2:
Log("📈 相关性增强")
elif correl_short[-1] < correl_long[-1] - 0.2:
Log("📉 相关性减弱")
Sleep(60000)参数优化建议
| 周期 | 推荐值 | 适用场景 |
|---|---|---|
| 短期 | 10-20 | 短线配对交易 |
| 中期 | 30-50 | 波段套利 |
| 长期 | 60-100 | 组合优化 |
与其他指标配合
相关性 + 价格比率
python
correl = TA.CORREL(btc_close, eth_close, 30)
ratio = [btc_close[i] / eth_close[i] for i in range(len(btc_close))]
# 高相关 + 比率偏离
if correl[-1] > 0.8:
# 计算比率偏离
pass相关性 + 标准差
python
correl = TA.CORREL(btc_close, eth_close, 30)
std_btc = TA.STDDEV(btc_close, 30)
std_eth = TA.STDDEV(eth_close, 30)
# 相关性 + 波动性分析注意事项
- 非线性关系:CORREL只衡量线性相关,可能遗漏非线性关系
- 滞后性:相关性是历史统计,未来可能改变
- 虚假相关:相关不等于因果
- 周期敏感:不同周期相关性可能差异很大
- 极端值影响:异常值会显著影响相关系数
- 平稳性要求:最好在价格平稳序列上计算
相关指标
- BETA - 贝塔系数 - 系统性风险度量
- STDDEV - 标准差 - 波动性度量
实战要点
配对交易条件
✅ 相关性 > 0.8(强正相关) ✅ 价格比率偏离均值 > 2σ ✅ 两资产流动性充足 ✅ 交易成本可控
风险控制
- 相关性降低时及时止损
- 设置比率偏离的最大容忍度
- 监控相关性变化趋势
- 避免在相关性不稳定时交易