为了账号安全,请及时绑定邮箱和手机立即绑定

🚀 基于波动率加权的移动平均交叉策略分析报告

策略概述

这份报告分析了一个基于波动率调整的移动平均交叉策略,适用于大型股票投资组合。主要目的是展示QuantJourney 回测框架的能力,而不是优化这个特定策略。 在该策略中,我们实施动态的风险管理和投资组合优化,目标是使年化波动率为30%,并限制股票投资敞口。该策略旨在捕捉中长期趋势,同时降低噪音和执行风险。

我们利用信息系数(IC)信息比率(IR)来评估该策略在不同时间范围上的预测准确性。

……

完整文本和代码请访问: https://quantjourney.substack.com/

———————————————————

风险调整后的绩效指标(夏普比率:0.4795,索提诺比率:0.5785)显示出适度的回报,但仍有一定的改进空间。科技股的优异表现暗示了特定行业的潜力。从长周期来看,投资回报率下降表明短期内有明显优势,这表明高频交易或灵活调整持有期可能带来更大的收益。

性能概要

该策略展示了强大的阿尔法生成能力,经风险调整后的收益超过了市场基准表现。正的夏普比率索提诺比率表明了良好的风险效率,尽管还有提升策略整体风险回报特征的潜力。实际波动率为37.59%(高于初始目标30%),表明需要重新校准波动率管理机制。最大回撤率为22.09%,虽然显著,但考虑到实际波动率较高,这样的结果在预期之中。

瑞典交易统计

注:应直接翻译为“交易统计”,无需额外添加“瑞典”或者其他多余信息。

最终翻译应为:

交易统计

一个 胜率(45.83%) 表明该策略在其交易中略少于一半的交易获利,然而 盈亏比(1.0707) 意味着当它盈利时,平均盈利略高于平均亏损。这意味着这符合趋势跟踪策略的特征,这类策略通常依靠较少但较大的盈利来弥补更频繁但较小的亏损情况。

日均交易周转率为 9.0609,年化交易周转率为 0.7566,这表明该策略相当活跃,意味着更高的交易频率,这可能会增加交易成本。这种交易周转率在实际交易中需要仔细考虑执行成本。

我们来看看在QuantJourney回溯测试框架中,我们是如何定义这一策略的。

首先,我们为该策略构建了 JSON 配置。

宇宙筛选与数据处理
    'instruments': ['NVDA', 'AAPL', 'BA', 'ORCL', 'MSFT', 'AMD', 'GOOGL', 'AMZN'],  
    'trading_range': {'start': '2012-01-01', 'end': '2023-12-31'},  
    'target_volatility': 0.30,  
    'max_position_size': 0.15,  
    "market_data_provider": {  
        "source": "yfinance",  
        "granularity": "1d"  
    },  
    'market_data_processor': {  
        'eligibility': {  
            'volatility_threshold': 0.0002,  
            'liquidity_threshold': 1000000,  
            'active_threshold': 0.05,  
            'max_return_threshold': 0.20  
        }  
    },

如你所见,我们为市场数据提供模块设置了参数,以从 Yahoo 财经获取每日(EOD,End of Day,每日收盘)数据。

我们选择了一个集中的投资组合,包含8只大盘股,这减少了多元化的空间。然而,这是故意这么做的——我们这样做的目的,是为了展示QuantJourney回测框架的能力,而不是为了追求最佳回报进行优化。

我们的分析也涵盖了2012到2023年,这段时间基本上是牛市。

对于market_data_processor(市场数据处理程序,技术术语),我们已将策略配置为使其聚焦于一系列大型、高流动性的股票。我们选择了符合流动性和波动性标准的股票。

  • 波动率过滤器:最低日波动率为20bps,剔除那些可能无法提供足够交易机会的极低波动率工具。
  • 流动性门槛:最低日成交量为100万美元,确保充足的流动性来进出仓位而不引起显著的市场波动。
  • 活跃交易过滤器:要求价格较前一日有所变化,剔除没有价格变动的工具。
  • 极端波动过滤器:最大日回报率上限为20%,以减轻极端价格波动或潜在数据异常的影响。

这些过滤器旨在创建一个具有足够阿尔法机会的可交易资产池,同时减少执行风险并保证数据质量。

信号生成

我们战略的核心是信号生成的方式,这种方式在JSON配置文件中有说明。

    '指标配置': [  
        {'函数': '移动平均线', '列名': ['close'], '参数': {'周期': 50}},  
        {'函数': '移动平均线', '列名': ['close'], '参数': {'周期': 200}}  
    ],

然后在__signalgeneration(信号生成函数)中使用。

    sma_short = self.instruments_data.get_feature('SMA_50')  # 计算短期SMA,简单移动平均线是用于市场分析的一种方法
    sma_long = self.instruments_data.get_feature('SMA_200')  # 计算长期SMA
    entry_signals = (sma_short > sma_long).astype(int)  # 生成入场信号,比较短期SMA和长期SMA

我们使用50日和200日简单移动平均线(SMA)交叉策略。当50日SMA上穿200日SMA时,发出买入信号(1)。反之,当50日SMA下穿200日SMA时,我们退出(0)并卖出。

信号生成的过程可以形式化定义为:

其中 S(t) 是时间 t 时的信号,取值分别为 {-1, 0, 1},分别代表短期仓位、无仓位和长期仓位。这种方法的目的是捕捉中长期的价格走势,同时过滤高频噪声。50/200天的组合被选择是因为它在反应性和稳定性之间取得了平衡,符合策略的预期持仓期和风险特征。

我们已经明确表示我们想要一个只做多头策略,这意味着我们不会做空。这可以通过以下代码行实现。

entry_signals = entry_signals.where(sma_short.notna() & sma_long.notna(), 0)
仓位大小与风险控制

JSON配置中也指定了这些参数,

    '初始资金': 100000,  
    '目标波动水平': 0.30,  
    '最大仓位比例': 0.15,

该策略采用了一套高级的风险管理框架:

  1. 波动率目标:该投资组合旨在达到年化波动率为30%,表明这是一个高风险高回报配置,适合寻求阿尔法的对冲基金策略。
  2. 持仓限制:最大持仓规模限制为净资产值的15%,以平衡集中风险并保持捕捉阿尔法所需的有效持仓规模。
  3. 动态波动率调整:仓位根据其滚动波动率进行逆波动率调整,以保持一致的风险贡献,无论市场环境如何。

生成代码如下所示:
位置如下所示:

    def _生成信号(self) -> None:  
            信号 = self.标的资产数据.get_feature('strategies', self.策略名, '信号')  
            收盘价 = self.标的资产数据.get_feature('adj_close')  
            波动率 = self.标的资产数据.get_feature('volatility')  
            当前净资产 = self.投资组合数据.net_asset_value.iloc[-1]  
rolling_volatility = volatility.rolling(window=5, min_periods=1).mean()   # 计算滚动波动率
volatility_scaling_factor = (self.target_volatility / rolling_volatility).clip(upper=1)  # 计算波动率缩放因子,上限为1
position_values = signals * current_nav * self.max_position_size * volatility_scaling_factor  # 计算仓位价值
positions = (position_values / close).apply(np.floor)  # 计算仓位,并取整
positions = positions.fillna(0)  # 填充缺失值为0
self.instruments_data.add_strategy_data(self.strategy_name, 'positions', positions)  # 添加策略数据到仪器数据中
策略

(注:此处添加“#”以保持与源文本的一致性,若上下文显示“运行”一词冗余或在目标语言环境中更常省略,则可考虑使用“策略”。)

运行时,我们就运行代码。

    python quantjourney/回测/backtesting/策略/策略.py (学习多个信号的策略)

完整的策略代码如下所示:

信号处理

在上面的代码中,你可以看到SignalAnalysis和signal_analyzer,这都是为了通过信息系数(IC)、信息比率(IR)和命中率(Hit-Ratio)进行详细的信号分析。

    IC:  
                 1         5         20  
    AAPL    0.01412  0.019147  0.021038  
    AMD     0.021962  0.011016  0.016675  
    AMZN    0.007041  0.008947  0.018117  
    BA      -0.002075 -0.001959 0.018199  
    GOOGL   0.022345  0.027999  0.010607  
    MSFT    0.020775  0.019821  0.013928  
    NVDA    0.018589  0.013373  0.002867  
    ORCL    -0.001352 -0.008566 -0.008344  
    内部收益率:  
                 1          5         20  
    AAPL   0.814818 0.399740 0.201459  
    AMD    0.884855 0.359794 0.189236  
    AMZN   0.839033 0.377711 0.202340  
    BA     0.559278 0.252500 0.172612  
    GOOGL  0.808140 0.391115 0.174756  
    MSFT   1.033731 0.465838 0.227354  
    NVDA   1.434148 0.601914 0.281504  
    ORCL   0.505551 0.215634 0.104975  
    命中率:  
                 1         5         20  
    AAPL   0.365805 0.365474 0.364811  
    AMD    0.317097 0.315109 0.316103  
    AMZN   0.368456 0.369119 0.368456  
    BA     0.295560 0.295560 0.298542  
    GOOGL  0.388668 0.390325 0.384692  
    MSFT   0.419814 0.419152 0.413850  
    NVDA   0.407555 0.405898 0.402253  
    ORCL   0.362492 0.360504 0.359178  
    平均收益:  
                 1         5         20  
    AAPL   0.000786 0.000864 0.000882  
    AMD    0.001755 0.001599 0.001660  
    AMZN   0.000859 0.000868 0.000941  
    BA     0.000445 0.000452 0.000622  
    GOOGL  0.000735 0.000792 0.000701  
    MSFT   0.000979 0.000985 0.000968  
    NVDA   0.002230 0.002136 0.002029  
    ORCL   0.000400 0.000380 0.000375  
    换手率:  
    AAPL   0.003549  
    AMD    0.005238  
    AMZN   0.004258  
    BA     0.005751  
    GOOGL  0.004968  
    MSFT   0.003549  
    NVDA   0.002236  
    ORCL   0.004968
信息比率(简称IC)

信息系数(IC)是定量金融中一个重要的衡量标准,用来衡量我们预测信号与后续收益的相关性。我们计算了不同时间段(1天、5天、20天)下的IC值,以便更好地理解。

IC的解释:

  1. 总体低幅度:所有股票和时间范围内的IC值相对较低(< 0.03),表明预测能力较弱。在更专业的量化策略中,我们通常期望个别信号的IC值大于0.05。这与SR 0.47一致,该值比较低,我们通常期望SR大于1.0。
  2. 时间变化:有趣的是,某些股票(AAPL,AMZN,BA)的IC值随着时间范围的延长而增加,表明我们的信号可能对这些资产具有更好的中期预测效果。这可能表明信息的融入存在滞后,或者我们的模型捕捉到了更慢的因素。这意味着我们可能为某些资产而不是所有资产添加此类信号。
  3. 按行业不同:科技股(GOOGL,MSFT,NVDA)通常显示较高的短期IC值,这可能反映了该行业更高的信息效率,或者我们的模型更适合捕捉科技股的动态。

这一分析表明,我们应该为科技股和非科技股分别创建单独的模型校准,尤其是在趋势追踪策略方面。在实际交易中,我们一定会实施这种分离。我们可以为科技股和非科技股定义不同的JSON设置,或者根据行业来构建一个多信号策略。

信息夏普比率 (IR)

信息比率(IR)通过其波动性调整IC,提供了我们信号的风险调整的预测能力的洞察。我们还用三种不同的时间跨度计算了它。

解读:

  1. 强劲的短期表现:所有股票的日收益率都非常高,其中NVDA的日收益率达到1.43,尤为突出。这表明我们经过波动性调整的短期信号特别有效,并且NVDA股票有很强的动量效应。
  2. 随时间衰减:我们观察到,随着时间跨度的延长,日收益率呈现出一致的下降趋势。这种模式表明我们的信号对于较长时期来说,相对于其波动性而言,预测能力减弱。这意味着为了提高风险调整后的收益率,我们可以对持仓设定时间限制,而不是等待信号归零。
  3. 不同股票之间的差异:NVDA在所有时间跨度上的日收益率最高,表明我们的模型对该股票特别有效。相反,ORCL的日收益率最低,表明其预测的准确性较差。
  4. 科技股强势:与之前的分析相似,科技股(NVDA、MSFT、GOOGL)通常具有较高的日收益率,这进一步证实我们的模型可能更适合这个板块。

分析表明,我们应该优化交易频率,尤其是对于NVDA和MSFT,以抓住它们的强劲短期回报机会。类似于IC,我们还应该开发特定行业的模型,以便更好地区分科技股和非科技股。

命中率

准确率衡量正确方向判断的百分比,以提供模型一致性的见解。

解释说明:

  1. 所有命中率都低于50%,这通常不好,表明策略的可预测性较低。这种情况在依赖捕捉较大波动来抵消更频繁的小额亏损的基于量化的策略中并不罕见。
  2. 在不同时间框架下,命中率保持相对稳定,表明预测能力虽低但一致。
  3. 科技股表现优于其他:科技股(如微软、英伟达和谷歌等)的命中率再次较高,这与我们从IC和IR分析中得到的结果一致。
  4. 虽然命中率较低,我们的策略显示正收益(如平均收益表中所示)。这表明,当我们的预测正确时,它们能捕捉到重要的市场变化。

平均收益

这个指标可以让我们更好地了解我们信号捕获的回报程度。

解释一下:

  1. 正面回报:所有时间段均显示正平均回报,考虑到这一点,尽管成功率较低,这是一个好消息。这证实了我们在命中率方面发现的情况,即我们的策略在正确的时机下能够捕获更大的市场变动。
  2. NVDA 表现优异:NVDA 在平均回报中始终保持领先,与其在 IC 和 IR 指标中的优异表现一致。
  3. 时间跨度的变化:随着观察时间的延长,大多数股票的平均回报增加,表明我们的信号可能更有效地捕捉长期趋势。
  4. 行业差异:科技股(如NVDA、AMD、MSFT)通常表现出较高的平均回报,这与它们在其他指标中的优越表现一致。

这些计算都是在QuantJourney回测框架中的SignalAnalyser信号分析模块内完成的。

祝你好运!

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消