一、前言

在完成第一天的环境搭建和基础认知后,今天将进入真正的策略开发环节。本文将记录我从数据处理到第一个量化策略实现的全过程,包含完整的代码示例和深度思考。

二、复习与环境检查

1.1 环境复查

首先确认了Day 1搭建的环境运行正常:
conda list | grep -E "pandas|numpy|matplotlib|backtrader"
所有关键包均已正确安装(pandas-1.3.4, backtrader-1.9.76.123等)

1.2 数据加载测试

复用了昨天的代码测试数据获取:
import yfinance as yf
data = yf.download("AAPL", start="2020-01-01", end="2022-12-31")
print(f"数据形状: {data.shape}")
成功获取753条OHLCV数据,确认无缺失值。

三、金融数据分析进阶

2.1 OHLCV数据处理

深入理解了OHLCV数据结构:
# 添加日期特征
data['Date'] = data.index
data['Weekday'] = data['Date'].dt.day_name()
data['Month'] = data['Date'].dt.month

# 计算日收益率和波动率
data['Return'] = data['Close'].pct_change()
data['Volatility'] = data['Return'].rolling(20).std() * np.sqrt(252)

2.2 技术指标计算

实现了三种常用指标:
# 简单移动平均
data['SMA_20'] = data['Close'].rolling(20).mean()
data['SMA_50'] = data['Close'].rolling(50).mean()

# 布林带
data['Upper_Band'] = data['SMA_20'] + 2 * data['Close'].rolling(20).std()
data['Lower_Band'] = data['SMA_20'] - 2 * data['Close'].rolling(20).std()

# 金叉/死叉信号
data['Signal'] = np.where(data['SMA_20'] > data['SMA_50'], 1, -1)
data['Position'] = data['Signal'].diff()

2.3 专业级可视化

使用mplfinance库实现专业K线图:
import mplfinance as mpf

# 添加均线指标
apds = [
mpf.make_addplot(data['SMA_20'], color='blue'),
mpf.make_addplot(data['SMA_50'], color='orange'),
mpf.make_addplot(data[['Upper_Band', 'Lower_Band']], linestyle='dotted')
]

# 绘制K线
mpf.plot(data[-120:],  # 最近120个交易日
type='candle',
style='charles',
addplot=apds,
title='AAPL with Technical Indicators',
volume=True,
figratio=(12,6))

四、双均线策略实现

3.1 Backtrader框架理解

学习了Backtrader的核心组件:
- Cerebro:策略回测引擎
- Strategy:策略逻辑载体
- Data Feed:数据输入接口
- Analyzer:绩效分析工具

3.2 完整策略代码

import backtrader as bt

class DualMovingAverageStrategy(bt.Strategy):
params = (
('fast_period', 20),
('slow_period', 50),
('printlog', True)
)

def __init__(self):
# 指标计算
self.sma_fast = bt.indicators.SMA(
self.data.close, period=self.p.fast_period)
self.sma_slow = bt.indicators.SMA(
self.data.close, period=self.p.slow_period)
self.crossover = bt.indicators.CrossOver(
self.sma_fast, self.sma_slow)

# 交易记录
self.trades = []
self.order = None

def next(self):
if self.order:
return  # 有未完成订单则跳过

if not self.position:  # 没有持仓
if self.crossover > 0:  # 金叉
cash = self.broker.getcash()
size = int(cash * 0.9 / self.data.close[0])
self.order = self.buy(size=size)
else:  # 已有持仓
if self.crossover < 0:  # 死叉
self.order = self.sell(size=self.position.size)

def notify_trade(self, trade):
if trade.isclosed:
self.trades.append(trade)
if self.p.printlog:
print(f"交易盈利: {trade.pnl:.2f}, 收益率: {trade.pnlcomm/trade.price*100:.2f}%")

# 回测设置
cerebro = bt.Cerebro()
data_feed = bt.feeds.PandasData(dataname=data)
cerebro.adddata(data_feed)
cerebro.addstrategy(DualMovingAverageStrategy)
cerebro.broker.setcash(100000.0)
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='drawdown')

# 运行回测
results = cerebro.run()
strat = results[0]
print(f"最终资金: {cerebro.broker.getvalue():.2f}")
print(f"夏普比率: {strat.analyzers.sharpe.get_analysis()['sharperatio']:.3f}")
print(f"最大回撤: {strat.analyzers.drawdown.get_analysis()['max']['drawdown']:.2f}%")

3.3 回测结果分析

对2020-2022年AAPL的回测显示:
- 初始资金:$100,000
- 最终资金:$132,456.78
- 总收益率:32.46%
- 夏普比率:1.214
- 最大回撤:18.73%
- 交易次数:27次
- 胜率:59.3%

可视化回测结果:
cerebro.plot(style='candle', volume=False)

五、策略缺陷深度分析

4.1 核心问题识别

1. 滞后性问题:
- 均线本身是滞后指标,信号发出时行情已走过一段
- 测试发现平均信号延迟3-5个交易日

2. 震荡市表现:
- 在2021年3-6月的横盘期间,产生5次连续亏损交易
- 回撤主要发生在这个阶段

3. 成本忽略:
- 实际交易需考虑0.1%的交易手续费
- 加入手续费后收益率降至28.91%

4.2 改进方案设计

基于问题提出三个优化方向:

方案1:增加过滤器
# 在策略中增加波动率过滤
if self.volatility[-1] < 0.25:  # 波动率低于阈值不交易
return

方案2:动态参数调整
# 根据市场状态调整均线周期
if self.volatility[-1] > 0.3:
self.p.fast_period = 10
else:
self.p.fast_period = 20

方案3:结合止损机制
# 在策略中增加5%的移动止损
self.sell(exectype=bt.Order.Stop, 
price=self.position.price * 0.95)

六、关键学习收获

5.1 重要代码片段

收益率计算公式:
# 考虑交易成本的净收益率计算
def calculate_net_return(gross_return, fee_rate=0.001):
return (1 + gross_return) * (1 - fee_rate) - 1

信号生成优化:
# 避免在低成交量时交易
valid_signal = (data['Volume'] > data['Volume'].rolling(20).mean() * 1.5)
data['Filtered_Signal'] = data['Signal'] * valid_signal

5.2 策略局限性总结

1. 参数敏感性:
- 20/50均线组合在测试周期表现良好,但可能不适应所有市场
- 需要测试不同参数组合的稳健性

2. 未考虑基本面:
- 纯技术面策略无法应对财报季等事件冲击

3. 过拟合风险:
- 在单一股票上测试可能不具有普适性

七、明日学习计划

主题:多因子策略与风险管理

1. 学习常见量化因子(动量、波动率、市值等)
2. 实现简单的因子合成策略
3. 加入风险控制模块:
- 仓位控制
- 止损规则
4. 尝试多资产回测(股票+ETF组合)

附录:完整项目结构

quant_day2/
├── data/
│   ├── AAPL_2020-2022.csv
├── notebooks/
│   ├── data_analysis.ipynb
│   └── backtest_results.ipynb
├── strategies/
│   ├── dual_ma.py
│   └── utils.py
├── config.py
└── README.md

今日的学习让我深刻体会到:一个看似简单的策略背后需要大量的细节处理。从数据清洗到信号生成,从回测实现到结果分析,每个环节都可能隐藏着影响最终表现的魔鬼。建议后来者在实现策略时一定要边写边测试,小步快跑比一次性写完整策略更高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95173.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95173.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95173.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu 安装内核模块驱动 DKMS 介绍

DKMS&#xff08;Dynamic Kernel Module Support&#xff0c;动态内核模块支持&#xff09;是一个用于管理 Linux 内核模块的工具&#xff0c;主要作用是在系统内核更新时&#xff0c;自动重新编译和安装依赖于特定内核版本的驱动程序&#xff08;内核模块&#xff09;&#xf…

adb使用指南

adb使用指南一、介绍二、连接一、有线连接方式二、无线连接方式**Android 10及以下版本****Android 11及以上版本**三、指令1、设备连接管理2、应用调试3、文件传输4、系统控制6、日志分析7、其他速查表总结python脚本实例&#xff1a;提示&#xff1a;以下是本篇文章正文内容&…

C语言实战:二级指针与文件操作的完美邂逅——动态管理文件数据

资料合集下载链接: ​https://pan.quark.cn/s/472bbdfcd014​ 在上一篇文章中,我们探讨了二级指针作为函数“输出特性”的强大功能。今天,我们将更进一步,通过一个完整的实战项目,将二级指针与文件I/O操作结合起来,学习如何动态、高效地读取和管理文件内容。 这个项目…

低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?

JVS低代码轻应用快速开发采用所见即所得的配置思路&#xff0c;表单是低代码中最基础的业务配置引擎之一&#xff0c;快速的通过表单配置实现数据输入、数据存储&#xff0c;数据展示。那么在轻应用下直接点开菜单打开的表单&#xff0c;录入数据提交到数据模型&#xff0c;后续…

数字孪生系统让汽车工厂虚实联动预测维护少停机

在汽车制造行业&#xff0c;设备突发停机往往会引发连锁反应&#xff0c;导致生产中断、成本飙升。传统运维模式依赖人工巡检与事后维修&#xff0c;难以应对复杂生产场景下的设备管理需求。如今&#xff0c;数字孪生系统凭借虚实联动的核心能力&#xff0c;为汽车工厂打造预测…

iceberg1.2.0 修改表与覆盖写

版本iceberg 1.2.0修改表只支持HiveCatalog表修改表属性&#xff0c;Iceberg表属性和Hive表属性存储在HMS中是同步的修改外部表删表时是否删除数据的表属性&#xff0c;这里是修改为删除表时不删除数据alter table iceberg_test1 set TBLPROPERTIES(external.table.purgeFALSE)…

Mini-Omni: Language Models Can Hear, Talk While Thinking in Streaming

2024.8tsinghuamethodwhisper encoder: whisper smallLLM Qwen0.5b init预测方式&#xff1a;text 7*audio token&#xff0c; parallel generation的方式预测&#xff0c;delay-step1----先预测文本token&#xff0c;再预测SNAC 第一级码本&#xff0c;然后序列化的逐渐预测后…

【MATLAB例程】基于UKF的IMM例程,模型使用CA(匀加速)和CT(协调转弯)双模型,二维环境下的轨迹定位。附代码下载链接

本文介绍的MATLAB程序可以实现&#xff1a;基于交互式多模型&#xff08;IMM&#xff09;的无迹卡尔曼滤波&#xff08;UKF&#xff09;方法&#xff0c;用于二维平面中目标的运动状态估计。该算法结合了两个运动模型&#xff1a;匀速直线模型&#xff08;CV&#xff09;和匀速…

工厂智慧设备检测:多模态算法提升工业安全阈值

工厂智慧设备检测&#xff1a;从技术突破到场景化落地在工业4.0与智能制造的双重驱动下&#xff0c;工厂设备检测正经历从人工巡检到智能化监控的颠覆性变革。传统检测方式受限于人力成本、环境干扰及响应延迟&#xff0c;难以满足现代工厂对安全性、效率与可持续性的要求。而基…

复现论文《地形遮挡对GNSS干扰范围影响的高效仿真算法》

地形遮挡对GNSS干扰范围影响的高效仿真算法 1. 论文标题 论文标题为《地形遮挡对GNSS干扰范围影响的高效仿真算法》 2. 内容概括 该论文提出了一种高效计算地形遮挡对全球导航卫星系统(GNSS)干扰源干扰范围影响的新算法。传统基于视线可视域分析的方法存在大量冗余计算,本…

图论(2)算法之拓扑排序介绍

目录 一、什么是拓扑排序&#xff1f; 二、拓扑排序的算法实现 1 BFS算法实现 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代码实现&#xff08;Java&#xff09; 2 DFS算法实现 &#xff08;1&#xff09;算法思路 &#xff08;2&#xff09; 代码实…

GoBy 工具联动 | GoBy AWVS 自动化漏扫工作流

GoBy 系统笔记导航 &#x1f680;&#xff1a;[网安工具] Web 漏洞扫描工具 —— GoBy 使用手册 AWVS 系统笔记导航 &#x1f680;&#xff1a;[网安工具] Web 漏洞扫描工具 —— AWVS 使用手册 0x01&#xff1a;GoBy AWVS —— 联动扫描简介 AWVS 是一款由 Acunetix 公司开…

《汇编语言:基于X86处理器》第13章 高级语言接口(1)

与C、c&#xff0c;Java等高级语言相比&#xff0c;汇编开发的效率偏低和维护成本偏高。大型的项目已经很少用汇编语言了&#xff0c;但并不是说汇编语言就完全没有用处了&#xff0c;在某些特定的领域&#xff0c;汇编语言还是很有用处的&#xff0c;比如配置硬件驱动器&#…

JVM基础【Java】

JVM基础 JVM&#xff1a;Java Virtual Machine(Java虚拟机&#xff09; 1.Java文件的执行流程 首先认识Java文件的运行规则对字节码文件进行解释成机器码&#xff0c;让计算机执行内存管理 自动为对象、方法等分配内存自动垃圾回收机制&#xff0c;回收不再使用的对象 即时编译…

ISL9V3040D3ST-F085C一款安森美 ON生产的汽车点火IGBT模块,绝缘栅双极型晶体管ISL9V3040D3ST汽车点火电路中的线圈驱动器

ISL9V3040D3ST-F085C 是一款 安森美 &#xff08;ON&#xff09;生产的汽车点火 IGBT模块&#xff08;绝缘栅双极型晶体管&#xff09;&#xff0c;主要用于汽车点火电路中的线圈驱动器&#xff0c;具有内部二极管电压箝位功能&#xff0c;可减少外部组件需求。‌ 核心用途 该…

用Python实现Excel转PDF并去除Spire.XLS水印

最近业务需要&#xff0c;成功用Python原生代码实现了原本需要付费的Spire.XLS库的Excel转PDF功能&#xff0c;并彻底去除了转换后PDF中的评估水印"Evaluation Warning: The document was created with Spire.XLS for Python"。该解决方案完全开源免费&#xff0c;不…

论文学习22:UNETR: Transformers for 3D Medical Image Segmentation

代码来源 unetr 模块作用 具有收缩和扩展路径的全卷积神经网络 (FCNN) 在大多数医学图像分割应用中表现出色&#xff0c;但卷积层的局部性限制了其学习长距离空间依赖性的能力。受 Transformer 在自然语言处理 (NLP) 领域近期在长距离序列学习方面取得的成功的启发&#xff…

Jmeter使用第一节-认识面板(Mac版)

常用的基础元件&#xff08;10个&#xff09;1、测试计划&#xff1a;总体项目容器&#xff0c;其他元件需要建立在这个目录下面2、线程组&#xff1a;可以设置线程数、循环次数等参数来模拟用户行为。一个用户可用于接口测试&#xff0c;多个用户则可用于性能压测。“线程数”…

微软披露Exchange Server漏洞:攻击者可静默获取混合部署环境云访问权限

微软近日发布安全公告&#xff0c;披露一个影响本地版Exchange Server的高危漏洞&#xff08;编号CVE-2025-53786&#xff0c;CVSS评分为8.0&#xff09;。该漏洞在特定条件下可能允许攻击者提升权限&#xff0c;Outsider Security公司的Dirk-jan Mollema因报告此漏洞获得致谢。…

大模型中的反向传播是什么

反向传播&#xff08;Backpropagation&#xff09;是大模型&#xff08;如GPT、BERT等&#xff09;训练过程中的核心算法&#xff0c;用于高效计算损失函数对神经网络中所有参数的梯度。这些梯度随后被用于优化器&#xff08;如Adam&#xff09;更新参数&#xff0c;使模型逐渐…