海龟策略深入研究-策略回测系列-15 手续费滑点检验

19 篇文章 3 订阅

理论上,基于日线数据的中低频趋势跟踪策略,手续费和滑点是可以忽略不计的。为了验证这个结论,进行对比测试,如图所示。

 
 

右图为包含手续费和滑点版本的海龟策略,其中手续费设置为交易所手续费的1.1倍,滑点设置为期货合约的最小价格变动。

 

其结果是总手续费为635364,总滑点为636794,加上手续费和滑点后,其影响在于:

  • 结束资金从77605953降低至76333794,
  • 年化收益从44.34%降低至44.09%,
  • 百分百最大回撤从-25.61%上升到-26.23%,
  • 夏普比率从1.65降低至1.62,
  • 资金曲线形状基本无变化。

 
综上所述,手续费和滑点对于海龟策略影响不大,在测试中可以忽略不计。

enter image description here

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个backtrader股票示例,考虑手续费点、资金管理: ```python import backtrader as bt class MyStrategy(bt.Strategy): params = ( ('sma_period', 15), ('atr_period', 14), ('atr_multiplier', 2), ('commission', 0.001), ('slippage', 0.001), ('initial_capital', 100000), ) def __init__(self): self.sma = bt.indicators.SimpleMovingAverage( self.data.close, period=self.params.sma_period) self.atr = bt.indicators.ATR( self.data.high, self.data.low, self.data.close, period=self.params.atr_period) self.position_size = None def next(self): if self.position: if self.data.close[0] < self.sma[0]: self.close() else: if self.data.close[0] > self.sma[0] + \ self.params.atr_multiplier * self.atr[0]: self.position_size = self.params.initial_capital * \ self.params.risk / self.atr[0] self.buy(size=self.position_size) def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log( 'BUY EXECUTED, Size: %.2f, Price: %.2f, Cost: %.2f, Comm: %.2f' % (order.executed.size, order.executed.price, order.executed.value, order.executed.comm)) self.position_size = order.executed.size else: self.log('SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm: %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.position_size = None elif order.status in [order.Canceled, order.Margin, order.Rejected]: self.log('Order Canceled/Margin/Rejected') def notify_trade(self, trade): self.log('Trade Profit/Loss: %.2f' % trade.pnl) if __name__ == '__main__': cerebro = bt.Cerebro() cerebro.addstrategy(MyStrategy, risk=0.01) data = bt.feeds.YahooFinanceData( dataname='AAPL', fromdate=datetime.datetime(2010, 1, 1), todate=datetime.datetime(2020, 12, 31)) cerebro.adddata(data) cerebro.broker.setcash(100000) cerebro.broker.setcommission(commission=self.params.commission, margin=0, mult=1) cerebro.broker.set_slippage_fixed( size=self.params.slippage, price=None) cerebro.run() ``` 这个策略使用了SMA和ATR指标来进行交易决策。如果当前没有持仓且价格上穿SMA加上ATR乘以一个倍数,则进行买入;如果当前持仓且价格下穿SMA,则进行卖出。其中,ATR用于计算每次交易的头寸大小。 在`notify_order`方法中,我们输出了每次交易的成本和手续费,用于计算总体的交易成本。在`notify_trade`方法中,我们输出了每次交易的盈亏情况。 在主程序中,我们使用了YahooFinanceData作为数据源,设置了时间和初始资金,并设置了手续费点等交易参数。时,我们将risk参数设置为0.01,表示每次交易风险不超过总资金的1%。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值