量化投资系列文章:
Backtrader 教程 — Python 量化投资原来这么简单(1)
Python 量化投资原来这么简单(3) —A股回测MACD策略
Python 量化投资原来这么简单(5) — A股回测KDJ 策略
Github仓库:https://github.com/Ckend/pythondict-quant
在之前的五篇系列文章中,计算收益率时没有考虑每次按策略进行交易时的收益率,而是单纯回测一段时间后,通过计算最终价值和本金的差距并除以本金,得到最终收益率。这样的计算方法其实是不准确的,因为交易时每次都采用100股的形式进行,在没有引入调仓技术前,我们应该以每次交易的平均收益率为准。
具体计算方法如下:
- 在每次买入股票的时候,记录购买价格:self.buyprice
- 在每次卖出股票的时候,计算收益率:(卖出价格-买入价格)/买入价格,忽略佣金。
- 将每次交易收益存入params变量中,以便后续分析。
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的主要目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,内含许多科学计算模块。
Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。
当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事:Python 编程的最好搭档—VSCode 详细指南。
在终端输入以下命令安装我们所需要的依赖模块:
pip install backtrader
看到 Successfully installed xxx 则说明安装成功。
Backtrader基本使用请看我们前一篇文章:
backtrader教程—量化投资原来这么简单(1)
本文全部代码,请在Python实用宝典后台回复:量化投资6 进行下载。
2.交易收益率
以第二篇的macd策略为例,首先初始化策略变量,用于记录股票交易的每次收益率:
class TestStrategy(bt.Strategy): params = ( ('code', 0), ('profits', []) )
第二,要在notify_order函数中记录购买时的价格:
def notify_order(self, order): # 交易状态处理 # Python实用宝典 if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log( "BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f" % (order.executed.price, order.executed.value, order.executed.comm) ) # 记录买入价格 self.buyprice = order.executed.price self.buycomm = order.executed.comm self.bar_executed_close = self.dataclose[0]
第三,在卖出的时候,根据卖出价格和买入价格计算收益率,并存入策略变量里的profits变量中:
def notify_order(self, order): # 交易状态处理 # Python实用宝典 if order.status in [order.Submitted, order.Accepted]: return if order.status in [order.Completed]: if order.isbuy(): self.log( "BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f" % (order.executed.price, order.executed.value, order.executed.comm) ) # 记录买入价格 self.buyprice = order.executed.price self.buycomm = order.executed.comm self.bar_executed_close = self.dataclose[0] else: self.log( "SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f" % (order.executed.price, order.executed.value, order.executed.comm) ) # 收益率计算 profit_rate = float(order.executed.price - self.buyprice)/float(self.buyprice) # 存入策略变量 self.params.profits.append(profit_rate) self.bar_executed = len(self)
在策略运行完毕后,可以通过以下变量获得策略变量里profits的值:
cerebro.runstrats[0][0].params.profits
结果如下:
[0.021676761236850372, -0.1054225992123598, 0.10678571428571423, 0.11044953855314062, 0.21502209131075103, 0.15729837813819164, 0.10841304881039966, 0.16918294849023086]
可以看到,每次该策略进行交易时的收益率,第一次盈利2%、第二次亏损10%、第三次盈利10%、第四次盈利11%…
有趣的是第五次,盈利了21%,这个策略明明是在盈利10%的时候卖出,为什么这次交易能盈利21%?
主要是在涨停板之下,股票无法卖出导致的。
这也给我们一个hint:这个策略写死的涨/跌10%卖出是不是过于死板了,有没有更合适的卖出策略?
大家可以尝试一下找到更好的卖出策略,下一篇文章中我们将重点讨论这个问题。
3. 平均收益率
使用numpy的mean函数,可以直接算出数组的平均值:
print(np.mean(profits))
结果如下:
0.09792573520161482
平均下来,该策略在这只股票上的收益率为9.7%.
但是这并不代表这个策略是可用的,因为有可能它只是适用于这只股票,是否适合所有股票需要通过回测A股来决定:Python 量化投资原来这么简单(3) —A股回测MACD策略
我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典