第一个策略已经运行完毕。现在检查模拟交易是否确实遵循指定规则,以及显示的结果是什么意思。

本书演示数据是人工生成的价格序列。结果可用于检查程序行为,不能说明真实市场的预期收益。

先看一笔交易

以长度 5 和 20 运行 crossover_strategy.py,等待结束,在图表下方面板选择 Trades。如果面板关闭,点击右侧箭头展开。

表格列出交易的入场和出场信息。多头交易中,入场是买入,出场是卖出。

列名显示内容
Trade交易序号和入场标识
Entry time入场成交时间
Entry price入场成交价格
Exit time出场成交时间
Exit price出场成交价格
Qty交易数量
Profit该笔已平仓交易的金额盈亏
Profit %该笔交易的百分比盈亏
PyneIDE 策略图表下方打开 Trades 表,显示成交时间、价格和盈亏。
Trades 表可分别检查已经成交的入场和出场。

点击一笔交易所在行,在图表中找到相应时段。检查入场前的交叉,以及引发平仓的交叉。

原程序没有指定 commission_value 或 slippage,所以基础运行不包含我们接下来添加的这些成本。先在这个简单版本检查方向、时间与数量。

手算一笔简单交易

以 100 买入一单位、以 103 卖出,价差为 3。点值为一且无成本时,金额盈亏也是 3。

更一般地,多头交易的价格盈亏为:

(出场价 − 入场价) × 数量 × 点值

点值属于市场元数据,说明持仓数量为一时,价格变动一单位对应多少钱。本书 DEMO 数据的点值为 1。

手续费降低交易净收益。滑点改变成交价,所以已经包含在价差中。使用滑点调整后的价格时,不要再重复扣除同一笔滑点。

Performance 视图

Performance 显示整个运行的资金变化,界面包含:

  • Cumulative P&L:相对于初始资金的变化;
  • Max drawdown:相对于此前资金曲线高点的最大回落;
  • Final equity:最后一根已处理 K 线上的账户权益;
  • Max run-up:相对于此前资金低点的最大上升。
PyneIDE 的 Performance 视图显示 Cumulative P&L、Max drawdown、Final equity 和资金曲线。
Performance 显示整个运行的资金曲线与汇总值。

账户权益可能包含未平仓头寸的浮动价值。因此,最后权益不一定等于初始资金加已平仓交易利润。也要检查数据末尾是否仍有持仓。

看资金曲线时,除了终点,也要看中间过程。同一最终结果可能经历不同的回撤和很长的亏损期。

Stats 视图

Stats 显示运行结束时的详细统计。Total Trades 可核查已平仓交易数量,Net Profit 对应它们累计净收益。

Profit Factor 是盈利与亏损交易累计结果之比:总盈利除以总亏损的绝对值。如果没有亏损交易,这个比值就不是通常可直接比较的有限数。

胜率表示已平仓交易中盈利的比例,但不能单独决定总收益。少数大亏可能抵消许多小赚。

交易笔数少时,汇总数据容易误导。查看其他指标时始终同时看总笔数,也检查单笔亏损交易。

在 Properties 中设置成本

点击图表下方面板的 Strategy properties 齿轮,打开策略设置,再选择 Properties。这里可修改初始资金、数量和成本。

下面两次运行是一组对比练习。所给成本只是示例,真实市场的成本需要另行设置。

  1. 检查 Initial capital 为 10000,Order size 为 1 Contracts。
  2. 将 Commission 设为 0.1,单位选择 % of order value。数值可按 0.1 输入。
  3. 将 Slippage 设为 2 tick。
  4. 点击 Save 保存,再启动 Run Pyne code,等待运行结束。
策略 Settings 界面的 Properties 标签页显示 Commission 与 Slippage 字段。
Properties 用百分比表示手续费,用 tick 表示滑点。

0.1% 不是 10%。该字段的单位是百分比,一次价值 100 的成交对应 0.1 手续费。入场和出场都是成交,都可能产生费用。

tick 是市场最小价格变动单位。DEMO 元数据中为 0.01,所以两个 tick 对应 0.02 的价格变化。滑点将市价单成交价向不利于策略的方向移动。

其他市场的 tick 和点值可能不同。不要把 DEMO 成本的含义直接套用到另一个品种。

成交设置也是实验的一部分

Fill orders 中的 On bar close 会影响市价单时间。本书基础策略保持关闭,让信号触发的订单在下一根开盘成交。

After order is filled 可要求成交后重算。Using bar magnifier 可用更低时间周期的细粒度数据检查 K 线内部成交。这些都会改变执行条件;与基础运行比较时保持关闭。

即使只改一项设置,也是在产生新的运行结果。如果长度、数量、成本和成交模式同时改,就无法确定差异来自哪一项。

保存比较依据

图表工具栏的 Open trades output CSV 可打开交易导出,Open plot output CSV 打开绘图数值表。项目 Output 分组也能找到这些结果文件。

再次运行同一程序前,先把要保留的导出复制成另一个文件名。结果文件名本身并不记录全部设置。

自己的记录至少应包含:

运行数据快/慢长度数量手续费滑点
基础运行DEMO5 / 201 单位0%0 tick
含成本DEMO5 / 201 单位0.1%2 tick

同时填入获得的结果。请根据真实运行在自己的笔记里填写,而非预设答案。

自己试一试

比较无成本与含成本运行中的同一笔交易,检查入场价、出场价和盈亏。哪些发生变化,哪些信号规则保持不变?

参考答案

移动平均与交叉并不由手续费或滑点计算,所以基础信号不变。滑点可能使市价入场和平仓价格更不利,手续费进一步减少净收益。

只有输入、数量、数据和成交模式相同,且策略在两次都能执行订单时,才能直接比较。

选择另一份数据

演示之后,可以通过 PyneIDE 数据下载工具准备真实市场数据。新数据可能带来不同价格、tick 大小、数量限制和交易。先检查数据,再比较结果。

  1. 在左侧 Pyne 视图,将鼠标移到 Data 分组标题。点击出现的云朵向下箭头 Download Data… 图标,打开 Symbol Browser。也可以右键 Data 标题找到相同菜单项。
  2. 在 Provider 选择提供方。截图使用 ccxt,此时 Broker 还可选择具体数据源。
  3. 在筛选框输入市场名称。图中选择 coinbase 的 BTC/USD 现货市场。注意完整代码:前缀相似的条目可能是不同市场。
  4. Timeframe 设为 1D,From 选择 365 days back。To 中的 now 表示一直获取到下载时刻。
  5. 点击 Download,等待完成。
PyneIDE 的 Symbol Browser 选中 ccxt 提供方、coinbase 数据源的 BTC/USD 现货市场和日线周期。
Symbol Browser 中的数据源、市场、周期和时间范围共同决定下载内容。

右侧信息中,mintick 是最小价格变动,pointvalue 是点值,mincontract 是最小数量。使用自己的数据时也要查看。数据源是否可用及所需访问权限取决于提供方;获取这里选定的数据并不表示在使用交易账户。

下载结果进入项目 Data 分组。点击策略图表顶栏的市场名称,也可以打开数据选择器改选新数据。图表随后重算,但仍需检查输入和策略属性。

下载时间范围不保证固定 K 线数量,还取决于提供方可用数据、交易日和缺失时段。重新下载可能改变序列。用于比较时,请保留数据文件及对应元数据文件。

如何理解一次运行

回测结合指定规则、数据序列和执行模型进行计算。它帮助检查代码是否符合描述,以及在模型中原本会怎样表现。结果不包含未来数据。

如果在同一数据上反复调参,可能找到的是贴合该数据的规则。用未参与调参的独立时段检查,回答的是另一个问题。因此,结课项目会分开验证程序是否正确,以及不同设置的结果差异。