[CTMS]费雪变换与价量趋势在量化交易中的应用

334 阅读7分钟

在量化交易领域,技术指标是构建交易策略的重要工具。费雪变换(Fisher Transform)和价量趋势(Price Volume Trend, PVT)是两种功能互补的指标,前者用于识别价格的极端点和趋势反转,后者结合价格与成交量的关系来衡量资金流向。本文将详细介绍费雪变换与价量趋势的原理、应用,并探讨如何结合其他策略在数字货币市场中实现更好的效果。我们将以Python和CCXT库获取数据为例,展示具体的实现方式。


1. 费雪变换(Fisher Transform)的原理与应用

1.1 原理

费雪变换由John F. Ehlers提出,旨在将价格数据转换为接近正态分布的形式,从而更容易识别价格的极端点和潜在反转信号。其核心思想是通过数学变换,将价格的波动限制在一定范围内(通常基于反正切函数),并突出价格的拐点。

费雪变换的计算步骤如下:

1.1.1 归一化价格

将价格(通常取一段时间内的最高价和最低价)归一化为-1到1之间的值。

  • • 公式:Value = 0.5 * (2 * (Price - Min) / (Max - Min) - 1),其中Max和Min是窗口期内的最高价和最低价。

1.1.2 应用变换

对归一化后的值应用反正切函数(arctanh),得到费雪值。

  • • 公式:Fisher = arctanh(Value)

1.1.3 平滑处理

通常会对原始价格数据进行平滑(如使用简单移动平均线SMA),以减少噪声影响。

费雪变换的输出是一个无界值,但通常在-5到5之间波动。值越大,表明价格越接近极端区域,可能预示着反转。

1.2 应用

  • • 超买超卖信号:当费雪值达到较高正值(如>2)时,表明市场可能处于超买状态;当费雪值达到较低负值(如<-2)时,表明市场可能超卖。
  • • 趋势反转:费雪值的快速转向(例如从正到负或从负到正)通常预示着趋势的反转。
  • • 信号线交叉:可以通过计算费雪值的移动平均线(信号线),观察费雪值与信号线的交叉点来生成买入或卖出信号。

2. 价量趋势(Price Volume Trend, PVT)的原理与应用

2.1 原理

价量趋势是一种结合价格变动和成交量的指标,旨在衡量资金的流入或流出。PVT的基本假设是成交量的大小反映了市场参与者的信心和资金流动的方向。

PVT的计算公式如下:

  • • PVT = [(Close - Previous Close) / Previous Close] * Volume + Previous PVT
    • • Close:当前收盘价
    • • Previous Close:前一周期的收盘价
    • • Volume:当前周期的成交量
    • • Previous PVT:前一周期的PVT值(初始值为0)

PVT是一个累积指标,类似于OBV(On-Balance Volume),但它通过价格变化的百分比对成交量进行加权,更加敏感地反映价格趋势与资金流的关系。

2.2 应用

  • • 趋势确认:PVT上升表明资金流入,支持价格上涨;PVT下降表明资金流出,支持价格下跌。
  • • 背离信号:当价格创出新高而PVT未创新高(或价格创出新低而PVT未创新低),可能预示趋势反转。
  • • 突破验证:PVT的显著变化可以用来确认价格突破的有效性。

3. 费雪变换与价量趋势的结合策略

费雪变换擅长捕捉价格的极端点和反转信号,而PVT则能提供资金流向的趋势确认,两者结合可以形成更稳健的交易策略。以下是一个结合两者的量化策略框架:

策略思路

3.1 入场信号:

  • • 当费雪变换从负值快速转向正值(例如从<-1升至>0),表明价格可能从超卖转为上涨趋势。
  • • 同时检查PVT是否同步上升,确认资金流入支持上涨。

3.2 离场信号:

  • • 当费雪变换从正值快速转向负值(例如从>1降至<0),表明价格可能从超买转为下跌趋势。
  • • 检查PVT是否同步下降,确认资金流出支持下跌。

3.3 过滤条件:

  • • 加入趋势过滤器(如20日均线),仅在均线方向与信号一致时交易。
  • • 设置止损和止盈,避免极端波动带来的风险。

3.4 适合的策略搭配

  • • 均线策略:结合短期(如10日)和长期(如50日)均线,过滤掉震荡行情中的假信号。
  • • RSI或MACD:用RSI确认超买超卖状态,或用MACD确认趋势方向,进一步提高信号可靠性。
  • • 波动率过滤:在高波动率环境下(如ATR>某阈值),优先考虑费雪变换信号;在低波动率环境下,PVT的趋势确认作用更强。

4. 使用CCXT获取数据并实现策略

4.1 Python代码示例

import ccxt
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 初始化交易所(以Binance为例)
exchange = ccxt.binance({
    'enableRateLimit': True,
})

# 获取BTC/USDT 1小时K线数据
symbol = 'BTC/USDT'
timeframe = '1h'
limit = 200
ohlcv = exchange.fetch_ohlcv(symbol, timeframe, limit=limit)
df = pd.DataFrame(ohlcv, columns=['timestamp''open''high''low''close''volume'])
df['timestamp'] = pd.to_datetime(df['timestamp']unit='ms')

# 计算费雪变换
def fisher_transform(high, low, close, period=10):
    price = (high + low) / 2  # 使用最高价和最低价的平均值
    value = np.zeros(len(close))
    fisher = np.zeros(len(close))
    
    for i in range(period, len(close)):
        min_price = min(price[i-period:i+1])
        max_price = max(price[i-period:i+1])
        if max_price != min_price:
            value[i] = 0.66 * (2 * (price[i] - min_price) / (max_price - min_price) - 1)
            value[i] = max(min(value[i], 0.999), -0.999)  # 限制范围避免溢出
            fisher[i] = 0.5 * (np.log((1 + value[i]) / (1 - value[i])) + fisher[i-1])
    return fisher

df['fisher'] = fisher_transform(df['high'], df['low'], df['close'])

# 计算PVT
df['pct_change'] = df['close'].pct_change()
df['pvt'] = (df['pct_change'] * df['volume']).cumsum()
df['pvt'] = df['pvt'].fillna(0)

# 可视化
plt.figure(figsize=(128))
plt.subplot(3, 1, 1)
plt.plot(df['timestamp'], df['close']label='Close Price')
plt.title('BTC/USDT Price')
plt.legend()

plt.subplot(3, 1, 2)
plt.plot(df['timestamp'], df['fisher']label='Fisher Transform', color='orange')
plt.axhline(0, color='gray', linestyle='--')
plt.title('Fisher Transform')
plt.legend()

plt.subplot(3, 1, 3)
plt.plot(df['timestamp'], df['pvt']label='PVT', color='green')
plt.title('Price Volume Trend')
plt.legend()

plt.tight_layout()
plt.show()

# 简单策略示例
df['signal'] = 0
df.loc[(df['fisher'] > 0) & (df['fisher'].shift(1) < 0) & (df['pvt'] > df['pvt'].shift(1)), 'signal'] = 1  # 买入
df.loc[(df['fisher'] < 0) & (df['fisher'].shift(1) > 0) & (df['pvt'] < df['pvt'].shift(1)), 'signal'] = -1  # 卖出

4.2 结果

Pasted image 20250318080230.png

4.3 代码说明

4.3.1 数据获取

通过CCXT从Binance获取BTC/USDT的1小时K线数据。

4.3.2 指标计算

  • • 费雪变换使用10周期窗口,基于最高价和最低价的平均值。
  • • PVT通过价格百分比变化和成交量累加计算。

4.3.3 信号生成

当费雪变换穿越0且PVT同步确认趋势时,生成买入或卖出信号。

4.3.4 可视化

绘制价格、费雪变换和PVT的走势图。


5. 数字货币市场的适用性与优化建议

5.1 适用性

  • • 高波动性:数字货币市场(如BTC/USDT)波动剧烈,费雪变换能有效捕捉极端点,而PVT能过滤掉无资金支持的假突破。
  • • 24/7交易:策略可以适应数字货币市场的连续交易特性,尤其适合短周期(如1小时或4小时)交易。

5.2 优化建议

  • • 参数调整:根据市场特性调整费雪变换的窗口期(如5、10、20)和PVT的平滑方式。
  • • 多时间框架:结合1小时和4小时数据,确认信号一致性。
  • • 风险管理:设置动态止损(如基于ATR),避免因高波动性导致的资金大幅回撤。
  • • 回测与优化:使用历史数据回测策略,评估胜率和盈亏比,优化入场和离场条件。

6. 总结

费雪变换与价量趋势的组合为量化交易提供了一个强大的工具集:费雪变换捕捉价格反转点,PVT确认资金流向趋势。通过合理搭配均线、RSI等指标,并结合数字货币市场的特性,可以构建一个适应性强、信号可靠的交易策略。使用CCXT获取实时数据并实现自动化交易,能进一步提升策略的实用性。

7. 联系方式