很多人在学习Python量化交易时,会遇到一个问题:
为什么自己的回测收益很好,但是实际模拟交易效果明显下降?
一个重要原因是:
回测环境和真实交易环境存在差异。
很多简单回测只计算:
买入价格
卖出价格
收益
但是实际交易过程中还存在:
- 手续费
- 滑点
- 成交延迟
- 流动性影响
本文介绍如何使用Python建立更加接近真实交易的回测模型。
一、简单回测存在的问题
例如:
策略:
10元买入
12元卖出
简单计算:
收益20%
但是实际:
买入:
10.02元
卖出:
11.98元
再扣除手续费。
最终收益可能只有:
15%左右。
二、手续费模型
定义:
fee_rate = 0.0003
买入:
buy_cost = (
price *
amount *
fee_rate
)
卖出:
sell_cost = (
price *
amount *
fee_rate
)
账户最终收益:
profit = (
sell_money
-
buy_money
-
fee
)
三、滑点模型
滑点代表:
实际成交价格和理论价格之间的差异。
例如:
策略价格:
100
实际成交:
100.05
滑点:
0.05%
Python:
slippage = 0.0005
real_buy_price = (
price *
(1+slippage)
)
卖出:
real_sell_price = (
price *
(1-slippage)
)
四、避免未来函数
回测最大的问题之一:
未来函数。
错误:
today_close = today_price
buy(today_close)
因为交易发生时:
当天收盘价还不知道。
正确:
signal.shift(1)
表示:
昨天产生信号。
今天执行交易。
五、事件驱动回测流程
一个更加合理的回测:
读取当天行情
↓
计算指标
↓
产生信号
↓
提交订单
↓
模拟成交
↓
更新资金
↓
进入下一交易日
Python结构:
for day in trading_days:
data = get_data(day)
signal = strategy(data)
order = execute(signal)
update_account(order)
六、为什么交易次数也很重要
两个策略:
策略A:
收益30%
交易500次
策略B:
收益30%
交易30次
实际意义不同。
交易越频繁:
手续费影响越明显。
所以回测指标不能只看收益。
七、真实回测应该关注哪些指标
常见指标:
总收益
年化收益
最大回撤
夏普比例
交易次数
胜率
盈亏比
Python可以:
max_drawdown = (
equity_curve /
equity_curve.cummax()
-1
)
总结
一个合格的量化回测系统,不应该只是计算:
买入
卖出
赚钱
而应该模拟:
交易成本
↓
成交过程
↓
资金变化
↓
风险控制
只有这样,回测结果才更接近真实交易。

382

被折叠的 条评论
为什么被折叠?



