ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

量化交易学习笔记:从策略回测到zip打包的实战指南

量化交易学习笔记:从策略回测到zip打包的实战指南 简介量化交易的本质是将主观判断转化为可回测、可复现的规则系统而Python则是实现这一过程最常用的工具。从双均线策略的编写到Backtrader回测框架的应用再到数据清洗中未来函数、复权与停牌问题的规避每一步都直接影响策略的真实有效性。基于工程实践视角在掌握回测评估与参数优化方法后量化笔记的交付与管理同样关键涉及依赖环境还原如conda、zip压缩包的解压修复及密码保护等高频场景。本文从基础概念出发串联起量化交易入门到工程落地的完整链路帮助初学者避开常见坑点高效搭建自己的量化学习体系。 前阵子整理硬盘翻出一份自己早年整理的《基于股票量化交易分析的学习笔记.zip》。说实话看到这个文件名的时候我自己都愣了一下因为里面装的远不止几篇文档——那是我从零开始接触量化交易的第一年所有踩过的坑、写废的策略、改了一遍又一遍的回测代码全被压缩在这个zip包里了。后来有不少朋友找我要这份笔记问我能不能把里面的内容拆出来讲讲。我一直觉得单纯把自己整理的代码和数据丢给别人没有意义真正值钱的是这些代码背后为什么这样写的思考过程以及那些文档里不会写的排错经验。所以这次趁着整理学习资料的机会我把这份笔记重新梳理了一遍围绕量化交易的核心环节和日常打交道最多的文件管理问题写成一篇可以反复翻看的实操总结。这篇内容适合谁手里有一点Python基础、想正经学量化但不知道从哪下手的初学者写了几版策略但回测总是看起来很美、实盘就变形的进阶者还有那些习惯了把代码和资料打包成zip文件传递、却总在解压和安装依赖时卡住的朋友。文章不端着也不堆术语我会把每一个关键判断背后的理由都讲明白你照着操作就能跑通第一版策略。1. 先从整体聊聊这套量化学习笔记到底在学什么量化交易这个词这两年特别热但很多人对它的理解还停留在用程序自动买卖股票这个层面。实际上量化交易的核心不是自动化而是把交易逻辑变成可回测、可复现、可迭代的规则系统。我在这份学习笔记的第一章里反复强调一句话主观交易靠感觉量化交易靠统计和纪律。当你把每一个买入卖出决策都拆解成明确的规则——比如当5日均线上穿20日均线时买入——你才可能真正去验证这套规则的历史表现也才有机会在亏损后复盘改进。1.1 量化交易的本质把主观判断翻译成可执行规则我见过很多新手一开始就跑去研究深度学习预测股价结果被数据预处理、特征工程直接劝退。量化交易最稳的入门方式是先搞清楚它的基本架构数据获取、策略生成、回测验证、风险控制、执行交易。这五个环节缺一不可而学习笔记里的内容也严格按这个结构组织。以数据为例一份可靠的行情数据是一切策略的基础但光有价格还不够你还得考虑复权、停牌、涨跌停、交易量异常这些细节。这些在初学者看来是细枝末节的东西恰恰是策略回测能不能反映真实情况的关键。我自己最早写策略时用的全是前复权数据后来发现不同时间段的前复权价格会因分红送股调整而前后不一致导致回测结果出现偏差。后来我改用后复权数据来做计算、在展示时再做价格变换才解决了这个问题。策略生成也不是只有均线金叉这一种玩法。笔记里我把策略分成了趋势跟踪、均值回归、统计套利、事件驱动几个大类每一类背后都有不同的市场假设。比如趋势跟踪假设强者恒强所以用突破、均线这类工具均值回归假设涨多了会跌、跌多了会涨所以用布林带、RSI这类指标。你可以先选一两类自己认可的逻辑去深入研究而不是把市面上所有指标都堆进一个策略里。1.2 从零搭建你的第一套量化工具链先说环境。我的学习笔记最前面就是一份环境搭建清单Python 3.9以上版本、Anaconda或者Miniconda管理虚拟环境、pandas和numpy做数据处理、matplotlib画图。这些都是量化的基本功没必要用太新的版本稳定即可。很多朋友问我为什么不用其他语言我的回答很直接金融数据分析生态里Python的库最全、社区最活跃、遇到问题能搜到的答案最多这就够了。数据源这一块我笔记里对比过几个常用方案Tushare Pro、AkShare、Baostock。个人学习阶段AkShare和Baostock基本够用Tushare Pro需要积分申请但数据质量确实更好。建议一开始就固定一个数据源把获取和缓存数据的代码封装好后面换数据源只需要改一个接口不用满项目改。回测环节我建议先别急着用重型框架而是自己写一个简单的向量化回测逻辑把买卖信号、持仓变化、资金曲线一步步算清楚。当你亲自实现了一遍你才会深刻理解滑点手续费T1规则是怎么影响结果的。等你有感觉了再切换到Backtrader、Zipline这类专业框架。2. 核心策略细节与参数设计一份能跑通的策略代码要关注什么学习笔记里最有价值的部分应该就是那几份可运行的策略代码。双均线策略是我写的第一个策略虽然简单但麻雀虽小五脏俱全。我在这里把完整的实现思路拆开讲你会发现一份能跑的代码和一份能说明问题的代码之间差了很多关键细节。2.1 双均线策略的完整实现与关键参数双均线策略的逻辑非常简单当短期均线从下往上穿过长期均线时买入当短期均线从上往下穿过长期均线时卖出。先上代码这是我笔记里最早一版的雏形import pandas as pd import numpy as np import akshare as ak # 获取股票数据 df ak.stock_zh_a_hist(symbol000001, perioddaily, start_date20200101, end_date20240101, adjustqfq) df.index pd.to_datetime(df[日期]) close df[收盘] # 计算均线 short_ma close.rolling(window5).mean() long_ma close.rolling(window20).mean() # 生成交易信号金叉为1死叉为0 signal (short_ma long_ma).astype(int) position signal.diff().fillna(0) # 计算策略收益 daily_return close.pct_change() strategy_return position * daily_return cumulative_return (1 strategy_return).cumprod() print(f策略累计收益: {cumulative_return.iloc[-1]:.4f})这里有几个细节值得展开。第一signal.diff()的作用是把持仓状态转换成当天是否发生了开仓或平仓动作这样strategy_return才能模拟出只有持仓时才算收益的效果。第二rolling(window5)和rolling(window20)这两个参数不是随便拍的5日和20日分别对应一周和一个月左右的时间跨度在A股市场里有一定的经验意义。第三adjustqfq指定了前复权之前提到过它的坑在分析长周期数据时要注意版本一致性。参数确定之后你可能很快就会发现一个问题不同股票的最优参数完全不同。有的人用5/20有的人用10/60还有的人用30/120。这不奇怪因为不同股票的波动特性不同而双均线策略本身就很依赖周期匹配。所以后续笔记里我专门补了一节参数扫描的代码让程序自动遍历不同的快慢线参数组合把每组的回测结果记下来画成热力图。这种做法不是为了找一个perfect参数去自欺欺人而是为了观察参数在连续邻域内是否都能盈利。如果只有某个孤立的参数点表现极好、周围都是亏损那基本可以断定这个策略有过拟合嫌疑。2.2 动量与均值回归两类核心逻辑的差异与取舍双均线本质上是一种趋势跟随策略它赚的是趋势延续的钱。但在震荡市里趋势策略会被反复打脸于是你会想引入均值回归逻辑。均值回归的核心假设是价格偏离中枢后会回归常用工具是布林带。我在笔记里把这两类策略放在一起对照是因为它们恰好代表了市场两种状态。趋势策略在单边行情里表现优异均值回归策略在震荡行情里更稳定。很多人纠结到底用哪种我的答案是先看你交易的品种和周期。A股日线级别的个股趋势策略相对好用期货的日内高频均值回归或者做市逻辑更常见。你甚至可以做一个简单的市场状态判断——比如用ADX指标衡量趋势强度——来决定当前该用哪套逻辑但这属于进阶玩法初学者先把单一策略做扎实更重要。2.3 数据清洗策略里最容易翻车、却最不被人重视的一块这里必须单独拿出来说因为数据问题引发的策略回测失真是我见过的初学者最常见的翻车点而且往往藏得很深。我统计了一下笔记里记录的bug将近一半跟数据有关。最常见的是未来函数。比如你用当天的收盘价计算信号却在当天开盘就下单成交这等于偷看了未来。严格的做法是信号在T日收盘后产生最早在T1日开盘执行。另一个常见问题是未复权价格在除权除息日产生巨大跳空如果你不处理复权策略可能会把10%的除权跳空误判为暴跌或暴涨产生大量虚假交易信号。还有一个隐蔽问题是停牌股停牌期间没有成交价如果直接用前值填充容易让均线计算失真。我的做法是先把长期停牌的股票过滤掉或者对停牌期间设置持仓不可卖出的约束这样更贴近实际。3. 回测与评估别让你的策略死在参数优化上回测是量化学习里最骗人的一环。我刚学的时候随便调一调参数就能让资金曲线漂亮得不像话年化收益100%以上回撤还能控制在5%以内。后来才知道那都是过拟合加上忽略了成本换来的假象。真正的回测不是为了证明策略有多牛而是为了搞清楚策略在什么条件下会失效。3.1 一个可复现的回测框架怎么搭在笔记里我强烈建议所有人在开始阶段就用Backtrader这类专业回测框架。原因很简单它内置了订单撮合、滑点模型、手续费、多头和空头支持、多策略组合等机制比手写向量化回测更接近真实交易环境。下面是一个Backtrader实现双均线策略的最小示例import backtrader as bt class DoubleMAStrategy(bt.Strategy): params ((fast, 5), (slow, 20),) def __init__(self): self.fast_ma bt.indicators.SMA(self.data.close, periodself.params.fast) self.slow_ma bt.indicators.SMA(self.data.close, periodself.params.slow) self.crossover bt.indicators.CrossOver(self.fast_ma, self.slow_ma) def next(self): if not self.position: if self.crossover 0: self.buy() elif self.crossover 0: self.close() cerebro bt.Cerebro() data bt.feeds.PandasData(datanamedf) cerebro.adddata(data) cerebro.addstrategy(DoubleMAStrategy) cerebro.broker.setcash(100000) cerebro.broker.setcommission(commission0.0003) print(f初始资金: {cerebro.broker.getvalue():.2f}) cerebro.run() print(f期末资金: {cerebro.broker.getvalue():.2f})注意setcommission这一步很多人会忽略或者只设一个象征性的万分之一但A股实际的佣金加印花税成本远高于此。如果你做短线高频交易成本对净收益的吞噬是致命的。我实测下来单边千分之三左右的总成本假设是比较接近现实的起步值。回测框架搭好以后别急着看收益。第一件事是检查成交记录是否和你的交易逻辑一致。我见过不少人回测结果里出现了跌停价买入这种根本不可能成交的记录原因就是没有设置涨跌停过滤。框架只是一个工具它不会替你判断市场规则。3.2 评估指标的解读不只是看年化收益很多初学者拿到回测报告第一眼只看总收益率和年化收益率。这不够至少要同时看四个指标累计收益、最大回撤、夏普比率、胜率。最大回撤衡量的是策略最坏情况下亏多少它决定了你的资金和心理能否扛得住夏普比率衡量的是每承受一单位风险能换来多少超额收益一般认为大于1就算不错胜率则帮你理解策略的盈亏结构。回测报告里的夏普比率通常是用日收益率年化计算的公式大致是年化夏普 日均收益率 / 日收益率标准差 × 年化因子通常取252的开方。这个概念很好理解——它惩罚那些赚得猛但波动大的策略。所以你看策略报告时如果一个策略年化50%但最大回撤却高达40%那它在实盘里的体验会非常煎熬。我的筛选标准是最大回撤超过20%的策略除非收益特别高否则一律不开仓。另一个必须做的是样本外测试。我习惯的做法是把数据分成三段前60%做参数开发中间20%做验证最后20%做最终样本外测试。如果策略在验证段和样本外段的表现明显差于开发段那基本可以判定你调参调过头了。3.3 我踩过的三个大坑第一个是前视偏差。我在用某只股票做测试时不小心用了当天的收盘数据来计算信号然后假设当天就以收盘价成交回测收益率虚高了一大截。后来我养成了习惯所有信号计算都必须基于到T日为止的数据成交一律放在T1。如果你想更严谨回测时还可以引入信号延迟一个bar的设置。第二个是把手续费设得太低。有一段时间我为了让自己开心把佣金设成万分之一结果策略年化瞬间提升了好几个百分点。等到换回正常成本策略直接变成亏损。从那以后我每次回测都会先跑一个带真实成本的对比例子看看策略的成本耐受度。第三个是想让参数完美适配历史。我花了整整一周时间试图找到一组让回测资金曲线最光滑的参数最后找到了一组堪称完美的组合但在后续半年的实盘模拟里一败涂地。后来我才明白参数优化是在和历史数据做拟合拟合过头就是过拟合。正确的思路是寻找参数高原——在较大的参数区间里策略表现相对稳定而不是去抓那一个孤零零的峰值。4. 学习笔记的管理与交付关于zip压缩包的实用手册量化学习笔记积攒到一定程度目录会变得非常庞大Python脚本、数据文件、回测报告、参考文献往往散落各处。这时候把代码和资料整理成压缩包分享给朋友或另一台电脑是再自然不过的事。但用了这么久的zip我发现在解压、加密、文件修复上其实有很多容易被忽视的坑这里单独开一篇讲讲。4.1 为什么量化笔记适合用zip打包以及目录怎么规划用zip分享学习资料最大的优势是跨平台、不需要额外装软件Windows、macOS、Linux上都能直接处理。我的量化学习笔记在打包前会先按固定结构组织目录quant-notes/ ├── data/ # 数据获取脚本与缓存 ├── strategies/ # 策略代码 │ ├── trend/ # 趋势策略 │ └── mean_reversion/ # 均值回归策略 ├── backtests/ # 回测报告与结果图表 ├── notes/ # 学习笔记markdown └── requirements.txt # 依赖清单这样组织有几个好处第一解压后一眼就能定位到对应模块第二别人拿到这份笔记时可以根据目录结构理解知识体系第三requirements.txt可以让对方快速还原运行环境。这里有一个小技巧在打包前先运行一遍pip freeze requirements.txt但建议只保留直接依赖的顶层库避免把环境里所有无关包都带过去。4.2 解压时遇到invalid zip archive和EOCD错误的排查思路你在网上搜索量化资源时或者在从一个不稳定的渠道下载zip包之后经常会碰到类似invalid zip archive: could not find EOCD的报错。这个报错看着吓人其实本质是解压工具没法在文件末尾找到EOCDEnd Of Central Directory记录也就是zip文件的目录索引尾巴。产生这个问题的原因通常是网络传输中断导致文件截断或者是上传时本身就不完整偶尔也有某些云盘客户端生成zip时格式不规范的情况。如果你拿到的是一个明确报错的zip别急着放弃按下面几步排查先看文件大小。用ls -lh file.zip查看如果和你下载页面标注的大小不一致基本就是传输截断。用file file.zip检查文件类型。如果输出不是Zip archive data说明文件头部已经损坏解压工具把它当成了普通数据文件。尝试用zip -FF damaged.zip --out repaired.zip修复。这个命令会尽可能扫描zip文件里的有效数据段重建一个可用的压缩包。zip -FF我实际用过几次对不严重的损坏有一定概率能救回来但如果是头部缺失严重它也无能为力。这也提醒我们在传输重要学习笔记前最好为zip文件附一个MD5或SHA256校验值接收方解压前先校验能省掉很多麻烦。还遇到过一种特殊场景分卷压缩比如搜集量化资料时下载到.zip和.z01这种组合文件。此时必须把所有分卷放在同一目录下并且保持命名顺序然后用常规解压工具打开第一个.zip文件即可。如果你发现解压时提示缺少某个分卷先检查文件名里的序号是不是被改动了比如.z01被误改成了.z02会导致顺序错乱。4.3 zip密码保护与忘记密码后的恢复思路量化学习笔记里常常有自己整理的历史交易记录这些数据属于个人隐私分享时我习惯给zip加一层密码保护。zip加密的常规操作在Windows右键压缩时勾选设置密码即可在Linux下可以用zip -P yourpassword -r encrypted.zip quant-notes/来创建加密包。但说到密码恢复我得多提醒一句zip密码恢复只能针对自己拥有的文件。如果你是忘记了自己设置的密码可以试试以下几类工具一类是暴力破解工具比如hashcat、John the Ripper适合密码较短的情况一类是字典攻击适合用常用密码组合跑还有一类是已知部分字符时的掩码攻击效率会高很多。举个例子如果确定密码是8位纯数字用hashcat跑GPU破解速度可以非常快但如果密码是大小写字母加数字加符号的12位随机密码那几乎不可能靠暴力破解成功。所以我的个人建议是重要zip文件不要依赖密码本身加密文档或者密码管理工具更可靠。同时回忆密码时先试几个常用的变体很多时候不是忘了而是大小写或者符号输入错了。4.4 依赖环境还原GitHub下载的zip怎么装进Conda环境学习笔记里除了markdown和代码还有一个常见的交付形态是从GitHub仓库直接下载的zip源码包比如某些开源量化框架或策略库。下载解压后最稳妥的安装方式是先创建一个独立的conda环境再在该环境里安装项目依赖conda create -n quant python3.10 -y conda activate quant cd /path/to/quant-notes pip install -r requirements.txt如果项目自带setup.py或pyproject.toml可以在项目根目录执行pip install -e .以开发模式安装这样源码和依赖都在同一个环境里改动代码后不需要重新安装。注意不要直接在主环境里pip install -r requirements.txt因为不同项目的依赖版本互相冲突时环境就会被搞乱。我的经验是一个量化项目对应一个conda环境是成本最低的管理方式。5. 从笔记到实盘工具链与后续扩展看完整份学习笔记总会有朋友问我接下来该往哪里走是深入钻研机器学习的预测模型还是转向更专业的量化框架又或者直接开一个模拟盘练手我的答案可能有些反直觉先别急着上更多模型而是把已经验证过的策略跑进模拟盘观察它在真实市场环境里的表现。学习阶段积累的代码最终只有接入自由流通数据和真实行情才能真正校验它的可靠性。5.1 更专业的量化框架qbot等开源项目的引入当你的策略越来越复杂自己维护数据获取、信号生成、撮合、风控、绩效归因这些模块会非常吃力这时候就有必要引入专业的开源量化框架。qbot是我在笔记后期研究过的框架之一它把行情数据、策略回测、模拟交易、绩效分析串成一条完整链路还支持多种数据源适配对想系统化研究量化的人很有参考价值。但我不建议新手一上来就啃全套框架。框架的学习成本不低如果你的策略还用不到它的高级特性强行引入反而会拖慢进度。我的建议顺序是先用轻量级方式把单策略跑通再逐渐补充模块等到策略数量超过三个或者需要对多个策略做组合管理和风险控制时再切换到完整框架。工具永远是为策略服务的不要为了用框架而用框架。另外我始终保留一个习惯在引入新框架前先看它的文档和项目结构。好的开源项目文档一定说明了它的设计哲学和适用场景这一看就能判断和你手头需求的匹配度避免学了一半发现并不适合。5.2 学习资源、灵感来源与长期沉淀方法量化交易是个需要持续输入和迭代的领域。笔记里我整理了一份自己的阅读清单经典的有《海龟交易法则》《量化交易如何建立自己的算法交易事业》进阶的有关于统计套利和机器学习方面的专业书籍。除了书一些量化社区的讨论和开源项目的代码更新也值得关注但建议带着问题去看而不是漫无目的地刷。更重要的一点是把自己的每一次实验都记录下来包括失败的。我的笔记里有一个失败实验目录专门记录上一次为什么错。比如某次回测用了未复权数据导致结果失真某次我忽略停牌导致策略信号密度异常高等。这些记录在每一次重新打开一份旧代码时都会帮上大忙。还有一个小技巧是代码里的版本管理也从第一天就该做起来。就算只用Git记录自己本地的改动也能让你对比不同策略实现的差异而不是靠文件名区分最终版和最终版2。根据我自己的体会量化学习最核心的进度条不在于你掌握了多少高级技术而在于你能否把自己的假设变成一个严格验证过、知道优势也知道软肋的策略。这份学习笔记的zip包对我来说就是这条路上每个脚印的压缩存档。如果你也想梳理出自己的量化学习体系建议从今天开始把代码、数据、笔记和踩坑记录一起装进你自己的一份学习笔记.zip里。本文还有配套的精品资源点击获取
返回列表