Python大数据分析7:案例-让股票趋势画出来

我们接着这个股票的案例再来说明。

在实际数据分析中,我们常常需要对时序数据进行可视化,通常可视化呈现,可以更好的把握数据的整体走向分析和发展特点分析。

比如对于目前这个近10年的股票数据,我们很想看看整体走势是什么样子?于是我们准备利用Python的可视化绘图工具包来实现。

Python有很多可视化绘图工具包,其中比较常见的是matplotlib。我们来看看。

要想使用这个工具包,首先还是要像以前使用pandas一样,在设置中安装,具体仍然是点击文件菜单,选择设置,在项目选中项目解释器,并点击右边的加号,在弹出窗口中输入matplotlib,即可搜索安装。具体过程不再细述。

首先准备好数据,我们按照上次案例中的写法,将时间信息抽取为索引,做好进一步数据分析的准备工作。

# coding:utf-8

import pandas as pd

frame = pd.read_csv(‘C:\\temp\\股票数据.csv’, encoding=’GBK’)

frame = frame.set_index(‘日期’)

frame.index = pd.to_datetime(frame.index)

print(frame)

接下来,我们从简单的开始,直接看看每日收盘价的变化。

# coding:utf-8

import pandas as pd

import matplotlib.pyplot as plt

frame = pd.read_csv(‘C:\\temp\\股票数据.csv’, encoding=’GBK’)

frame = frame.set_index(‘日期’)

frame.index = pd.to_datetime(frame.index)

plt.figure(figsize=(8, 4), dpi=100)

plt.plot(frame[‘收盘价’])

plt.show()

这里的关键点有几个:

第一要记得导入matplotlib包,为简化写法,可以给包起个别名。

import matplotlib.pyplot as plt

第二需要设定下画布的大小和分辨率,8和4分别表示默认的英寸,dpi表示分辨率,越小图像越清晰,越大粒度越大越粗糙。

plt.figure(figsize=(8, 4), dpi=100)

第三需要设定绘制的内容,此时我们直接将收盘价作为绘制的数据内容。

plt.plot(frame[‘收盘价’])

第四直接显示即可。

plt.show()

这是它的显示情况,总体呈现一种下降的趋势。不过,早期有几段间断,来自于当时没有交易产生的暂停现象。由此也看出原始数据通常需要进行一些必要的处理才能更好的看出趋势和特点。

值得注意的是,原始数据时间顺序是从最近到最远,即使再混乱也没有关系,最终时间索引会自动排成从远到近的时间序列。

对于这种不平整,常见的一种处理策略就是平滑,比如使用移动窗口方法,将几个临近时间点上的数据进行平均等操作,产生一种更为平滑的显示效果,同时还不改变整体显示趋势。

比如我们进行了包括每个点在内往前200个数值,不断滚动处理,对于每个时间点对应的200个数据都以一个平均值作为该时间点的最终输出数值。

plt.plot(frame[‘收盘价’].rolling(200).mean())

大家注意线条开始的位置偏后了很多,共计200天的数据量。

但是可以想象,这个图的一开始,由于每个时间点前没有200个数值,因此无法完成滚动计算,一般系统会使用空值来填充。为了能够使得图像更为完整,可以考虑对于前面200个时间点,前面要求的时间点数量也可以适当缩小,比如通过min_periods参数指定最小的数量范围,从而使得空值产生的更少一些。

print(frame[‘收盘价’].rolling(200, min_periods=2).mean())

显然这个有值观测点的最小数量应该小于200,大于等于1,当等于1时,表示每个观测点都有值。

这些可以通过数据输出看的更为明显一些。

当然,为了实现更好的分析,还可以尝试使用更多的方法。比如扩展窗口平均,它是指从时间序列的起始处开始窗口,不断增加窗口长度直到它超过所有的序列,形成长度越来越长的各个序列。这里的10是指min_periods,即有值观测点的最小数量。

plt.plot(frame[‘收盘价’].expanding(10).mean())

不同的分析方法具有不同的价值,大家可以通过学习一些必要的统计时序分析方法来加深对方法应用的理解。

再如指数加权移动统计,它可以实现时间衰减效果,各数值的加权系数随时间呈指数式递减,越靠近当前时刻的数值加权系数就越大。

plt.plot(frame[‘收盘价’].ewm(span=30).mean())

span表示指定衰减的范围。

再比如百分数变化,即后一个值和前一个值的差值占前一个值的比例。

plt.plot(frame[‘收盘价’].pct_change())

其中几次较大的幅度正好对应中间几段空白的停止交易记录。

比较复杂的还可以计算相关性,比如对开盘价和收盘价,进行两者平滑后的相关度:

series1 = frame[‘开盘价’].pct_change()

series2 = frame[‘收盘价’].pct_change()

plt.plot(series1.rolling(20).corr(series2))

corr表示相关度计算。

显然,大家如果想要更好的使用这些时序方法,首先就要了解这些常见统计方法,其次也要知道pandas提供了哪些对应的实现方法,这样就可以更好的应用。

如果已有的这些方法都不能满足要求,那就需要自己来编写函数扩展功能。这里我们并不打算介绍太深入,但是可以把基本方法说明下,那就是仍然调用apply方法实现对更多自定义函数的调用。这一块介绍主要面向有Python基础的同学。

比如我们定义了一个求平方的函数:

def f(x):

    return x * x

然后我们对每个平滑后的平均值做进一步的平方处理:

plt.plot(frame[‘收盘价’].rolling(10).mean().apply(f))

可以看出,纵轴数据明显变大了。

发表评论

邮箱地址不会被公开。 必填项已用*标注