深入浅出Python量化交易实战
上QQ阅读APP看书,第一时间看更新

1.3.3 用真实股票数据练练手

在这一小节中,小瓦就开始使用真实数据集来进行练习了。这里需要用到一个获取金融数据的库——pandas_datareader。需要注意的是,编写本书时,Anaconda并没有内置这个库,因此小瓦需要单独安装这个库。这个库的安装非常简单,只要在Jupyter Notebook的单元格中输入下面这行代码就可以了:

!pip3 install pandas_datareader –-upgrade

运行这行代码,程序会自动下载这个库并完成安装。

注意:由于写作本书所使用的环境是Python 2.x和Python 3.x并存的,因此此处指定使用pip3 install。如果读者朋友的电脑只安装了Python 3.x,则直接使用pip install即可。

如果想检查datareader是否安装成功,则可以输入下面的代码:

#导入datareader并重命名为web
import pandas_datareader as web
#查看datareader的版本信息
web.__version__

运行代码,可以看到程序给我们返回datareader的版本号如下:

'0.8.1'

1.下载股票数据

如果读者朋友也得到了这个结果,说明datareader已经安装成功。接下来我们使用datareader获取一只股票的数据,输入代码如下:

运行代码,会得到如表1.1所示的结果。

表1.1 使用datareader获取的股票交易数据

【结果分析】如果读者朋友也得到了与表1.1相同的结果,说明数据下载成功。在表1.1中,第一列Date是交易日的时期,后面依次是当日股票的最高价、最低价、开盘价、收盘价、成交量和调整后的收盘价。由于1月1日是元旦,这一天是没有交易数据的。

2.最简单的数据处理

下面我们来做一点简单的处理工作。大家知道,股票每日的涨跌是用当日的收盘价减去前一个交易日的收盘价来计算的。例如,2020年1月3日的收盘价约为86.20元,1月2日的收盘价约为86.12元,则1月3日当天,该股票较前一个工作日上涨了8分钱。这样的话,可以在数据表中添加一个字段,用来表示当日股价较前一日的变化。输入代码如下:

#将新的字段命名为diff,代表difference
#用.diff()方法来计算每日股价变化情况
data['diff'] = data['Close'].diff()
#检查一下前5行
data.head()

运行代码,会得到如表1.2所示的结果。

表1.2 添加diff字段的数据表

注:NaN表示无数据。

【结果分析】从表1.2中可以看到,我们成功地添加了diff字段,以表示该股票每日的价格变化情况。例如,在1月6日当天,该股票收盘价较上一交易日下跌了约6角;而1月7日当天,该股收盘价较上一交易日上涨了约5角5分。通过添加这个字段,我们即可直观地看出股票每日的价格变动。

注意:为了便于展示,表1.2中省略了部分字段。

3.设计最简单的交易策略

到这里,小瓦提出了一个问题。我们可以设置一个最简单的交易策略:如果当日股价下跌,我们就在下一个交易日开盘前挂单买入;反之,如果当日股价上涨,我们就在下一个交易日开盘前挂单卖出。循环进行这个步骤,我们不就可以赚钱了吗?

说实话,这个策略听起来还挺不错。我们先不论其是否可行,就单纯地用代码来试试。要实现这个策略,首先我们来创建一个新的字段——Signal(交易信号)。如果diff字段大于0,则Signal标记为1;如果diff字段小于或等于0,则Signal标记为0。输入代码如下:

#此处会用到numpy,故导入
import numpy as np
#创建交易信号字段,命名为Signal
#如果diff值大于0,则Signal为1,否则为0
data['Signal'] = np.where(data['diff'] > 0, 1, 0)
#检查是否成功
data.head()

运行代码,我们会得到如表1.3所示的结果。

表1.3 添加了Signal字段的数据表

【结果分析】从表1.3中可以看到,使用np.where()可以让程序判断每日股价是上涨还是下跌:如果上涨,则交易信号为1,代表卖出;否则交易信号为0,代表买入。这样我们就得到了最简单的交易信号。

4.交易信号可视化

在得到了交易信号之后,我们可以再来实现最简单的可视化,这样我们就可以在图像中直观地看到什么时候买入,什么时候卖出了。可视化的代码部分如下:

运行代码,我们会得到如图1.10所示的结果。

图1.10 交易信号的可视化

【结果分析】从图1.10中可以看到,倒三角所处的位置是股票收盘价较上一个交易日上涨的时刻,代表卖出;正三角所处的位置是股票收盘价较上一个交易日下跌的时刻,代表买入。直观来看,在这个时间范围内,股价整体呈现出下跌天数大于上涨天数的情况。假设小瓦使用这个交易策略,且每次买入和卖出的股票数量相同的话,那么她持有这只股票的仓位会越来越高。

当然,我们不会真的让小瓦使用这个简单的策略去进行实盘交易,只是通过这些步骤帮助她熟悉一下使用Python进行一些简单的交易数据处理与可视化的方法。至于某种策略会带来怎样的回报,还要通过回测(backtesting)来进行评估。关于回测的具体方法,我们会在后面的章节进行介绍。