作者:老余捞鱼
原创不易,转载请标明出处及原作者。
写在前面的话:最近我们团队研发了一种基于费雪变换和量价趋势(PVT)优化量化交易的策略,而这套方法能带来显著的超额收益。经过参数调整和历史数据回测,这套策略在特斯拉股票上实现了五年近19倍的回报,远超单纯持有特斯拉股票的13倍收益。这让我更加坚信,通过科学的分析和技术指标,我们完全可以在市场中发现隐藏的机会并从中获利。想知道具体怎么操作吗?继续往下看吧!
一、策略解读
费雪变换+量价趋势(PVT)的核心思想是利用先进的算法指标捕捉市场动量和交易量,从而帮助量化交易做出更好的决策。
1.1 什么是费雪变换?
费雪变换(Fisher Transform)是一种用于技术分析的数学工具,旨在将价格数据转换为更易于分析的形式。它通过将价格的相对变化映射到一个标准化的范围内,使得交易者能够更好地识别超买或超卖的市场状态。费雪变换常用于股票、外汇和其他金融市场的交易策略中。其公式如下:
费雪变换在股市的主要应用:
- 超买和超卖信号:通过分析费雪变换的值,交易者可以识别市场的超买或超卖状态。当费雪变换的值达到某个阈值时,可能表明市场已经过度反应,交易者可以考虑反向操作。
- 趋势识别:费雪变换可以帮助交易者识别价格趋势的变化。当费雪变换的值发生显著变化时,可能预示着趋势的反转或持续。
- 信号过滤:结合其他技术指标,费雪变换可以作为信号过滤器,帮助交易者提高交易决策的准确性。
费雪变换是一种强大的工具,能够帮助交易者更好地理解市场动态。通过将价格数据转换为标准化的形式,交易者可以更容易地识别潜在的交易机会。费雪变换并不是完美的,它需要接下来讲解的量价趋势进一步完善整体策略。
1.2 什么是量价趋势(PVT)?
量价趋势(Price Volume Trend,简称PVT)是一种技术分析指标,旨在通过结合价格和交易量的变化来帮助投资者判断市场趋势。PVT指标通过将价格变动与交易量相结合,提供了一种更为全面的市场动态视角,帮助投资者识别潜在的买入或卖出信号。
PVT的计算方法为:
当天PVT = 前一天PVT + 当天交易量 × (当天收盘价 - 前一天收盘价) / 前一天收盘价
PVT的计算过程为:
- 确定基准值:通常以第一天的收盘价为基准。
- 计算每日PVT变化:
- 如果当天的收盘价高于前一天的收盘价,PVT增加当天的交易量。
- 如果当天的收盘价低于前一天的收盘价,PVT减少当天的交易量。
- 如果收盘价没有变化,则PVT保持不变。
- 累加PVT值:将每日的PVT变化累加,得到当前的PVT值。
PVT的主要应用:
- 趋势确认:当PVT与价格走势一致时,表明当前趋势可能会持续。例如,价格上涨且PVT也上涨,说明买盘强劲,趋势有可能继续。
- 趋势反转信号:当PVT与价格走势出现背离时,可能预示着趋势反转的信号。例如,价格上涨但PVT下降,可能表明买盘力量减弱,趋势可能会反转。
- 交易决策:投资者可以根据PVT的变化来制定买入或卖出的策略,尤其是在关键支撑和阻力位附近。
量价趋势(PVT)是一种有效的技术分析工具,能够帮助投资者更好地理解市场动态。通过结合费雪变换处理过的价格和交易量的变化,PVT不仅可以确认当前趋势,还可以提供潜在的反转信号。
二、策略开发
接下来我们将通过代码开发实现上面的策略。主要功能是:通过优化PVT和Fisher变换的参数,找到一个最佳的股票交易策略,并使用历史数据进行回测和可视化。
这段代码主要用于股票数据的分析和策略优化,结合了技术指标计算、参数优化、回测和可视化。以下是对代码的详细解析:
1. 导入库
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import yfinance as yf
import vectorbt as vbt
from sklearn.model_selection import ParameterGrid
- numpy 和 pandas:用于数值计算和数据处理。
- seaborn 和 matplotlib:用于数据可视化。
- yfinance:用于从Yahoo Finance下载股票数据。
- vectorbt:用于回测和策略分析。
- ParameterGrid:用于生成参数网格,进行参数优化。
2. 定义技术指标计算函数
2.1 计算价格成交量趋势(PVT)
def calculate_pvt(df):
pvt = [0] # Initial PVT value
for i in range(1, len(df)):
pvt_value = pvt[-1] + ((df['Close'][i] - df['Close'][i-1]) / df['Close'][i-1]) * df['Volume'][i]
pvt.append(pvt_value)
return pd.Series(pvt, index=df.index)
- PVT(Price Volume Trend)是一种结合价格和成交量的技术指标,用于衡量价格趋势的强度。
- 该函数通过遍历数据框中的每一行,计算PVT值,并返回一个Pandas Series。
2.2 计算Fisher变换及其信号线
def calculate_fisher_transform(df, period=10):
high_rolling = df['High'].rolling(window=period).max()
low_rolling = df['Low'].rolling(window=period).min()
# 。。。。。。
return fisher, fisher_signal
- Fisher变换是一种将价格数据转换为正态分布的技术指标,常用于识别价格反转点。
- 该函数计算Fisher变换及其信号线(通过指数加权移动平均计算),并返回两个Pandas Series。
3. 下载股票数据
symbol = 'TSLA'
start_date = '2019-01-01'
end_date = '2025-01-01'
# 。。。。。。
- 使用
yfinance
下载特斯拉(TSLA)从2019年到2025年的股票数据。 - 数据包括开盘价、最高价、最低价、收盘价和成交量。
ffill
用于向前填充缺失值。
4. 参数优化
shift_values = range(1, 31) # PVT shift from 1 to 30
fisher_period_values = range(5, 31) # Fisher period from 5 to 30
# 。。。。。。
- 定义PVT的
shift
值和Fisher变换的period
值的范围。 - 使用
ParameterGrid
生成所有可能的参数组合。
5. 回测和优化
results = []
for params in grid:
shift_value = params['shift']
fisher_period = params['fisher_period']
df['PVT'] = calculate_pvt(df)
df['Fisher'], df['Fisher_Signal'] = calculate_fisher_transform(df, period=fisher_period)
# 。。。。。。
results.append({
'shift': shift_value,
'fisher_period': fisher_period,
'performance': portfolio.stats()['Total Return [%]']
})
- 遍历所有参数组合,计算PVT和Fisher变换,并生成交易信号(Entry和Exit)。
- 使用
vectorbt
进行回测,计算每个参数组合的总回报率。 - 将结果存储在
results
列表中。
6. 结果可视化(热图)
results_df = pd.DataFrame(results)
heatmap_data = results_df.pivot(index='fisher_period', columns='shift', values='performance')
plt.figure(figsize=(12, 8))
sns.heatmap(heatmap_data, annot=False, fmt=".1f", cmap="coolwarm", cbar_kws={'label': 'Total Return [%]'})
plt.title("Heatmap of Total Return by Shift and Fisher Period")
plt.xlabel("Shift")
plt.ylabel("Fisher Period")
plt.show()
- 将结果转换为DataFrame,并生成热图,展示不同参数组合下的总回报率。
7. 最佳参数选择
best_params = results_df.loc[results_df['performance'].idxmax()]
print("Best parameters:")
print(f"Shift: {best_params['shift']}")
print(f"Fisher Period: {best_params['fisher_period']}")
print(f"Total Return: {best_params['performance']}")
- 找到总回报率最高的参数组合,并打印最佳参数。
输出结果如下:
Best parameters:
Shift: 18.0
Fisher Period: 26.0
Total Return: 6144.9238142958
- Shift: 18.0
这是PVT(价格成交量趋势)的偏移值,表示在生成交易信号时,PVT值需要与18天前的PVT值进行比较。 - Fisher Period: 26.0
这是Fisher变换的计算周期,表示在计算Fisher变换时,使用了26天的最高价和最低价。 - Total Return: 6144.9238142958
这是在该参数组合下,策略的总回报率(百分比)。6144.92%表示策略在测试期间(2020-2025)的累计收益为初始资金的61.45倍。
8. 使用最佳参数进行回测
df['PVT'] = calculate_pvt(df)
df['Fisher'], df['Fisher_Signal'] = calculate_fisher_transform(df, period=30)
df['Entry'] = (df['PVT'] > df['PVT'].shift(26)) & (df['Fisher'] > df['Fisher_Signal'])
df['Exit'] = (df['PVT'] < df['PVT'].shift(26)) & (df['Fisher'] < df['Fisher_Signal'])
df = df[(df.index.year >= 2020) & (df.index.year <= 2025)]
portfolio = vbt.Portfolio.from_signals(
close=df['Close'],
entries=df['Entry'],
exits=df['Exit'],
init_cash=100_000,
fees=0.001
)
print(portfolio.stats())
portfolio.plot().show()
- 使用最佳参数重新计算PVT和Fisher变换,生成交易信号,并进行回测。
- 打印回测结果,并绘制资金曲线。
以上代码结合了技术指标计算、参数优化、回测和可视化,展示了如何通过系统化的方法进行策略开发和优化。
9. 回测性能指标分析
回测输出结果如下:
Start 2020-01-02 00:00:00
End 2024-12-31 00:00:00
Period 1258
Start Value 100000.0
End Value 1994740.623761
Total Return [%] 1894.740624
Benchmark Return [%] 1307.892888
Max Gross Exposure [%] 100.0
Total Fees Paid 42888.457775
Max Drawdown [%] 38.771981
Max Drawdown Duration 664.0
Total Trades 26
Total Closed Trades 25
Total Open Trades 1
Open Trade PnL 706830.425741
Win Rate [%] 56.0
Best Trade [%] 118.168326
Worst Trade [%] -18.001128
Avg Winning Trade [%] 29.905057
Avg Losing Trade [%] -5.907255
Avg Winning Trade Duration 42.214286
Avg Losing Trade Duration 11.272727
Profit Factor 2.945644
Expectancy 47516.407921
以下是对回测结果的详细说明:
9.1 时间范围
- Start 和 End:回测的时间范围是从2020年1月2日到2024年12月31日。
- Period:回测期间共有1258个交易日。
9.2 资金变化
- Start Value:初始资金为100,000美元。
- End Value:回测结束时,资金增长到1,994,740.62美元。
- Total Return [%]:策略的总回报率为1894.74%,即初始资金增长了约18.95倍。
- Benchmark Return [%]:基准回报率为1307.89%,表示如果单纯持有特斯拉股票(不进行任何交易),收益为初始资金的13.08倍。
9.3 风险指标
- Max Gross Exposure [%]:策略的最大总敞口为100%,表示策略始终满仓操作。
- Total Fees Paid:总交易费用为42,888.46美元,这是基于每次交易0.1%的手续费计算的。
- Max Drawdown [%]:最大回撤为38.77%,表示策略在回测期间的最大资金回撤幅度。
- Max Drawdown Duration:最大回撤持续时间为664天,即策略从最高点到恢复最高点的时间。
9.4 交易统计
- Total Trades:总交易次数为26次。
- Total Closed Trades:已完成交易为25次。
- Total Open Trades:当前有1笔未平仓交易。
- Open Trade PnL:未平仓交易的当前盈亏为706,830.43美元。
9.5 胜率和盈亏
- Win Rate [%]:胜率为56%,表示56%的交易是盈利的。
- Best Trade [%]:最佳单笔交易的收益率为118.17%。
- Worst Trade [%]:最差单笔交易的亏损率为-18.00%。
- Avg Winning Trade [%]:平均盈利交易的收益率为29.91%。
- Avg Losing Trade [%]:平均亏损交易的亏损率为-5.91%。
9.6 交易持续时间
- Avg Winning Trade Duration:平均盈利交易的持续时间为42.21天。
- Avg Losing Trade Duration:平均亏损交易的持续时间为11.27天。
9.7 其他指标
- Profit Factor:盈利因子为2.9456,表示每亏损1美元,可以盈利2.9456美元。盈利因子大于1表示策略总体是盈利的。
- Expectancy:期望值为47,516.41美元,表示每笔交易的平均预期收益。
10. 性能可视化
如下图所示:
- 策略表现:该策略在2020-2025年期间表现优异,总回报率为1894.74%,远超基准回报率(1307.89%)。
- 风险控制:最大回撤为38.77%,持续时间为664天,表明策略在极端市场条件下可能会有较大的资金回撤。
- 交易频率:策略交易频率较低,共26笔交易,胜率为56%,平均盈利交易的收益率较高(29.91%)。
- 最佳参数:PVT的偏移值为18,Fisher变换的周期为26,这是通过参数优化得到的最佳组合。
总体来看,该策略在测试期间表现非常出色,但需要注意其较高的回撤风险和较长的回撤持续时间。在实际应用中,可能需要进一步优化风险控制机制。
11. 实战工具(源代码)下载
源代码请在我的Google Colab中申请使用和下载:
https://colab.research.google.com/drive/1IPOtCgxZT0Ixr1I1MMPUlik68OW9kuD7?usp=sharing
三、观点总结
本文深入探讨了如何利用费雪变换(Fisher Transform)和量价趋势(PVT)构建量化交易策略,并通过历史数据回测展示了该策略在特斯拉股票上的卓越表现——五年内实现了近19倍的回报。文章不仅详细解释了技术指标的原理,还提供了具体的实现方法和优化建议,适合对量化交易感兴趣的读者学习和实践。
- 核心策略:结合费雪变换和量价趋势(PVT),捕捉市场趋势反转和延续信号。
- 历史回测:在特斯拉股票上测试,五年内实现19倍回报,远超单纯持有的13倍收益。
- 技术指标:费雪变换用于识别价格极端值,PVT用于衡量价格与成交量的关系。
- 参数优化:通过调整参数和回测,提升策略的稳定性和收益。
- 实用工具:文章提供了代码实现和工具,方便读者直接应用和验证策略。
感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。