pandas 是数据分析的瑞士军刀。我们今天使用 pandas 来玩一下股票数据,看看能从数据里得到哪些有意思的信息。
pandas 教程
如果你熟悉 Python 的话,官网上的 10 Minutes to pandas 可以让你在短时间内了解 pandas 能干什么事以及是怎么干的。针对每个主题,都可以横向查到大量的资料和例子。
如果你 Python 不熟,但又想用 pandas 玩转数据分析的话,Python for Data Analysis 是本不错的书。书里作者使用美国新生儿的名字得出了一些很有意思的结论。还分析了 movielen 的电影评分数据。熟悉 SQL 的同学应该对这些分析会深有感触,相信这些人用 SQL 写出过这些分析过程类似的代码。这本书的缺点是有点啰嗦,如果你熟悉 Python 又想快速学习的话,看第二章就够了。但这本书很适合不熟悉 Python 的人,书的最后一章还附了 Python 的教程,即如果只玩 pandas 的话,掌握这些 Python 知识就够了,真够贴心。而且本书的作者就是 pandas 的作者。
另外补充一点,最好使用 ipython 环境来玩转数据分析。特别是 ipython notebook ,熟悉快捷键后,用起来会很顺手。本文玩转的股票数据就是使用 ipython notebook。
股票数据下载
搜索 ghancn 可以免费下载 2009 年之前的 5 分钟数据和 1 分钟数据。坦白讲,数据质量不高,里面有不少错误。但不影响我们玩这些数据。数据是以年为单位分不同的文件夹保存的。
我们先看一下某个股票的数据长什么样:
import pandas as pd
import numpy as np
names = ['date',
'time',
'opening_price',
'ceiling_price',
'floor_price',
'closing_price',
'volume',
'amount']
# 读取数据时,我们以日期为索引,并解析成日期格式
raw = pd.read_csv('raw/2008/SH600690.csv', names=names, header=None, index_col='date', parse_dates=True)
raw.head()
time opening_price ceiling_price floor_price closing_price volume amount
date
2008-01-02 09:35 22.50 22.63 22.50 22.51 2042.50 4604723
2008-01-02 09:40 22.51 22.51 22.29 22.37 1545.17 3460503
2008-01-02 09:45 22.39 22.62 22.38 22.62 1744.76 3921443
2008-01-02 09:50 22.60 23.00 22.60 22.95 5339.00 12225939
2008-01-02 09:55 22.98 23.20 22.89 23.20 12577.73 28947824
转化为日交易数据
我们使用 2007 年和 2008 年的数据来作为示例。因为我们更关心是一些长期的趋势,分钟级别的交易数据太细了,我们转换为日数据。
# 股票涨跌幅检查,不能超过 10% ,过滤掉一些不合法的数据
def _valid_price(g):
return (((g.max() - g.min()) / g.min()) < 0.223).all()
# 按照日期分组
days = raw.groupby(level=0).agg(
{
'opening_price': lambda g: _valid_price(g) and g[0] or 0,
'ceiling_price': lambda g: _valid_price(g) and np.max(g) or 0,
'floor_price': lambda g: _valid_price(g) and np.min(g) or 0,
'closing_price': lambda g: _valid_price(g) and g[-1] or