Py学习  »  Python

用 Python 实现稳赚不赔?这个量化策略回报率高达 293%!

数据科学实战 • 1 月前 • 117 次点击  

欢迎加入专注于财经数据与量化投研的【数据科学实战】知识星球!在这里,您将获取持续更新的《财经数据宝典》和《量化投研宝典》,这两部宝典相辅相成,为您在量化投研道路上提供明确指引。 《量化投研宝典》精选了业内持续维护且实用性强的开源工具(Backtrader、Qlib、VeighNa等),配合详细教程与代码示例,帮助您快速构建量化策略;《财经数据宝典》则汇集了多年财经数据维护经验,全面介绍从 AKShare、Tushare 到 Wind、iFind 等国内外数据源,并附有丰富的使用技巧。 无论您是量化投资新手还是经验丰富的研究者,星球社区都能帮您少走弯路,事半功倍,共同探索数据驱动的投资世界!

引言

你是否想过,通过 Python 编程就能让你的投资收益翻倍?今天要分享的这个量化交易策略,不仅实现了 293% 的惊人回报率,更重要的是,它将最大回撤从 37% 降低到了 16%!这意味着在获得高收益的同时,风险反而更小了。

本文将带你深入了解如何使用 Fisher Transform 和 KST(Know Sure Thing)技术指标,结合走步前进优化(Walk-Forward Optimization)方法,构建一个稳健的自适应动量交易策略。

核心策略解析

1. 技术指标介绍

Fisher Transform 指标

Fisher Transform 是一种将价格数据转换为近似正态分布的技术指标,能够更清晰地识别价格转折点。

def calculate_fisher_transform(df, period=10):
    """
    计算 Fisher Transform 指标
    
    参数:
    df: 包含股票数据的 DataFrame
    period: 计算周期,默认为 10
    """

    # 计算指定周期内的最高价和最低价
    high_rolling = df['High'].rolling(window=period).max()
    low_rolling = df['Low'].rolling(window=period).min()
    
    # 标准化价格到 -1 到 1 之间
    X = 2 * ((df['Close'] - low_rolling) / (high_rolling - low_rolling) - 0.5)
    
    # 应用 Fisher 变换公式
    fisher = 0.5 * np.log((1 + X) / (1 - X))
    
    # 计算信号线(9 期指数移动平均)
    fisher_signal = fisher.ewm(span= 9).mean()
    
    return fisher, fisher_signal

KST(Know Sure Thing)指标

KST 是一种动量振荡器,通过组合不同周期的变化率(ROC)来识别市场趋势。

def calculate_kst(df, roc1=10, roc2=15, roc3=20, roc4=30):
    """
    计算 KST 指标
    
    参数:
    df: 股票数据 DataFrame
    roc1-roc4: 不同的变化率周期
    """

    # 计算四个不同周期的变化率
    r1 = df['Close'].pct_change(roc1).rolling(10).mean()
    r2 = df['Close'].pct_change(roc2).rolling(10).mean()
    r3 = df['Close'].pct_change(roc3).rolling(10).mean()
    r4 = df['Close'].pct_change(roc4).rolling(15).mean()
    
    # 加权组合形成 KST 指标
    kst = r1 + 2 * r2 + 3 * r3 + 4 * r4
    
    # 计算信号线和直方图
    kst_signal = kst.rolling(9).mean()
    kst_hist = kst - kst_signal
    
    return kst, kst_signal, kst_hist

2. 交易信号生成

策略的核心逻辑非常简单:

  • 买入信号:当 Fisher Transform 及其信号线都大于 0,且 KST 直方图大于 0
  • 卖出信号:当 Fisher Transform 小于 0,信号线大于 0,且 KST 直方图小于 0
def generate_signals_fisher_kst(df):
    """生成买卖信号"""
     # 买入条件:三个指标都为正
    entry = (df['Fisher'] > 0) & (df['Fisher_Signal'] > 0) & (df['KST_Hist'] > 0)
    
    # 卖出条件:Fisher 转负,KST 直方图转负
    exit = (df['Fisher'] 0) & (df['Fisher_Signal'] > 0) & (df['KST_Hist'] 0)
    
    return entry, exit

3. 走步前进优化

这是策略的精髓所在!传统回测容易过度拟合历史数据,而走步前进优化通过滚动窗口的方式,更接近真实交易环境。

def walk_forward_optimization(df, start_year, end_year):
    """
    走步前进优化
    
    使用 2:1 的训练测试比例
    每年使用前两年的数据训练,第三年测试
    """

    results = []
    param_combinations = generate_parameter_combinations()
    
    for test_year in range(start_year + 2, end_year + 1):
        # 定义训练期(前两年)
        train_start = test_year - 2
        train_end = test_year - 1
        train_data = df[(df.index.year >= train_start) & (df.index.year <= train_end)]
        
        best_params = None
        best_performance = -np.inf
        
        # 遍历所有参数组合
        for params in param_combinations:
            fisher_p, r1, r2, r3, r4 = params
            data = train_data.copy()
            
            # 计算指标
            data['Fisher'], data['Fisher_Signal'] = calculate_fisher_transform(data, fisher_p)
            data['KST'], data['KST_Signal'], data['KST_Hist'] = calculate_kst(data, r1, r2, r3, r4)
            
            # 生成信号并回测
            entries, exits = generate_signals_fisher_kst(data)
            
            # 使用 vectorbt 进行回测
            pf = vbt.Portfolio.from_signals(
                close=data['Open'],
                entries=entries.shift(1),  # 信号延迟一天执行
                exits=exits.shift(1),
                init_cash=100_000,  # 初始资金 10 万
                fees=0.001,  # 手续费 0.1%
                slippage=0.002,  # 滑点 0.2%
                freq='D'
            )
            
            # 记录最佳参数
            performance = pf.total_return()
            if performance > best_performance:
                best_performance = performance
                best_params = params
        
        results.append({
            'Year': test_year,
            'Best_Params': best_params
        })
    
     return pd.DataFrame(results)

实战案例:AJG 股票测试

让我们看看这个策略在 Arthur J. Gallagher & Co(AJG)股票上的表现:

1. 数据准备与运行

import numpy as np
import pandas as pd
import yfinance as yf
import vectorbt as vbt

# 下载股票数据
symbol = 'AJG'
start_date = '2015-01-01'
end_date = '2025-01-01'
df = yf.download(symbol, start=start_date, end=end_date)

# 运行走步前进优化
results = walk_forward_optimization(df, 20182025)

2. 优化结果

系统为每一年找到了最优参数组合:

  • 2020 年:(7, 15, 15, 15, 20)
  • 2021 年:(8, 5, 10, 30, 20)
  • 2022 年:(8, 5, 10, 30, 20)
  • 2023 年:(6, 5, 10, 15, 20)
  • 2024 年:(6, 15, 15, 15, 25)
  • 2025 年:(10, 10, 20, 25, 20)

3. 性能指标对比

量化策略表现:

  • 总回报率:293%
  • 年化回报率:31.8%
  • 夏普比率:1.67
  • 最大回撤:16.2%
  • 市场暴露时间:71.83%

买入持有表现:

  • 总回报率:218%
  • 年化回报率:26.0%
  • 夏普比率:1.23
  • 最大回撤:36.8%

策略稳健性验证

1. Alpha 和 Beta 分析

from scipy.stats import linregress

# 计算策略与基准的关系
portfolio_returns = portfolio.returns()
benchmark_returns = benchmark.returns()

# 线性回归计算 Alpha 和 Beta
slope, intercept, r_value, _, _ = linregress(benchmark_returns, portfolio_returns)

print(f"Alpha: {intercept:.4f}")  # 0.0006,年化约 15.12%
print(f"Beta: {slope:.4f}")       # 0.5256,风险较低
print(f"相关性: {r_value**2:.4f}"# 0.7215,部分市场驱动

2. 蒙特卡洛模拟

为了验证策略的稳健性,我们进行了 1000 次蒙特卡洛模拟:

# 区块自助法蒙特卡洛模拟
n_simulations = 1000
block_size = 5  # 每个区块 5 天,保持时间序列特性

# 统计结果
print("蒙特卡洛模拟结果(1000 次):")
print(f"平均回报率:329.61%")
print(f"中位数回报率:296.26%")
print(f"5% 分位数回报率:115.10%")
print(f"95% 分位数回报率:643.93%")
print(f"平均最大回撤:18.26%")
print(f"平均夏普比率:1.56")

关键发现:

  • 约 70% 的模拟结果优于买入持有策略
  • 仅有 0.9% 的模拟出现比买入持有更大的回撤
  • 策略在风险控制方面表现卓越

实用建议

  1. 参数选择:不要使用固定参数,走步前进优化能够适应市场变化

  2. 风险管理:虽然策略表现优异,但记住过去的业绩不代表未来

  3. 交易成本:实盘交易时要考虑更高的手续费和滑点

  4. 代码优化:可以使用并行计算加速参数优化过程

  5. 扩展应用:可以尝试在其他股票或 ETF 上测试该策略

总结

这个基于 Fisher Transform 和 KST 指标的自适应动量策略展现了量化交易的魅力。通过 Python 编程和科学的回测方法,我们不仅实现了高达 293% 的回报率,更重要的是将风险(最大回撤)降低了一半以上。

走步前进优化方法让策略能够动态适应市场变化,避免了过度拟合的陷阱。蒙特卡洛模拟进一步验证了策略的稳健性,给了我们更多信心。

记住,所有的回测结果都基于历史数据,实盘交易需要谨慎。但这个案例充分展示了 Python 在量化交易中的强大威力——通过编程,我们可以系统化地寻找市场中的交易机会。

参考文章

加入专注于财经数据与量化投研的知识星球【数据科学实战】,获取完整研究解析、详细回测框架代码实现和完整策略逻辑实操指南。

财经数据与量化投研知识社区

核心权益如下:

  1. 赠送《财经数据宝典》完整文档,汇集多年财经数据维护经验
  2. 赠送《量化投研宝典》完整文档,汇集多年量化投研领域经验
  3. 赠送《PyBroker-入门及实战》视频课程,手把手学习量化策略开发
  4. 每日分享高质量量化投研文章、代码和相关资料
  5. 定期更新高频财经数据
  6. 参与年度不少于 10 次专属直播与录播课程
  7. 与核心开发者直接交流,解决实际问题
  8. 获取专业微信群交流机会和课程折扣

星球已有丰富内容积累,包括量化投研论文、财经高频数据、 PyBroker 视频教程、定期直播、数据分享和答疑解难。适合对量化投研和财经数据分析有兴趣的学习者及从业者。欢迎加入我们!

好文推荐

1. 用 Python 打造股票预测系统:Transformer 模型教程(一)

2. 用 Python 打造股票预测系统:Transformer 模型教程(二)

3. 用 Python 打造股票预测系统:Transformer 模型教程(三)

4. 用 Python 打造股票预测系统:Transformer 模型教程(完结)

5. 揭秘隐马尔可夫模型:因子投资的制胜武器

6. YOLO 也能预测股市涨跌?计算机视觉在股票市场预测中的应用

7. 金融 AI 助手:FinGPT 让你轻松掌握市场分析

8. 量化交易秘籍:为什么专业交易员都在用对数收益率?

9. Python 量化投资利器:Ridge、Lasso 和 Elastic Net 回归详解

10. 掌握金融波动率模型:完整 Python 实现指南

好书推荐

《Python编程:从入门到实践(第3版)》是一本广受欢迎的 Python 入门经典教材,由经验丰富的程序员 Eric Matthes 编写。该书采用循序渐进的教学方式,从基础语法讲解到实战项目开发,内容编排合理,实例丰富,语言通俗易懂。全书配有大量练习题和完整项目实战,包括数据可视化、网络爬虫、Web 应用开发等,让读者在实践中掌握编程技巧。第3版还增加了 f-string、海龟绘图等最新的 Python 特性内容。这本书不仅适合零基础读者入门学习,也非常适合想系统掌握 Python 的编程爱好者以及数据分析、人工智能等领域的学习者。它不仅教授编程知识,更注重培养读者的编程思维,是一本非常值得投资的 Python 学习指南。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/183446
 
117 次点击