Python数据分析(三):利用Pandas对股票数据进行实战分析

前面已经对Pandas库的基础知识进行了学习,现在利用pandas对股票数据进行分析,看一看我们通过股票的交易数据能获取哪些信息。

一、数据集下载

本次分析用到的数据集是2012年每日间隔5分钟的交易数据,数据的质量可能不高,但是不影响我们的分析,主要目的还是巩固Pandas的学习。我在评论区给出了数据集的链接,大家有需要的可以点开获取,数据集是1999-2012年之间的交易数据,大家可以任意使用其中一组数据进行分析。

二、数据读取

首先,先来看一下数据

import pandas as pd
import numpy as np

names=['date',
      'time',
      'opening_price',
      'ceiling_price',
      'floor_price',
      'closing_price',
      'volume',       #在命名的时候后缀不要带s
      'amount']
raw=pd.read_csv('/opt/jupyter_file/dataset/stock2012csv/SH000018.csv',names=names,header=None,index_col='date',parse_dates=True)
raw.head()
实验数据

接下来,我们将数据进行一下转化,分钟级别的数据太细了,我们转化成日数据

#我们更关心是一些长期的趋势,分钟级别的交易数据太细了,我们转换成日数据
#根据涨跌幅判断数据是否有效,例如每天的涨跌幅不超过10%
def _valid_price(prices):
    return ((prices.max()-prices.min())/prices.min())<0.223
#按日期分组
days=raw.groupby(level=0).agg({#agg函数传入一个字典,键指对应的列名,值指聚合函数如{'sum', 'count', 'mean'}之类
    'opening_price':lambda prices:_valid_price(prices) and prices[0] or 0,
    'ceiling_price':lambda prices:_valid_price(prices) and np.max(prices) or 0,
    'floor_price':lambda prices:_valid_price(prices) and np.min(prices) or 0,
    'closing_price':lambda prices:_valid_price(prices) and prices[-1] or 0,
    'volume':'sum',
    'amount':'sum'
})
days.head()
按日期分组

三、填充数据

观察上面的数据我们发现,2012-01-07和2012-01-08这两天是没有数据的,原因是周末两天不进行股票交易, 所以是没有数据的,但是在我们分析数据时需要连续的数据,所以我们对缺失的数据进行填充,填充的原则是将周末的交易量和金额填充0,价格使用前一天的数据进行填充。

#abs缺少数据处理,周末没有交易
start=days.iloc[0:1].index.tolist()[0]  #开始那一天
end=days.iloc[-2:-1].index.tolist()[0]  #结束那一天
new_idx=pd.date_range(start=start,end=end)  
print(new_idx)
data=days.reindex(new_idx)  #重新索引
zero_values=data.loc[~(data.volume>0)].loc[:,['volume','amount']]#后缀带s会出错
# zero_values
data.update(zero_values.fillna(0))  #交易量和金额填0
data.fillna(method='ffill',inplace=True)#价格用前一天的填充
data.head()
填充数据

四、计算平均波动率

在一定时间周期内,我们用最高价/最低价来作为股票波动的指标。其实当股票出现了波动时,并不一定就坏事。若是一只股票经常都很活跃,却突然变得波动比较小,那么它就有可能会跌。若是一只股票长期都很平稳,却突然有了波动,那么这只股票倒是有涨的可能。所以股票的波动其实是非常正常的现象,我们只需要根据情况而进行操作就好。

1、按月分组

#分组计算
#我们需要计算30个自然日里的股票平均波动周期,这样,我们必须以30天为单位,对所有历史数据进行
#分组。然后逐个分组计算其波动率
#定义产生分组索引的函数
#python2中b/c得到的结果是int,而python3中得到结果是float。range的参数必修是int。此时用//代替/即可得到int的结果
def get_grouping(total,group_len):
    group_count=total//group_len 
    group_index=np.arange(total)
    for i in range(group_count):
        group_index[i * group_len:(i+1)*group_len]=i
    group_index[(i+1) * group_len:]=i+1
    return group_index.tolist()
period=30
group_index=get_grouping(len(data),period)
data['group_index']=group_index
data.head().append(data.tail())
分组索引

2、根据索引分组计算成交额、最低价和最高价

#为负表示先出现最高价再出现最低价,即下跌波动
def get_ceiling_price(price):
    return price.idxmax() > price.idxmin() and np.max(price) or (-np.max(price))

#根据索引分组计算
group=data.groupby('group_index').agg({
    'volume':'sum',
    'floor_price':'min',
    'ceiling_price':get_ceiling_price
})
group.head()
计算结果

3、添加开始日期

date_col=pd.DataFrame({'group_index':group_index,'date':new_idx})
date_col
日期
group['date']=date_col.groupby('group_index').agg('first')#为每个索引添加开始日期
group.head()
结果

4、计算波动率

group['ripples_ratio']=group.ceiling_price/group.floor_price#计算波动率
group.head()

5、波动率排序

#波动率排序
ripples=group.sort_values('ripples_ratio',ascending=False)
ripples

排序

还可以计算一下,前十位和后十位的波动平均值

ripples.head(10).ripples_ratio.mean()#前十个波动平均值
ripples.tail(10).ripples_ratio.mean()#后十个波动平均值

这个就不演示了,有兴趣的同学可以试一下。通过上面的数据计算可以看出中国的股市还是比较凶险的,很容易就会被套牢。

五、计算涨跌幅(每天)

涨跌幅定义为今日收盘价减去昨日收盘价

#计算涨跌幅(每天)
rise=data.closing_price.diff()#diff函数是用来将数据进行某种移动之后与原数据进行比较得出的差异数据
data['rise']=rise
data.head()
每日涨跌幅

注意到第一条记录的涨跌幅为 NaN,因为第一条记录的昨日是没有数据的。
好了,利用pandas对股票数据的分析到这里就结束了,实际的操作颗粒度肯定要比这细的多,大家也不必太纠结分析结果,我们的目的主要是巩固pandas的学习,目的达到就好了。see you ~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容

  • pandas 是数据分析的瑞士军刀。我们今天使用 pandas 来玩一下股票数据,看看能从数据里得到哪些有意思的信...
    kamidox阅读 23,733评论 14 118
  • 本文将使用Python来可视化股票数据,比如绘制K线图,并且探究各项指标的含义和关系,最后使用移动平均线方法初探投...
    派派森森阅读 1,048评论 0 1
  • 测试,对于一个IaaS软件的可靠性、成熟度和可维护性而言,是一个重要的因素.测试在ZStack中是全自动的。这个自...
    泊浮目阅读 1,162评论 0 4
  • 今天下午我去见了一个学生家长,也是我的老乡。 原本是向我推荐一个很好的教育软件,听说具有很好的提分效果,我就去了解一下。
    可人二阅读 40评论 0 0