ARTICLE DETAIL

资讯详情

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

ptrade量化交易入门:从新建策略到模拟交易的全流程指南

ptrade量化交易入门:从新建策略到模拟交易的全流程指南 刚接触ptrade量化交易的朋友大概率都有过这样的困惑我明明会用Python写买卖逻辑为什么要用ptrade这套环境直接在本地写脚本调用行情数据、再写个自动下单不行吗等真正上手ptrade之后我才明白量化交易远不是写代码这么简单背后牵扯到数据获取的稳定性、回测撮合的可信度、实盘交易通道的合规性这三个环节任何一个靠个人去独立解决都够折腾半年。ptrade把这三件事打包成了一个终端工具这也是我决定在量化系列第1期里先讲新建策略、新建回测、新建交易这三个基本动作的原因——先把一条主链路跑通后面谈策略逻辑、谈参数优化才有载体。这一期内容我会从ptrade是什么讲起然后带你完整走一遍写一个最简单策略→跑一次回测→挂上模拟交易的流程。无论你是刚看完Python基础想试试量化的新手还是已经在其他平台写过策略、想迁移到ptrade的开发者这套流程你都绕不开。读完你能搞懂ptrade策略代码的最小骨架是什么、回测参数里的每一项到底在模拟什么、以及从回测切换到实盘时哪些设置不能省。1. 先搞清楚ptrade量化交易定位它到底替你做完了哪三件事1.1 为什么不能直接用本地Python脚本做量化很多自学量化的人第一步会尝试自己写一个完整方案用tushare或akshare拉历史数据用pandas算指标再用自己的逻辑做买卖判断最后打印出一堆交易信号曲线。这个流程做研究、验证想法是没问题的但一旦想往前走一步马上会撞上几堵墙。第一堵墙是数据。tushare、akshare这类公开数据接口免费频次有限分钟级别的历史数据通常不完整复权因子、停牌标记、涨跌停状态这些关键字段经常缺胳膊少腿。回测对数据的完整性要求很高缺一天停牌数据持仓和资金曲线可能就全错了。第二堵墙是撮合。你自己在本地写的回测成交价怎么定、按开盘价还是收盘价成交、碰到涨停买不进怎么处理全凭你个人喜好没有一个公认的模拟撮合引擎帮你把关结果虚高是常态。第三堵墙是实盘。你把信号算出来之后用什么通道下单券商的普通交易终端不会给你提供Python接口个人对接券商柜台API的合规成本和门槛又太高。ptrade解决的就是这三件事。它是一个集行情、研究、回测、模拟交易、实盘交易于一体的量化终端你可以理解成券商柜台给你配了一个经过审核的Python接入环境。1.2 ptrade在量化工具链里的真实位置如果你接触过vn.py、backtrader或者聚宽、米筐这类工具大概能更容易理解ptrade的定位。table: ptrade与其他常见量化工具的对比对比维度ptradebacktrader/vn.py开源框架聚宽/米筐在线平台行情数据内置券商级行情覆盖股票、基金、期货等需自行接入数据源平台内置回测引擎平台自带撮合模型接近真实撮合逻辑需自己配置灵活但容易失真平台自带实盘交易对接券商柜台合规通道个人对接难度高依赖券商开放接口部分支持但依赖合作券商运行环境券商提供的客户端终端图形界面操作完全本地运行自由度高网页端轻量启动上手门槛中低熟练Python即可较高需要理解框架内部机制低适合策略研究真实场景里前三类的用户画像差异很大。用backtrader的人通常是技术型玩家享受自己掌控整个流程用聚宽、米筐的人更偏策略研究需要快速验证想法而ptrade的用户往往是有真实交易需求、资金已经在券商账户里、希望同一个环境里完成回测和实盘切换的人。它图的不光是省事更是策略从研究到上实盘之间那条链路要短、要合规。2. 新建策略ptrade策略代码的最小骨架以及每行代码为什么必须这样写2.1 新建策略文件的入口和目录规划打开ptrade终端登录之后左侧的功能区有策略研究组合管理交易查询这些模块。新建策略要从策略研究进去在左边的目录树里找到一个你想要存放策略的文件夹右键选择新建然后选Python策略。这时候会生成一个模板文件里面已经自带了initialize和handle_data两个方法。这里我想多提醒一句目录规划的事。ptrade策略研究目录支持文件夹建议你按策略名称_策略类型_迭代日期这种格式去建子文件夹比如ma_cross_daily_20250101。量化策略迭代非常快同一个想法可能会改十几版没有目录规划的话一周之后你自己都分不清哪个文件是能跑的最新版。我的习惯是每个策略独立一个文件夹回测和模拟交易时引用的路径严格指向该文件夹避免版本混乱。2.2 initialize和handle_data策略的两个生命周期阶段ptrade的策略代码核心是理解两个方法各自干什么。initialize是初始化方法只在策略启动时执行一次负责设置全局参数、定义股票池、订阅要关注的证券handle_data是主逻辑入口在每个数据周期比如每分钟或每天都会被调用一次。举个例子最简单的双均线策略骨架长这样def initialize(context): # 设置股票池简称为universe set_universe([600000.SS, 000001.SZ]) # 记录一个全局变量用来保存历史收盘价 context.stock 600000.SS context.short_win 5 context.long_win 20 # 打印日志方便在回测中确认初始化是否成功 log.info(策略初始化完成) def handle_data(context, data): # data是当前周期的行情快照可以通过data[context.stock]获取价格信息 # 这里是整个策略的核心每个周期都会执行 log.info(当前处理周期: %s % context.current_dt)initialize里设置的context.stock、context.short_win这些变量会被保存在context对象上handle_data里直接就能用。这是ptrade里面传递全局状态的惯用方式——你不需要return来回传值context就像是策略的背包初始化时往里塞东西运行时随时拿出来。很多人第一次写ptrade策略会犯一个错误试图在handle_data里面重新初始化参数。比如每个周期都把short_win和long_win重新赋一次值。这从逻辑上看不报错但完全没必要而且会埋下状态混乱的隐患。正确做法是不随时间变化的配置放initialize随时间变化的状态放context每周期重新计算的局部变量就在handle_data里直接写。2.3 在策略里做最简单的买入卖出order接口的用法策略的核心是交易。ptrade的下单接口有好几个最常用的是order、order_target、order_value这几个。初学者先把order搞明白就行。def handle_data(context, data): # 获取当前价格 current_price data[context.stock].close log.info(当前价格: %s % current_price) # 如果价格大于10元买入100股 if current_price 10: order(context.stock, 100)order(stock, amount)里面的amount代表股数正数买入负数卖出。它按最新价直接下单没有额外条件。如果你想按目标仓位来下单可以用order_target它的意思是让这只股票的持仓市值达到某个目标值比如order_target(600000.SS, 10000)就是让持仓市值调整到1万元附近。我把下单接口的选择建议列一下方便你在不同场景下快速选型。table: ptrade常用下单函数场景与选择建议接口函数作用适用场景order(stock, amount)按股数下单正买负卖最简单的买卖动作适合学习阶段order_target(stock, amount)调整持仓市值/数量到目标值组合调仓、按目标权重配置order_value(stock, value)按市值下单把固定金额分配出去时更直观order_percent(stock, percent)按总资产的一定比例下单控制单票仓位、风控管理2.4 一个能跑通的最小策略示例把前面几个片段拼起来就是一个完整可回测的最小策略。我把代码贴在这里建议你直接复制到ptrade的策略研究里跑一遍。def initialize(context): set_universe([600000.SS]) context.stock 600000.SS context.bought False def handle_data(context, data): if context.bought: return current_price data[context.stock].close # 简单逻辑价格低于8元就买100股 if current_price 8: order(context.stock, 100) context.bought True log.info(已买入 %s价格 %s % (context.stock, current_price))这个策略没什么实际alpha但它的价值在于把选中股票、判断价格、下单、状态标记这四个步骤串起来了。你回测这段代码能成功出结果说明整个ptrade链路已经通了后面往handle_data里加均线、MACD、布林带都是顺势而为。3. 新建回测参数面板里的每一项实际模拟的是真实交易的什么东西3.1 怎么进入新建回测界面策略代码写好后右键点击策略文件菜单里会出现新建回测或者回测入口。点进去会看到回测配置面板这就是你回测之前要仔细核对的地方。回测面板的字段不算多但每一项都对应着真实交易中的一个关键假设。最核心的是这几个初始资金、回测区间、周期类型、基准、滑点和手续费。初始资金不用多说就是模拟账户里的钱。回测区间要特别注意建议选择覆盖完整牛熊周期的区间比如三年以上这样才能看到策略在单边上涨、震荡下跌、横盘钝化这些典型行情下的表现。如果你只拿最近半年一只强势股的回测结果出来看那基本没有参考价值因为它只验证了策略在特定行情下的表现,没有验证策略本身的鲁棒性。3.2 回测面板关键字段逐项拆解table: 回测参数与真实交易假设对照表参数项设置建议对应真实交易中的含义初始资金建议100万决定下单数量是否受资金约束回测区间3年期以上覆盖不同市场行情的必要条件周期类型日线/分钟线决定handle_data被调用的频率基准沪深300等指数用来对比策略超额收益滑点默认0.1%或按品种设置模拟实际成交价与信号价的偏差手续费佣金万分之三左右真实交易中的交易成本涨跌停约束勾选模拟涨停买不进、跌停卖不出的情况滑点这个东西很多人一开始不懂为什么回测要设它。你设定了价格低于8元买入但真实市场上这个价格不一定马上就有对手盘实际成交价可能比8元高一点点这个差值就是滑点。ptrade的滑点设置模拟的就是这个成本。手续费同理真实交易里佣金、印花税都要从收益里扣除回测不设的话收益普遍虚高。你在看网上的策略回测截图时先问一句这个回测扣了手续费没有很多时候就知道那个漂亮曲线能不能信了。3.3 怎么看回测报告的风险收益指标回测跑完之后ptrade会生成一份报告里面有资金曲线、持仓明细、交易记录、风险指标等。新手往往会第一个去看总收益率这其实是最容易误导人的数字。我一般会按这个顺序看最大回撤、夏普比率、交易次数、胜率、超额收益。最大回撤代表策略最惨的时候亏了多少它直接决定你能不能拿住这个策略。很多人实盘亏损不是策略逻辑问题而是回撤超过了心理承受范围中途手动干预反而做坏了节奏。夏普比率衡量的是每承担一单位风险能换来多少超额回报一般认为大于1算合格大于2就不错了。交易次数反映策略的活跃度交易太少说明机会捕捉可能不足交易太多则要担心手续费和滑点吃掉利润。胜率反而不用太追求高很多赚钱的策略胜率也就四成上下要靠盈亏比来赚总账。3.4 回测里最容易自欺欺人的几个隐患回测是量化研究最重要的验证工具但也是最多人自欺欺人的地方。最常见的坑有三个。第一个是未来函数。比如你在策略里用了当天的收盘价数据来决定当天是否交易但真实交易里收盘价公布时已经收盘了你根本没机会在当天以这个价格下单。ptrade对数据的时序相对严谨但你自己写逻辑时心里要有根弦——handle_data拿到的数据到底是截止到当前周期的数据还是包含未来信息的数据。第二个是幸存者偏差。不管你在哪个平台做回测股票池的选择很重要。如果你自定义股票池只放了一堆现在还在上市、涨得很好的股票那回测收益率天然偏高因为已经退市的股票被过滤掉了。用ptrade的指数成分股做股票池这个问题会小一些。第三个是过拟合。你在历史数据上反复调参终于找出一组让回测收益率很漂亮的参数这大概率是过拟合换一段历史区间就失效。检验方法很简单把样本外区间的数据拿出来再跑一遍如果表现差异很大基本可以判定是过拟合。4. 新建交易模拟交易与实盘之间有哪些必须设置的风控关卡4.1 新建模拟交易的正确姿势回测跑通、指标合格之后下一步不是直接上实盘而是先建一个模拟交易。ptrade的模拟交易会按真实行情实时撮合,体验和实盘几乎一致,但用的是虚拟资金,不会产生任何真实盈亏。新建交易的时候需要选择策略文件、回测参数组、资金账号、交易股票池这些字段其实和回测面板高度重合。我建议模拟交易至少跑两到四周再做结论。原因在于回测是历史数据的事后验证,模拟是实时行情的事前推演,两者对策略执行细节的暴露程度不一样。有些策略在回测里很完美一上模拟就频繁漏单、下单延迟、持仓跟预期不一致这些大概率是执行层面或者数据时序层面的问题必须在模拟阶段暴露出来。4.2 ptrade实盘交易之前必须检查的三处风控设置模拟交易跑顺之后你可以考虑实盘前提是下面三件事已经处理好。第一资金账号绑定要正确。ptrade的实盘交易账号是券商柜台直接对接的你选择的资金账号、股东账号要确保对应到你真实准备交易的那个账户。我见过有人明明想在A账户交易模拟时习惯了同名策略跑到B账户上来回撤单影响节奏。第二仓位和单票权重限制。实盘里建议设置单票最大仓位上限比如总资金的30%避免一次下单过重导致单一股票风险暴露过大。同时要设定每日最大交易次数、最大下单金额防止策略在异常行情下疯狂下单。第三止损止盈机制。ptrade支持云端止损止盈你可以给策略配一个全局的止损线比如账户总权益回撤超过5%就暂停交易或者单票亏损超过8%就强制平仓。这个机制的好处是不依赖策略自身的逻辑相当于一个独立的保险丝。4.3 模拟交易的关键指标执行滑点与成交率模拟交易跑完后你可以去看看模拟交易成交记录,里面除了买卖明细还能看到委托价和成交价的差异。这个差异代表真实市场的滑点损耗。如果成交价普遍比委托价差0.3%以上那你要重新审视策略里的滑点假设。ptrade回测默认滑点设置是多少模拟时真实滑点是否超出假设这两个数据一对比你就能知道策略收益的大头有没有被滑点吃穿。另外要关注挂单成交率。比如策略触发了10次买单实际只成交了6次那说明存在大量想买买不进的情况。这种流动性问题在回测里往往被掩盖实盘一放大就变得很明显。遇到这种情况可以考虑把策略的触发条件适当放宽或者调整下单的限价幅度。5. 新手起步最容易踩的坑几乎每一个我都踩过5.1 改完代码忘了重新保存回测跑的还是老版本ptrade的策略研究是文件式的你修改代码后要确保文件已保存。实际操作里经常有人改了代码逻辑却没保存直接右键文件拉回测然后对着老版本的结果怀疑人生。我的习惯是改完代码立刻按CtrlS然后盯着编辑器顶部的标签页看有没有未保存标记消失。回测开始前顺手在回测面板里看一眼策略文件的修改时间确认是你刚刚编辑的那个版本。这个习惯看着很小关键时候能帮你少走几小时弯路。5.2 日线策略里拿今天的收盘价决定今天的买卖逻辑不成立在日线周期的handle_data里data[stock].close确实能取到当天收盘价但你要想清楚这个close是什么时候确定的。真实交易里收盘价要等收盘之后才知道你不可能在盘中用它来交易。如果你用当日收盘价触发买入信号回测会把这个买入按当日价格撮合那就等于偷看了未来数据。ptrade对这种用法不会报错但结果会虚高。正确做法是日线策略里用前一天的数据计算信号今天开盘后执行或者用今天的盘中实时价格作为判断依据。具体用哪种取决于你策略的频率和逻辑但心里必须有信号数据必须在交易决策之前可得这根弦。5.3 回测参数没有扣手续费和滑点收益曲线漂亮得不敢信不少新手跑回测看到三年三倍的年化兴奋得马上想上实盘。这时候建议先去回测设置里翻一翻看手续费和滑点是不是默认值有没有真正开启。我见过太多回测王者一上模拟就泄气原因几乎都是交易成本没有被合理计入。保守的做法是回测的时候把手续费设置得比真实水平略高一点比如佣金按万五而不是万三滑点按0.2%而不是0.1%。这样做出来的结果还过得去说明策略对交易成本的耐受力比较强实盘才相对安心。5.4 拿分钟线策略刷日线回测结果没有参考价值ptrade支持不同周期回测比如日线、分钟线、tick级别。周期类型选错了策略逻辑可能会完全不同。一个按5分钟均线金叉设计的策略放到日线周期回测handle_data一天才被调用一次你的金叉信号经常錯过最佳交易时机回测结果自然一塌糊涂。选周期之前先明确自己的策略到底是日线级别还是日内级别。如果是日内高频最好用分钟级数据回测并且要关注滑点对收益的侵蚀。如果是日线级别的中低频策略就没必要上分钟线回测速度慢且容易引入噪音。5.5 不重视log.info日志出了问题无从排查ptrade的调试方式主要靠log.info打印日志。很多新手写策略时日志要么全删掉要么只在最后加一行运行完成。真到了回测结果和预期不符的时候你连代码到底执行到哪一步都不知道。我的建议是在initialize、handle_data的关键分支节点、下单动作前后都加上log.info。哪怕是回测阶段这些日志也只会在输出面板里滚动不会影响运行效率。交易上实盘之后这些日志更是你复盘的最重要依据之一——信号什么时候触发、价格当时是多少、为什么这个条件没满足日志一目了然。6. 从零到跑通全流程的个人体会按上面这个流程你已经可以把新建策略→新建回测→新建交易这条主链路完整跑起来了。说一点我个人在整个环节里的体会量化交易最怕的不是策略亏钱而是你搞不清楚策略为什么亏钱。ptrade把行情、回测、交易放在一个终端里最大的价值恰恰在于缩短了市场发生了什么和策略为何这样操作之间的距离——所有行为和决策都有迹可循。对刚接触ptrade的朋友我建议你把这一周的目标定得简单一点不追求写出多复杂的策略就用一个最简单的价格判断逻辑把回测跑通、把模拟交易挂上、把交易日志看懂。这条链路通了之后再往里面加技术指标、加仓位管理、加多股票池都会顺理成章。第2期我会讲一个更贴近实战的话题如何在ptrade里用历史数据计算均线并构建双均线策略到时候会涉及set_universe的进阶用法、历史数据获取函数history和attribute_history的区别、以及如何用order_target做组合调仓。有兴趣的话建议先把今天最小策略里的下单逻辑多跑几遍尤其是多改几组回测参数看看资金曲线怎么变化。这个亲手试错的过程比看任何教程都有用。
返回列表