2016
BTFD - 现实的打击
原文:
www.backtrader.com/blog/posts/2016-12-28-btfd-bites/btfd-bites/
之前的帖子设法复制了BTFD
策略,发现真正的收益是16x
而不是31x
。
但正如在复制过程中指出的那样:
- 没有收取任何手续费
- 使用
2x
杠杆不收取利息
这引起了一个显而易见的问题:
- 当收取佣金和利息时,16 倍的收益将有多少?
幸运的是,之前的样本足够灵活,可以进行实验。 为了得到一些视觉反馈和验证,以下代码将添加到策略中
def start(self): print(','.join(['TRADE', 'STATUS', 'Value', 'PNL', 'COMMISSION'])) def notify_order(self, order): if order.status in [order.Margin]: print('ORDER FAILED with status:', order.getstatusname()) def notify_trade(self, trade): if trade.isclosed: print(','.join(map(str, [ 'TRADE', 'CLOSE', self.data.num2date(trade.dtclose).date().isoformat(), trade.value, trade.pnl, trade.commission, ] ))) elif trade.justopened: print(','.join(map(str, [ 'TRADE', 'OPEN', self.data.num2date(trade.dtopen).date().isoformat(), trade.value, trade.pnl, trade.commission, ] )))
关键在于以下内容:
- 查看交易如何开启和关闭(价值,利润和损失,价值和佣金)
- 如果订单因资金不足而被拒绝,则提供反馈
Margin
注意
因为将有一个调整要投资的金额,以留出佣金的空间,所以一些订单可能无法被经纪人接受。 这种视觉反馈可以帮助识别情况
验证
首先快速测试以查看某些订单是否被接受。
$ ./btfd.py --comminfo commission=0.001,leverage=2.0 --strat target=1.0 TRADE,STATUS,Value,PNL,COMMISSION ORDER FAILED with status: Margin ORDER FAILED with status: Margin TRADE,OPEN,1990-01-08,199345.2,0.0,199.3452 TRADE,CLOSE,1990-01-10,0.0,-1460.28,397.23012
注意:
- 我们应用
target=1.0
,意味着:尝试投资 100%的资本。 这是默认值,但它在这里作为参考。 commission=0.001
或0.1%
,以确保我们有时会满足保证金- 前两个订单被拒绝了,显示
Margin
。 - 第三个订单被接受了。 这不是错误。 系统试图投资
100%
的资本,但资产有一个价格,这是用来计算股份大小的。 大小是从实际可用的现金计算出的潜在大小的结果进行向下舍入。 这次向下舍入为这个第三个订单留下了足够的空间。 - 交易通知(
OPEN
和CLOSE
)显示了开仓手续费和最终总手续费,接近200k
的价值,展示了2x
杠杆的实际效果。
开仓手续费为199.3452
,这是杠杆价值的0.1%
,即199,345.2
剩余的测试将使用target=0.99x
进行,其中x
将确保有足够的空间用于选定的手续费。
现实的打击
让我们举一些真实的例子
目标 99.8% - 佣金 0.1%
./btfd.py --comminfo commission=0.001,leverage=2.0 --strat target=0.998 --plot
霹雳般的! 不仅BTFD
策略远未接近16x
的收益:它损失了大部分资金。
- 从
100,000
下降到大约4,027
注意
下降到值是非杠杆值,因为这是在平仓时将返回系统的大约值
目标 99.9% - 佣金 0.05%
很可能是佣金过于激进。 让我们去一半
./btfd.py --comminfo commission=0.0005,leverage=2.0 --strat target=0.999 --plot
NO, NO。佣金并非如此激进,因为系统仍然亏损,从100,000
下降到约69,000
(非杠杆价值)
目标 99.95% - 佣金 0.025%
佣金再次被除以二
./btfd.py --comminfo commission=0.00025,leverage=2.0 --strat target=0.9995 --plot
最终系统赚钱了:
- 最初的
100,000
被用于3x
增益,增加到331,459
。 - 但这并不符合资产的表现,该资产已经涨到了超过
600k
注意
该示例接受--fromdate YYYY-MM-DD
和--todate YYYY-MM-DD
来选择应用策略的时间段。这将允许对不同日期范围进行类似的场景测试。
结论
当面对佣金时,16x
的收益无法持续。对于一些经纪人提供的佣金(无上限且按百分比计算),需要非常好的交易才能确保系统赚钱。
在这种情况下,策略应用于标普 500
,BTFD
策略与指数的表现不相匹配。
没有应用利率。使用佣金已足以看出16x
距离任何潜在利润有多远。无论如何,以2%
的利率运行将执行如下
./btfd.py --comminfo commission=0.00025,leverage=2.0,interest=0.02,interest_long=True --strat target=0.9995 --plot
interest_long=True
是必须的,因为默认情况下收取利息的行为只针对多头仓位进行。
示例用法
$ ./btfd.py --help usage: btfd.py [-h] [--offline] [--data TICKER] [--fromdate YYYY-MM-DD[THH:MM:SS]] [--todate YYYY-MM-DD[THH:MM:SS]] [--cerebro kwargs] [--broker kwargs] [--valobserver kwargs] [--strat kwargs] [--comminfo kwargs] [--plot [kwargs]] BTFD - http://dark-bid.com/BTFD-only-strategy-that-matters.html - https://www. reddit.com/r/algotrading/comments/5jez2b/can_anyone_replicate_this_strategy/ optional arguments: -h, --help show this help message and exit --offline Use offline file with ticker name (default: False) --data TICKER Yahoo ticker to download (default: ^GSPC) --fromdate YYYY-MM-DD[THH:MM:SS] Starting date[time] (default: 1990-01-01) --todate YYYY-MM-DD[THH:MM:SS] Ending date[time] (default: 2016-10-01) --cerebro kwargs kwargs in key=value format (default: stdstats=False) --broker kwargs kwargs in key=value format (default: cash=100000.0, coc=True) --valobserver kwargs kwargs in key=value format (default: assetstart=100000.0) --strat kwargs kwargs in key=value format (default: approach="highlow") --comminfo kwargs kwargs in key=value format (default: leverage=2.0) --plot [kwargs] kwargs in key=value format (default: )
BackTrader 中文文档(十九)(2)