上一篇文章中,我们自动抓取了票交所在收益率曲线板块,公布的每日价格。具体文件如下图:
如果就让这些文件躺在文件夹了,不做点什么,似乎对不起之前敲的代码。
今天我们就来使用pandas库,对这些数据进行一番处理。
首先,我们打开一个2018-12-05的Excel表格,查看原始数据的格式。
从票交所官网下载的数据十分整齐,分列记录了日期,关键期限,利率和收益率。如此漂亮的数据省去了最繁琐的数据清洗工作。现在我们要做的就是把这15个Excel表格的数据整合到一起,以便于分析。
本次程序我们使用的库如下:
importpandasaspd
fromdatetimeimportdate, timedelta
importmatplotlib.pyplotasplt
importnumpyasnp
首先我们需要读取数据,用while循换依次读取数据,并将其加入到一个列表(Rate_list)中。由于原始数据的列名为中文[‘日期’, ‘关键期限’, ‘利率’, ‘收益率’],现将其改变成[‘day’, ‘keydate’, ‘R’, ‘Y’],便于后续操作。用于读取的程序如下:
Rate_list = []
columns_names = ['day','keydate','R','Y']
#确定起始日期
start_day = date(2018,12,5)
#初始化目标日期
target_day = start_day
#确定截止日期
end_day = date(2018,12,26)
#循环读取全部目标文件
whiletarget_day
try:
#定义目标文件的路径
path ='G:/BillRate/%s.xls'% target_day.strftime('%Y-%m-%d')
#读取目标文件,同时自定义columns(列名)
BillRate = pd.read_excel(path,names=columns_names)
#将读取的数据加入到Rate_list
Rate_list.append(BillRate)
#跳过节假日
exceptFileNotFoundErrorase:
pass
#前进一天
target_day += timedelta(days=1)
将Rate_list中的数据进行合并,代码如下:
#合并原始数据
Rate_data_original = pd.concat(Rate_list,ignore_index=True)
Rate_data_original中的数据格式如下:
将day列和keydate列设为行索引,代码如下:
#在原始数据上,将'day'列和‘keydate'列设置为新的索引
Rate_data1 = Rate_data_original.set_index(['day','keydate'])
得到的数据结构如下图:
再将day列设为列索引:
#将数据中'day'列转换成列索引
Rate_data2 = Rate_data1.unstack('day')
#获取keydate列的初始排序
index_original = Rate_data_original['keydate'].loc[:13].values
#恢复index至初始排序
Rate_data3 = Rate_data2.reindex(index_original)
得到的数据结构如下:
至此整个数据规整完毕,最终的数据结构如上图,每行数据表示相应期限的票据在2018-12-05至2018-12-25期间,每日的利率和收益率,其中R项下为利率,Y项下为收益率。下面就可以对数据进行分析了。
由于在票据交易过程中,相较于收益率,利率的使用更为普遍,所以我们只取出利率(R)项下的数据进行分析:
Rate_data_R = Rate_data3['R']
数据结构如图:
计算各个期限票据的最高价格,最低价格,平均价格以及标准差:
#计算各期的最大数
rate_max = Rate_data_R.max(axis=1)
#计算各期的最小数
rate_min = Rate_data_R.min(axis=1)
#各期限的平均数
rate_mean = Rate_data_R.mean(axis=1)
#各期限的标准差
rate_std = Rate_data_R.std(axis=1)
得出的结果如下图:
下面我们需要进行可视化操作了,选取四个典型期限的数据,使用matplotlib库进行绘图:
#选取典型期限进行视图化
df = Rate_data_R.loc[['1Y','6M','3M','1M']]
#调整索引位置将'day'调整为index,keydate调整为columns
df = df.stack().unstack('keydate')
df.plot()
#设置y轴刻度
plt.yticks(np.arange(2.8,3.8,0.1))
plt.show()
输出的结果如下:
从上图可以看出票据价格的走势仍然呈现一个U型,临近年底规模效应越发明显。
本次我们简单的使用了pandas库里的模块进行数据分析,本次只爬取了20天的数据,在数据量较少的情况下优势不是那么明显,等到明年末,如果处理一年的数据,那通过手工操作基本无法实现,只能借助程序,代码的有用性就体现在这里。
领取专属 10元无门槛券
私享最新 技术干货