![Python+Office:轻松实现Python办公自动化](https://wfqqreader-1252317822.image.myqcloud.com/cover/834/40107834/b_40107834.jpg)
4.4 Python处理金融数据案例实战
金融数据是指金融行业所涉及的市场数据、公司数据、行业指数和定价数据等的统称。凡是与金融行业相关的数据都可以被归入金融市场的数据体系之中。在金融市场中,根据数据的频率,金融数据分为低频数据、高频数据和超高频数据三大类。
4.4.1 读取上证指数股票数据
Pandas库提供了专门从财经网站获取金融时间序列数据的API接口,可作为量化交易股票数据获取的另一种途径。该接口在urllib3库的基础上实现了以客户端身份访问网站的股票数据。
pandas-datareader包中的pandas_datareader.data.DataReader()函数可以根据输入的证券代码、起始日期和终止日期来返回所有历史数据。函数的第1个参数为股票代码,形式为“股票代码”+“对应股市”,其中上海证券交易所的股票需要在股票代码后面加上“.SS”,深圳证券交易所的股票需要在股票代码后面加上“.SZ”。第2个参数是数据来源,如雅虎、谷歌等网站,本节以从雅虎财经获取金融数据为例进行介绍。第3个、第4个参数为股票数据的起始时间。
这里需要使用datetime()函数、Pandas库和pandas-datareader包,还可以使用datetime.datetime.today()函数来调用程序当前的日期。
先导入相关的库,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_58.jpg?sign=1738791942-XWFEcNmmIvZJ045ygHVqWSK8ZQQmlRNG-0-d1b06388b40ff3370dfc8c12001e9260)
在上述代码中,pandas_datareader.data这个名称显然过长,因此给它起一个别名叫作pdr,这样在后文中使用pandas_datareader.data.DataReader()函数时,直接使用pdr.DataReader()函数即可。需要注意的是,这里在pandas_datareader中使用的是下画线“_”,而不是连接符“-”。
接下来,设置起始日期start_date和终止日期end_date,使用datetime.datetime()函数指向给定日期。例如,使用datetime.date.today()函数指向程序当前的日期,并将结果保存到一个名为stock_info的变量中,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_59.jpg?sign=1738791942-eEC60Cslvuzdi4YMY615o1EMM4ovmq43-0-086aa872e498d7bfdb0be5572ebd45c0)
也可以直接设置起始日期start_date和终止日期end_date,再运行pdr.DataReader()函数并将其保存到变量中,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_60.jpg?sign=1738791942-hyqzrTsBIi8vLkEOAXKNopXhCk7z3JvE-0-455b61f91a3ce74c5b5d9d8a42eac0d0)
下面使用head()函数查看金融数据的前5行记录,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_61.jpg?sign=1738791942-Sz4y2YiN3y55mklprcSvq7gYnxVbuaoN-0-f3d6cd962d53dee20911770f29f0a9ec)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_62.jpg?sign=1738791942-AgqvLPSI5dcHdVdo4MvC6s8Y4pkcFILA-0-f3224f618b0b75de5b4b104c608f35ae)
可以看出,数据集的索引是Date(日期),共有High、Low、Open、Close等7列数据。
4.4.2 提取2020年8月数据
此外,虽然变量stock_info中包含2020年全年的数据,但是在不同的业务需求下,需要提取不同的数据。例如,可能只需要提取2020年8月的数据,也可能只需要提取2020年每个月月底的数据。
例如,提取2020年8月的数据,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_63.jpg?sign=1738791942-3shw6dS1GGBVcIrDE1KSg50eOsojhy9p-0-9727ec4cdfedc99711e608206f69d758)
运行上述代码,只会输出2020年8月上证指数的前5条数据,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_64.jpg?sign=1738791942-L30L7QNjpEFq5JkZpIANR40InBrIMLA1-0-c76c416bd9d8f5fffb00739c09d55f01)
如果只需要输出每个月最后一个交易日的上证指数数据,则可以使用resample()函数和last()函数,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_65.jpg?sign=1738791942-KCHige5DzTYykn3qo14uJAyIKMpxC2Q6-0-8d91661ddc3be5949718b8d7a43c35ce)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_66.jpg?sign=1738791942-fnIeBKZ5Hs40TTMNnB7Tg9QC0XKkviHo-0-2653c9f55c25eb5c0e7d375bd6b225cf)
如果想要计算每个月股票相关指标的平均数,则可以使用mean()函数,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_67.jpg?sign=1738791942-9IwHsrEbqnj8zCDm21PpFnWvFAXRLU0Y-0-cf70cf482b636da64ce49be3446f5751)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_68.jpg?sign=1738791942-MRCVGVYLLOAMSMFrX7bHIjRc0dxK4yT7-0-aa4db6bcca08bf5f79810943bc7c5c52)
4.4.3 填充非交易日缺失数据
下面来看一下时间序列数据中有缺失数据的操作。如果想要查看股票每日的价格信息,则可以使用resample()函数重采样每一天的数据,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_69.jpg?sign=1738791942-vhjGDl9Zyv6IYHihHGQCr1nYPFO7htkf-0-35cac395f484d31ac45c00dd1abca197)
运行上述代码,输出结果如下所示。我们可以看出,2020年1月4日和1月5日的数据都为NaN。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_70.jpg?sign=1738791942-R4y2oyCHvRnVUF9q16HLC4kLY0HcWx88-0-8bf7828a634bf7caf53092d7e11b887f)
下面使用ffill()函数对缺失数据进行填充,这里使用前一天的交易数据来填充,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_71.jpg?sign=1738791942-a9qQWFt6R1V9VmfJ18zIMv4NGoeI7Xcb-0-ddeb7ef850455efbe00e730d0a6dce95)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_72.jpg?sign=1738791942-wxl1RBrCn6hkIDjAxWNup9Pr31YxRhAO-0-b2813e73566e088bdfbc0d25d7784356)
也可以使用mean()函数对该列数据的平均数进行填充,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_73.jpg?sign=1738791942-mXbmRJaZur2rQjimeGmZQOzLY0OE3RO2-0-4bc5194fdd83c0fbe225f5ca86b1a7b0)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_74.jpg?sign=1738791942-cr8kBaLQXL8hGIjIc8FkgHwrsvS6vzoZ-0-5ee1e99ba031e042f38ff09246b0af25)
4.4.4 使用diff()函数计算数据偏移
Pandas库中的diff()函数用来将数据进行某种移动之后与原数据进行比较得出差异。例如,计算两个相邻交易日数据之间的一阶差分,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_75.jpg?sign=1738791942-ycdBrf0gplrUrHpy7CVViYCNppJuZDbF-0-b4cf0e169ba8c1088d2563e955ce6cae)
运行上述代码,计算金融时间序列数据的一阶差分,输出结果如下所示。2020年1月2日的数据为NaN,是因为它的前一天(2020年1月1日)没有交易。同理,如果执行的是二阶差分,则2020年1月3日的数据也是NaN。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_76.jpg?sign=1738791942-EVv0H9n9MLAPTv776WKuRIVIgZQVAHgt-0-5ad0dd306f9d155a2a9e8d007ed26ec5)
此外,对于时间序列数据,还可以使用pct_change()函数来计算指标的增长率,代码如下:
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_77.jpg?sign=1738791942-iMln6EGx6X3gsNwyJ7HOwD2YNcZFN3RY-0-416c80705c35b1fd746da45bcb027c08)
运行上述代码,输出结果如下所示。
![img](https://epubservercos.yuewen.com/450204/20862583108963306/epubprivate/OEBPS/Images/txt006_78.jpg?sign=1738791942-bqjsg4zuCBGnLeQ6UL59c94tipI1IkFV-0-07ddf35a4f7f5741b0e1f42c185b9533)