本文是利用python来分析金融数据的一个入门教程,同时也是数据分析利器pandas
的一个实战教程。文中将利用pandas
来分析中国A股历史交易数据,数据来源为tushare
。
由于大数据、人工智能技术的快速发展,国内外许多金融机构早就不仅仅专耕于金融领域,并且在大数据分析、自动化策略等方面投入了大量的精力,因为数据科学与计算机技术的发展不仅可以大幅提高传统交易模式的速度,提高准确度,并且能够自动化管理更大的数据量,尤其在国外,利用数据分析和自动化交易技术早已经成为了主流。
下面将数据处理的代码贴在下面,代码中主要涉及的知识点如下:
- DataFrame和Series的基本结构
- DataFrame的行、列选取方式和规范
- 时间索引的基础和切片
- 滑动窗口和移动平均数
- 数据按时间周期的重采样
具体的讲解请查看代码中的注释,直接看注释不直观?需要清晰、直观的体验点击这里!
通过tushare获取的数据为pandas.DataFrame格式,可以保存在本地
# coding: utf-8
import tushare as ts
df = ts.get_hist_data('000001')
df.to_csv('./000001.csv')
然后可以通过直接读取本地文件来导入数据, read_csv函数的详细介绍查看这里
import pandas as pd
df = pd.read_csv('./000001.csv', header=0, index_col='date')
df.index = pd.DatetimeIndex(df.index) # 将普通字符型索引传化为时间索引
DataFrame是一个二维表,类似于excel的一个sheet中的内容,也类似于数据库中的表的概念。 读入数据后,可以通过许多DataFrame内置的函数来对数据进行一个整体的查看
df.head(10) # 查看前10行数据
df.describe() # 查每一列的行数、期望、各个分位数等
df.shape # 查看数据表的大小
对DataFrame的整体有一个初步的认识之后,下面是对其行和列的选取操作
df['open'] # 可以选取DataFrame的对应的列
df.iloc[0] # 通过此方式来选取数据的行
df.loc['2016-09-27'] # 可以通过索引选取对应的行
df[['open', 'close', 'high']] # 选取多个列
df.iloc[0:3] # 选取多个行
df['2016-09'] # 按照时间索引选取所有的9月数据,只有在索引类型为时间索引时才可以这么操作
df[0:-1:2]
# 从前往后每隔两个数据取一个数据,第一个数为开始行数,第二个数为结束行数(选取到此行之前)
# 第三个数为间隔数目
可以通过DataFrame内置的plot函数来进行画图,其内部是利用了matplotlib实现的。为了画图的美观,首先设置一些画图的参数:
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid') # 设置画图的风格
plt.rc('font', family='SimHei', size=6) #设置图中字体和大小
plt.rc('figure', figsize=(4,3), dpi=200) # 设置图的大小
将其中一列画折线图
df.open.plot() # 索引为时间后,会在图上的x轴以合理的间隔显示
原始数据中,所有的价格都是实际值,实际情况下,我们可能需要价格的变化值,或者是价格的变化率
df.open.diff() # 后一天减去前一天的差值
df.close.pct_change() # 后一天对比前一天的变化率
我们可以对变化率进行初步的统计分析,看看收盘价变化率的概率分布情况
df.close.pct_change().hist(bins=30) # hist函数用于查看一个序列的直方图,bins参数表示将数据分为多少段
可以为DataFrame和Series设置一个指定长度的滑动窗口,然后在窗口长度内进行数据操作,例如求mean,max,min等
df.open.rolling(5).mean() # 以5个数据作为一个数据滑动窗口,在这个5个数据上取均值
df.open.rolling(5).max() # 以5个数据作为一个数据滑动窗口,在这个5个数据上取最大值
# 将原始数据和5日、20日均线画到一个图上,由于需要让数据从时间最远处开始,所以将实际数据倒序
df.open.plot()
df[::-1].open.rolling(5).mean().plot()
df[::-1].open.rolling(20).mean().plot()
对于时间序列数据,除了求移动平均值等常用操作之外,还有一个常用的操作就是对时间数据进行重采样(resample)。
例如上面的示例数据是每日的交易数据,我们需要按周来查看开盘价,即需要对数据按周进行重采样。
需要注意的是,重采样时候DataFrame或Series的索引必须为时间索引。
df.open.resample('W').max() # 按周为采样规则,每周内取最大值
常用采样参数:B:工作日; D:天; W:周; M:月; SM:半月
详情点击查看
df.open.plot()
df.open.resample('7D').max().plot()
写在最后:
文中的代码,以及具体的分析过程,可以点击这里查看和下载