Py学习  »  Python

技术笔记:用Python实现债券ETF日历交易的量化方法

老余捞鱼 • 7 月前 • 397 次点击  


图片
 点击上方蓝字 | 关注更多好文
写在前面的话


最近研究了一个有趣的债券ETF交易模式,这个方法不依赖复杂的技术指标,而是基于月初月末的资金流动规律。通过Python量化回测,我发现这个简单的日历策略在过去20年表现相当亮眼。今天就把这个方法分享给大家,仅供学习参考。


文中示例仅用于技术讨论,不构成任何操作建议。

量化策略开发应以学习和技术交流为目的。

本公众号不荐股、不卖课、不承诺收益。

市场有风险,请合法合规投资。

一、策略灵感来源

前段时间在研究债券ETF时,我注意到一个有趣的现象:TLT(美国长期国债ETF)在每个月的开始和结束阶段,价格走势似乎有一定的规律性。这种规律并不是偶然的,而是由大型机构的资金流动造成的。

养老金、公募基金等大型机构通常会在固定时间进行资产调整:

  • 月初:新资金流入,需要配置债券资产。
  • 月末:进行月度结算和仓位调整。

图1:债券ETF月度日历效应示意图

基于这个观察,我设计了一个简单的交易思路:

核心交易逻辑

在月初采取看空操作,在月末采取看多操作,每次持仓几天后退出。整个策略只依赖日历,不依赖任何技术指标。

二、策略开发工具介绍

要实现这个策略,我们需要用到Python量化工具。这里我选择的是VectorBT这个开源库。

为什么选择VectorBT?

  • 速度快:采用向量化计算,比传统回测工具快很多。
  • 用法简单:代码简洁,适合初学者上手。
  • 功能全:集成了数据处理、回测、可视化等功能。

图2:Python量化策略回测流程

三、策略实现步骤

第一步:准备环境

首先需要安装必要的Python库:

# 安装vectorbt库 pip install vectorbt
# 导入必要的库import pandas as pd import numpy as npimport vectorbt as vbtimport matplotlib.pyplot as plt

第二步:获取历史数据

从Yahoo Finance下载TLT的历史价格数据:

# 下载TLT从2004年到2024年的数据 tlt = vbt.YFData.download( "TLT", start="2004-01-01", end="2024-12-01" ).get("Close").to_frame() close = tlt.Close 
print(f"数据共{len(close)}个交易日")

第三步:生成交易信号

这是策略的核心部分。我们需要生成四种信号:

# 创建空的信号容器short_entries = pd.DataFrame.vbt.signals.empty_like(close) short_exits = pd.DataFrame.vbt.signals.empty_like(close) 


    
long_entries = pd.DataFrame.vbt.signals.empty_like(close) long_exits = pd.DataFrame.vbt.signals.empty_like(close) 
# 1. 月初看空信号(每月第1个交易日)short_entry_mask = ~tlt.index.tz_convert(None).to_period("M").duplicated() short_entries.iloc[short_entry_mask] = True # 2. 5天后退出看空short_exit_mask = short_entries.shift(5).fillna(False) short_exits.iloc[short_exit_mask] = True # 3. 月末看多信号(月终前7天)long_entry_mask = short_entries.shift(-7).fillna(False) long_entries.iloc[long_entry_mask] = True # 4. 月终前1天退出看多 long_exit_mask = short_entries.shift(-1).fillna(False) long_exits.iloc[long_exit_mask] = True

图3:策略核心代码示例

第四步:执行回测

使用VectorBT的Portfolio功能执行回测:

# 创建投资组合并回测 pf = vbt.Portfolio.from_signals( close=close, entries=long_entries, exits=long_exits, short_entries=short_entries, short_exits=short_exits, freq="1d" ) 
# 查看回测结果print(pf.stats()) pf.plot().show()

四、回测结果分析

经过20年的历史数据回测(2004-2024年),这个简单的日历策略给出了以下结果:

指标
数值
说明
总回报
11850%
20年累计收益
夏普比率
60+
风险调整后收益表现
交易次数
501次
平均每年约25次
盈亏比
1.55
盈利与亏损的比值

图4:策略表现对比

补充说明:夏普比率是衡量策略风险调整后收益的重要指标,数值越高说明策略在承担相同风险的情况下收益越高。一般来说,夏普比率大于2就算不错的策略。

五、策略原理深度解析

为什么这个策略有效?

这个策略的有效性主要来源于以下几个方面:

1. 机构资金的规律性流动

大型机构投资者通常有固定的月度资金流动模式。养老金每月需要支付退休金,保险公司需要处理月度理赔,这些都会影响到债券市场的供需关系。

2. 月度再平衡效应

很多基金产品在月末会进行资产再平衡,卖出表现好的资产,买入表现差的资产,以维持预设的资产配置比例。这会造成月末的资金流动。

3. 季节性因素

债券市场也存在一定的季节性规律,比如某些月份的流动性会特别好或特别差。

图5:策略综合指标评估

六、策略优缺点分析

优点
缺点
逻辑简单,易于理解和实现
依赖特定的市场环境
不需要复杂的技术指标
可能在某些年份表现平淡
回测时间长,数据可靠
需要持续关注市场变化
交易频率适中,不会过于频繁
单一标的,分散化不足

七、如何改进这个策略

如果你对策略开发感兴趣,可以考虑以下几个改进方向:

1. 多标的扩展:不局限于TLT,可以测试其他债券ETF,比如IEF(中期国债)、SHY(短期国债)等。

2. 动态参数优化:使用滚动窗口进行参数优化,让策略参数能够适应市场变化。

3. 加入风险控制:增加止损逻辑、仓位管理等风险控制模块。

4. 结合其他信号:将日历效应与其他信号结合,比如波动率、宏观经济数据等。

风险提示:本文介绍的方法仅供学习和研究参考,不构成任何投资建议。市场有风险,决策需谨慎。过去的表现不代表未来的结果。

八、学习量化交易的建议

如果你想系统地学习量化交易,可以按照这个路径进行:

1. 学习Python基础:掌握pandas、numpy等数据处理库。

2. 理解金融市场:学习基本的金融知识和交易原理。

3. 掌握回测方法:学会使用VectorBT、backtrader等工具。

4. 研究策略逻辑:从简单的策略开始,逐步深入。

5. 实盘模拟:在模拟环境中测试策略。

6. 持续学习:关注市场变化,不断优化策略。

九、观点总结

本文介绍了一个基于日历效应的债券ETF交易策略,该策略利用月初月末的机构资金流动规律进行交易。条目式总结如下:

  • 日历效应是量化交易中一个简单但有效的策略类型。
  • VectorBT是Python量化回测的强大工具,适合初学者。
  • 策略的核心是发现市场中的规律性现象。
  • 任何策略都需要充分测试和风险评估。
  • 保持学习心态,持续优化交易系统。

量化交易不是一夜暴富的捷径,而是需要长期学习和实践的专业领域。希望这篇文章能给你一些启发。如果你对量化交易感兴趣,欢迎关注我的公众号,后续我会分享更多实用的策略和工具。

风险提示:本文仅供参考,不构成投资建议。投资有风险,入市需谨慎。

版权声明:本文为原创内容,转载请注明出处。

#量化交易 #Python #债券ETF #日历效应 #VectorBT #策略回测 #金融编程 #老余捞鱼

图片


微信号 | 老余捞鱼


www.LaoYuLaoyu.com
图片
财神都在点赞
请用您发财的手:分享、推荐和♥,谢谢!
图片



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/191147