第一次打开 ptrade 终端,很多人会愣一下:界面密密麻麻全是功能,左侧菜单一长串,研究、回测、交易、风控全挤在一起,完全不知道该先点哪里。我当时也是这样,拿着券商给的账号登录进去,第一反应是“这玩意儿到底怎么建策略?怎么跑回测?怎么挂上模拟交易?”如果你也是第一次接触 ptrade 量化交易,这个系列就是给你写的。
这第 1 期先解决三个最基础的问题:ptrade 到底是什么、策略文件怎么新建、回测怎么跑起来、模拟交易和实盘交易又该怎么建立。说白了,就是带你走通“从 0 到 1 跑通整个流程”这一步。等你把这三个动作都做了一遍,后面再去研究选股逻辑、择时指标、仓位管理才有意义。先能把工具用顺了,再谈策略好不好,这是一切量化的前提。
1. ptrade到底是个什么东西,跟其他量化工具怎么选
1.1 ptrade的核心定位
很多人把 ptrade 理解成一个“写 Python 的软件”,这个说法没错,但不够准确。ptrade 是恒生电子做的量化交易终端,目前主要部署在券商端,由券商采购后提供给自己的客户使用。也就是说,你想用 ptrade,前提是你有一个已经开通量化交易权限的券商账户,然后通过对应券商下载终端、登录使用。
从功能定位上看,ptrade 把行情、研究、策略编写、回测、模拟交易和实盘交易全部塞进了一个客户端里。你不需要像用开源框架那样自己去接行情数据,不需要自己写撮合逻辑,也不需要考虑服务器部署的问题。它给你的是一套闭环:在终端里写策略,点击回测,看报告,点模拟交易,让策略自动跑,最后在实盘环境里挂上真实账号。对非专业量化团队来说,这个闭环极其省事。
我第一次用的时候最大的感受就是“快”。从写完一个最简单的均线策略,到看到回测报告,整个过程不超过五分钟。这在 backtrader 或者自研框架里几乎不可能做到,光是把数据源、佣金、滑点配置好就够折腾半天。
1.2 和 QMT、backtrader、掘金到底怎么选
不少人有选择困难症,其实不同工具定位差异很大,关键看你的使用场景。
| 工具 | 定位 | 优势 | 短板 |
|---|---|---|---|
| ptrade | 券商端量化终端 | 行情数据、交易通道、回测一体,开箱即用 | 必须通过券商申请,界面相对固定,扩展受限 |
| QMT | 券商端极速交易终端 | 交易速度快,适合对执行效率要求很高的场景 | 策略研究能力相对弱,学习曲线较陡 |
| backtrader | 开源 Python 回测框架 | 免费、灵活、社区大,可自主定制 | 需要自己接数据、自己配交易通道,A股实盘门槛高 |
| 掘金(GoldMiner) | 独立量化平台 | 跨市场支持好,接口清晰 | 很多功能需要收费,实盘对接也依赖券商支持 |
如果你已经确定在券商开户并且能拿到 ptrade 权限,没有特殊理由建议先从 ptrade 开始。它最大的好处是数据和交易通道不需要你操心,代码里传一个股票代码进去,行情数据自然就有。对于新手来说,这点比什么都重要。先学会在平台内把策略跑通,再回头理解数据接口、撮合原理,效率会高很多。
1.3 使用 ptrade 的前置条件
再强调一遍,ptrade 不是下载个安装包就能用的软件。你需要做这几步:
- 在支持 ptrade 的券商开通证券账户,并确认自己符合量化交易权限的准入条件
- 向营业部或客户经理提交申请,签署量化交易相关的协议和风险揭示书,可能还需要完成一次测试评估
- 拿到券商的 ptrade 客户端安装包和账号信息,有的券商会给你一个单独的交易账号,有的直接用资金账号登录
- 确认行情权限,比如 Level-2 行情是否开通,这会影响盘中快照数据的获取
这里面最容易卡住的是权限申请。不同券商对量化交易权限的准入门槛不一样,有的要求资金量,有的要求交易经验,有的会安排专人联系你做一个简单的访谈。不要嫌麻烦,这一步本质上是合规要求,也是对你自己负责。没有权限的话,后面所有工作都没法进行。
2. 动手第一步:新建策略
2.1 找到策略管理入口,新建一个策略文件
打开 ptrade 终端并登录后,先在界面各处找“策略交易”或者“策略研究”这个入口。不同券商的 ptrade 版本界面会略有差异,但核心模块是相同的,一般集中在左侧功能区。我已经习惯把界面切成“策略研究”工作区,因为写代码、跑回测、做模拟都从这儿进来。
新建策略的方法很简单:进入策略研究模块后,找到“新建策略”按钮,点击后会弹出一个窗口让你填策略名称和描述。填写完成后,系统会生成一个 Python 文件模板。这个模板就是你的策略载体,后续所有代码都写在这个 .py 文件里。
第一次跑策略不要求多复杂,先用系统自带的模板把流程走通就好。很多新手一上来就复制一堆复杂代码,报错后完全不知道哪里出了问题,反而不利于建立信心。我的建议是,先跑一个“啥也不干”的空策略,确认整个流程通了,再往里面加逻辑。
2.2 最小可运行的策略模板长什么样
新建出来的默认模板一般会有两个方法,一个是 initialize,一个是 handle_data。下面这个示例是一个最简单的双均线策略,也是我在第一次测试时常用的模板,你可以直接复制到自己的策略文件里跑一下:
def initialize(context): # 选一只股票作为观察标的 g.security = '000001.SZ' # 设置均线参数 g.short_win = 5 g.long_win = 20 # 设定股票池 set_universe([g.security]) # 设置交易成本,包含印花税和佣金 set_order_cost( OrderCost( open_tax=0.001, # 买入印花税,A股目前买入不收 open_commission=0.0003, # 买入佣金 close_tax=0.001, # 卖出印花税 close_commission=0.0003 # 卖出佣金 ), type='stock' ) # 设定基准指数,用来对比策略表现 set_benchmark('000300.SH') def handle_data(context, data): # 获取长周期收盘价序列 prices = get_history(g.long_win, '1d', 'close', g.security, fq='pre') if len(prices) < g.long_win: return # 计算短均线和长均线 ma_short = prices[-g.short_win:].mean() ma_long = prices[-g.long_win:].mean() # 获取当前价格和当前仓位 current_price = get_current_data()[g.security].last_price current_position = context.portfolio.positions[g.security].total_amount # 金叉买入,死叉卖出 if ma_short > ma_long and current_position == 0: order(g.security, 100) elif ma_short < ma_long and current_position > 0: order_target(g.security, 0)这个策略的逻辑很简单:短均线从下方穿过长均线时买 100 股,短均线从上方跌破长均线时清仓。代码里有几个函数是 ptrade 的核心 API,新手一定要知道它们各管什么。
2.3 initialize、handle_data 和常用API都是干嘛的
initialize 方法是策略启动时执行的初始化函数,只在策略启动时运行一次。它里面通常放全局变量设置、股票池设定、手续费设定、基准设定等一次性工作。比如 g.short_win = 5 就是把你定义的参数挂在全局对象 g 上,这个 g 对象会在整个策略周期里共享数据,专门用来存跨函数调用的变量。
handle_data 方法是策略的主体,它会按你新建策略时选择的周期被反复调用。这里有个很容易踩的坑:如果你选择了日线周期,handle_data 每天收盘后调用一次(不同券商终端的具体触发时点可能不同);如果你选择了分钟周期,它就会按分钟触发。很多新手在日线周期策略里写了基于 1 分钟数据的逻辑,结果发现策略根本没法按预期跑,就是因为这个调用机制没搞清楚。
模板里用到的几个 API 我再啰嗦一下,因为你后面会频繁遇到:
- get_history:获取历史行情数据,参数依次是周期数、K线类型、字段、股票代码、复权方式。复权参数 fq 很重要,不设或者设错了,计算结果会差很多。
- get_current_data:获取当前最新行情快照,返回的是一个字典对象,里面包含 last_price、high_limit、low_limit、paused 等字段。涉及到涨跌停、停牌判断的时候非常有用。
- order / order_target:下单函数,order 是按数量下单,order_target 是调整到目标仓位。比如 order_target(g.security, 0) 就是把这支股票仓位清到 0,也就是全卖。实盘模式下这些函数会把指令发给券商柜台,所以代码里每个函数都要认真核对参数。
- set_universe:设定股票池,告诉策略系统你关注的股票范围。有些数据接口只能取股票池以内的数据,所以这个设定要尽量只放自己真正需要的股票,放太多股票会拖慢回测速度。
- set_order_cost:设置交易成本,包括佣金、印花税、过户费等。A股和港股的费率规则不一样,做模拟盘或实盘前一定要确认自己的佣金费率是哪档,闭着眼睛用默认值容易导致回测结果偏离实际情况。
- set_benchmark:设定基准指数,回测报告里会拿你的策略收益和基准指数对比。一般用沪深300(000300.SH)或者中证500(000905.SH)。
2.4 周期选择:日线还是分钟线
新建策略文件的时候,系统通常会让你选择策略的周期,常见的是“日线”和“分钟线”。不要小看这个选项,它直接决定了 handle_data 的调用频率,也决定了 get_history 获取数据的粒度。
日线周期适合中低频策略,比如持仓几天甚至几周的均线策略、趋势跟踪策略。这类策略对执行时点要求不高,每天收盘后看一次行情就够了,也不容易被盘中噪音干扰。
分钟线周期适合日内交易或者对进场时点要求较高的策略。但分钟线的数据量比日线大很多,回测时间会成倍增加,而且对数据权限有要求。如果你没有开通分钟级数据权限,哪怕代码写得再对,回测时也会提示数据缺失。
我的建议是:新手阶段先从日线周期开始,把整体流程跑通了,再考虑分钟级策略。这就像学开车,先上了大路跑直道,再进市区练复杂路况。
3. 回测怎么建,报告怎么看
3.1 新建回测的完整步骤
策略写完以后,最关键的一步是回测。在 ptrade 里,回测入口一般在策略文件编辑界面的上方或者右侧,有一个“回测”按钮。点击之后会弹出回测参数设置窗口,里面有几项配置需要你设置清楚:
- 策略名称:默认是当前选中的策略文件,你可以单独给这次回测起个名字,方便后期对比不同参数版本
- 回测时间范围:起止日期决定了策略在这段时间内的表现。一般建议至少包含一段牛市和一段熊市,比如从 2018 年到 2023 年,横跨牛熊才能看出策略的真实水平
- 初始资金:模拟起始资金,一般填 100 万,主要是方便按百分比计算收益和仓位
- 基准指数:用于对比,默认和代码里的 set_benchmark 保持一致
- 交易成本设置:有些 ptrade 版本在回测设置里直接提供佣金、印花税、滑点的输入框,如果代码里已经通过 set_order_cost 设置过了,以代码为准
- 滑点设置:这是很多人忽略的选项。滑点可以简单理解成实际成交价格和看到价格之间的偏差,一般按固定值或者比例设置,建议不要设成 0,太理想化的成交模拟容易高估收益
设置完成后点击“确定”或“开始回测”,终端就会开始跑回测。日线级别的策略,假设回测区间是 5 年,一般几秒钟到几十秒钟就能出结果。如果跑了几分钟还没结束,多半是代码里循环写得太重,或者股票池里放了太多股票。
3.2 回测参数怎么设置才算合理
我看到太多新手在回测设置里直接把滑点设为 0,佣金设为 0,跑出来收益很漂亮,一到模拟盘就爆亏。这不是策略的问题,是回测环境太理想化的问题。
回测的目的是“尽量接近真实地检验策略逻辑”,如果你把成本全部抹掉,那你检验的其实不是策略的赚钱能力,而是理想世界里的幻觉。我个人的习惯参数如下:
- 佣金:按万分之三设置,这是目前多数券商的实际佣金水平
- 印花税:卖出时千分之一,这个是国家统一规则,没有商量余地
- 滑点:设 0.002 或者按价格乘以千分之二计算,A股流动性较好的股票一般不会出现太大的滑点,但这个值能模拟出实际的交易冲击成本
- 最低佣金:有的平台支持设置单笔最低佣金,通常是不足 5 元按 5 元收,回测里最好也打开这个限制
这里有一个小经验:回测收益如果因为关闭了佣金和滑点而显著变化,说明策略本身可能在做非常高频的交易。交易频率越高,成本占比就越敏感,这种策略到了实盘环境往往很难赚到钱。反过来,如果一个策略在设置了完整费率后依然正收益,那它至少具备继续验证的基础。
3.3 回测报告的核心指标解读
回测跑完以后,ptrade 会生成一份报告,里面有收益曲线、回撤曲线、月度收益表和一些统计指标。新手最常犯的错误是只看“总收益率”,看到收益高就认为策略赚钱。这个习惯非常危险。
你需要重点关注的指标是这几个:
最大回撤代表策略在某一时点从最高点到最低点跌了多少,这个数字直接决定了你的心理承受能力和资金承受能力。如果回撤达到 40%,意味着你手里 100 万资金曾经变到 60 万。很多人实盘扛不住,不是策略不赚钱,而是中途被震出去了。
夏普比率可以简单理解成“每一份风险能换来多少收益”,数值大于 1 说明策略风险收益比还可以,大于 2 就算优秀。但要注意,夏普比率是基于历史数据计算的,样本区间短或者市场风格切换频繁的时候,这个数字的参考价值会打折扣。
胜率和盈亏比要结合起来看。有的策略胜率只有 30%,但每次赚的时候赚很多、亏的时候亏很少,总账照样赚钱;有的策略胜率 80%,但偶尔亏一次就吃掉大半利润。不要只盯着胜率。
年化收益率和总收益率也有区别。总收益率是区间整体收益,年化收益率是把收益折算到一年的水平。区间越长,年化和总的差距越大。比如 5 年总收益 43%,折算成年化才 7% 左右,这个水平并不算高。
3.4 回测容易犯的坑
回测结果好,并不代表实盘能赚钱。这句话我说多少次都不为过。回测环节有几个典型问题:
未来函数。这是最常见的“隐形杀手”。比如你用当天的收盘价决定当天买入,但实际上当天收盘以后才能看到收盘价,真正下单已经晚了。有些新手写代码时不小心用到了当时还拿不到的数据,回测结果自然虚高。
幸存者偏差。如果你构建股票池时只在“现在还存在于市场上的股票”里选,那等于默认避开了退市股和暴跌股,回测数据当然好看。解决方法是使用平台提供的历史成分股数据,或者至少用全市场股票池再叠加筛选条件。
过拟合。反复在同一个时间段里调参数,调到收益曲线完美,这种情况在所有策略框架下都存在。一个策略参数换一个时间段就失效,往往就是过拟合了。建议把数据切成训练段和验证段,先用训练段调参,再用验证段检验。
这些坑不是一次两次就能完全规避的,但你在看回测报告时至少要保持怀疑态度:收益太漂亮的时候,先想想是不是哪里把成本算漏了,或者哪段数据用错了。
4. 从回测到模拟交易再到实盘交易
4.1 模拟交易怎么建
回测通过以后,下一步是建立模拟交易。这也是新手经常搞不清楚的地方:回测和模拟交易到底有什么区别?打个比方,回测是拿历史数据的“录像带”回放你的策略,看看过去几年它表现如何;而模拟交易是让策略从现在开始,以当时的行情实时运行,按照真实信号自动下单,只不过这笔“交易”使用的是模拟资金,不会真实成交。
在 ptrade 中,建立模拟交易的入口在策略文件的“模拟交易”或“仿真交易”按钮。点击后会让你设置策略名称、初始资金、运行周期等参数。确认后,策略就开始在终端后台等待行情触发。注意,模拟交易会消耗系统资源,如果你没有主动停止它,它会一直挂着。
模拟交易建立后,你可以在交易日志里看到策略每一次买入卖出的动作、成交价格、成交数量。这个日志非常宝贵,建议新手养成每天查看的习惯。
4.2 模拟盘和实盘最核心的差异
模拟盘跑得风生水起,不代表实盘一定行。这不是吓唬你,而是两者之间确实存在几个很现实的差异。
第一,成交撮合机制不同。模拟盘的撮合往往是“看到价格就成交”,不真实考虑盘口深度和流动性。遇到成交量很小的股票,模拟盘你能轻松买到,实盘可能一挂单就瞬间打穿好几个价位,或者根本成交不了。
第二,时点延迟不同。模拟盘通常会基于最新快照价格立即计算信号并成交,但实盘从信号产生、下单指令发出、到达柜台、再到达交易所,每一步都有延迟。这种延迟在分钟级策略上影响尤其大。
第三,心理状态完全不同。模拟盘亏了不心疼,实盘亏了会影响判断和操作。很多策略在模拟盘上能严格执行纪律,到了实盘,看到浮亏就开始手动干预,最后策略形同虚设。
所以我强烈建议,模拟盘至少稳定运行一到两周,确认策略没有报错、持仓符合预期、成交情况和回测假设差异不大,再考虑上实盘。很多人因为模拟盘跑得好就急着上实盘,结果前三天就遇到各种问题,反而打击信心。
4.3 转实盘前必须做的检查清单
从模拟交易切换为实盘交易前,建议对照这个清单逐一检查:
- 策略仓位管理逻辑是否清晰,单笔下单量是否合理,不能出现一次买入动用全部资金的情况
- 是否处理了涨跌停和停牌情况,如果股票停牌,策略还去下单,会导致报错或者持仓数据异常
- 手续费计算是否和券商真实费率一致,佣金最低收费标准是否已经计入
- 策略是否在极端行情下有自我保护机制,至少应该设置止损条件或者退出条件
- 是否清楚如何手动停止策略,防止策略出错时无法及时干预
- 是否设置了交易日志记录,方便事后复盘
- 小资金跑几天验证,别一上来就放大量资金
实盘交易一旦开启,你就要对每一笔下单负责。策略代码是定时自动执行的,如果没有做好异常处理,一个小 bug 就可能在开盘瞬间造成不可控的后果。所以新手阶段哪怕模拟盘跑得很好,实盘也建议先用最小仓位起步。
5. 新手最容易踩的坑和排查技巧
5.1 常见报错和问题速查表
以下是我自己在使用 ptrade 过程中遇到过的问题,整理出来供大家参考:
| 现象 | 可能原因 | 处理方法 |
|---|---|---|
| 回测提示“没有数据” | 股票代码格式不对、股票还没上市、复权参数有误 | 检查代码是否为 6 位数字加市场后缀(如 .SZ、.SH),换个时间段再试 |
| 策略一直不触发买入 | 均线条件始终不满足,或者仓位判断写错 | 在 handle_data 里加 log.info 输出均线值和仓位,观察变量的实际变化 |
| 下单失败,提示资金不足 | 单笔下单金额超过可用资金,或者没有预留手续费 | 下单前计算可用资金,注意按整手(100 股整数倍)下单 |
| 分钟级数据为空 | 未开通分钟级数据权限 | 联系券商确认权限,或先切换到日线策略 |
| 回测结果和模拟盘差异很大 | 撮合机制不同、手续费设置不一致、滑点假设不同 | 优先检查交易成本设置,再对比成交明细 |
| 策略报错后自动停止 | 代码有异常没有捕获 | 在关键函数上增加 try/except,保证异常时至少能输出日志而不是直接崩溃 |
遇到报错时,第一件事不是重写代码,而是看日志。ptrade 的策略日志里会输出详细的报错堆栈信息,定位到具体行数。很多时候就是少了个参数或者股票代码多敲了一个字母。
5.2 我在实操中养成的几个习惯
第一个习惯是多打日志。有人觉得 log.info 是在浪费时间,其实它是排查问题时最锋利的工具。我在写任何策略时,都会在 initialize 里输出股票池和参数,在 handle_data 里间隔输出当前价格、均线值、持仓状态。这样一旦策略表现异常,看日志就能快速定位是数据问题、逻辑问题还是执行问题。
第二个习惯是先跑通再优化。新手特别容易陷入“我要写一个完美策略”的执念里,结果代码写了一堆,一次都没跑通。正确姿势是先把最小功能跑通,比如只买卖一只股票,确认流程没问题,再逐步增加股票数量、增加条件判断、增加仓位管理。
第三个习惯是给每个策略做好版本管理。很多人会在同一个文件里反复修改参数,跑了很多次回测但分不清哪次是哪个版本。我的做法是每次改动前复制一份文件,命名带上日期和参数特征,比如“ma_cross_20240101_win5_20”。这样做久了以后,复盘对比效率会高很多。
第四个习惯是做好回测记录表。每次回测结束后,把策略名称、区间、初始资金、年化收益、最大回撤、夏普比率记到一个表格里。别嫌麻烦,等你积累了二十几条记录再回头对比,你会很容易看出哪些参数是真正有效的,哪些只是偶然跑得好。
5.3 关于 ptrade 学习的路线建议
如果你刚刚开始接触 ptrade,我建议学习路线可以这样安排:先把这一期的基础流程反复走三遍以上,确认自己能不看教程独立完成“新建策略—跑回测—建模拟”这套动作;然后去研究 ptrade 的官方帮助文档,尤其是 API 说明,不用全背,但要知道有这些函数存在,用的时候能想到这里有现成的工具;接着开始简化复现一些经典策略,比如双均线、MACD 金叉死叉、布林带突破;再往后才是加入仓位管理、止损止盈、多标的组合。
每一步都保持足够耐心。量化交易这个领域,前期最容易被劝退的就是“流程不熟”,很多人不是不想学,而是连一个最简单的策略都跑不起来。你把这一期的流程弄熟就等于跨过了第一道坎,后面的路其实没有想象中那么难。
我自己到现在也还是保持着“每个新策略先跑完整流程再做优化”的习惯。工具这东西,用多了自然就熟了,关键是最初那几次不要因为小挫折就放弃。下一期我会继续写策略的数据获取和常用指标实现,把双均线背后的数据接口、K线计算细节展开讲清楚。如果你在跑这一期流程时有任何卡住的地方,可以先翻一翻终端自带的日志,再对照上面的问题表排查一下,等你自己亲手跑通一个策略的时候,那种成就感比看多少篇教程都管用。