这里我们先不讲理论,直接进入实践部分。要想验证小瓦的策略是否可以赚到钱,我们就用代码来模拟她的交易过程——使用“低买高卖”策略生成交易信号,并根据交易信号来下单,再计算小瓦的总资产是增加了还是减少了。说干就干,读者朋友可以和我们一起来进行操作。
我们继续使用第1章中的股票数据,并根据小瓦的交易策略,创建交易信号。先导入一些必要的库,输入代码如下:
#导入必要的库 from pandas_datareader import data as dt import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns
注意:在本书的写作过程中,每一章对应单独的notebook文件。因此在每章,我们都会导入所需要的库,且已经导入的库在本章内不会重复导入。如果读者朋友不是按章建立notebook文件进行练习的话,请注意库的加载情况,以免程序报错。
运行代码,如果程序没有报错,就说明导入成功。接下来进行数据的下载,输入代码如下:
运行代码,可以得到如表2.1所示的结果。
表2.1 使用datareader下载的股票数据
【结果分析】 和第1章中相同,程序给我们返回了股票数据的前5行。如果读者朋友也看到了表2.1所示的结果,说明数据下载成功。
下面我们就使用新下载的数据来创建交易信号,并根据交易信号的变化进行下单操作。和第1章不同的是,为了更能体现出股票的真实价值,我们选取股票调整后的收盘价Adj Close作为股票的真实价格。同时,为了便于计算下单的数量,我们用0替换掉数据表中第一行的空值NaN,并且用0标记股价上涨或无变化,用1标记股价下跌。输入代码如下:
运行代码,会得到如表2.2所示的结果。
表2.2 创建交易信号并下单
【结果分析】 从表2.2中可以清晰地看到,在2020年1月6日这一天,股价下跌了大约6角,程序给出交易信号“1”,这时下单买入100股;而到了1月7日,股价上涨了约5角5分,程序给出交易信号“0”,此时交易信号的变化为0 –1= –1,因此下单卖出100股。经过这一买一卖的交易,小瓦可以赚到大约55元,看起来还不错。
不要高兴得太早,只是在某一天赚到了钱并不代表策略是长期可行的。下面我们就给小瓦一笔钱,让她计算一下,使用这个策略模拟交易一段时间后总资产的变化情况。输入代码如下:
运行代码,会得到如图2.1所示的结果。
图2.1 使用小瓦的策略进行交易的资产变化情况
【结果分析】 从图2.1中可以看到,从1月初到3月20日,使用小瓦的“低买高卖”策略进行交易,总资产最后略微减少了。虽然从1月中旬到2月中旬,总资产也曾经有一定的增长,但涨幅也并不明显。当然,考虑到在此期间,股市整体表现都不好,在这样的背景下,小瓦的策略没有让总资产大幅缩水,对一个新手来说,这算是不错了。
以上我们和小瓦一起,做了一个非常简单的回测。没错,回测这个词的意思就是:通过模拟算法进行交易的过程,用一些指标对交易策略进行评估。在我们所做的回测当中,所测量的指标就是利润和损失(Profit and Loss,PnL)。不过在刚才的回测当中,我们并没有考虑交易手续费和税费等成本,如果将这些附加成本也添加到模型中参与计算,算出来的就是净利润和损失(net PnL)。常用的指标还有年化收益、交易手数、风险敞口(exposure),以及夏普指数(sharpe ratio)等。
在上述指标中,我们可能需要给小瓦简单介绍一下风险敞口和夏普指数这两个指标。风险敞口指的是未加保护的风险,在股市中,其实就是指投资股票的资金。例如,小瓦有1万元,她拿其中的5000元买了股票,其余5000元买了保本的理财产品,那么买股票的5000元钱就面临着股价下跌的风险。也就是说,她的风险敞口就是5000元。
夏普指数也常被称为夏普比率,是由诺贝尔经济学奖得主威廉·夏普提出的。值得一提的是,威廉·夏普其实就是资本资产定价模型的奠基者。他在1997年提出夏普指数这个概念,其核心思想是,将一组投资组合的回报率与无风险投资回报率(如银行存款或国债)进行对比,看投资组合的回报会超过无风险投资回报率多少。夏普指数越高,说明投资组合的回报率越高;相反,如果投资组合的回报不及无风险投资的回报,就说明这项投资是不应该进行的。
还是以小瓦为例,假设她买保本理财产品的收益是4%,而投资股票的预期收益是100%,同时,投资股票的超额收益标准差是20%,则小瓦进行股票投资的夏普指数是
(100% – 4%)/ 20% = 4.8
在后面的章节中,我们会使用不同的指标进行回测,也会演示详细的计算过程。这里先让小瓦简单了解即可。