0 准备工作

首先,使用pip方法安装pandas和pandas-datareader两个功能包. 安装的方法十分简单,以管理员身份运行cmd. 输入以下命令。

$ pip install pandas

$ pip install pandas-datareader

需要注意的是,安装pandas时将自动安装numpy等功能包,因此可以使用pandas即代表安装了numpy功能包。今后,在安装所有Python所需功能包时,皆可使用以上方法。

在Yahoo Finance对API进行升级后,你可能需要安装最新开发版本(latest development version)的pandas-datareader(目前是0.5.0版本),才能对雅虎财经的部分数据进行访问,安装方法可以参考原git。

pandas-datareader包中的pandas_datareader.data.DataReader函数可以根据输入的证券Ticker,起始日期和终止日期来返回包含所有历史日价格的数据,其数据类型是DataFrame,这是pandas包引入的一个数据类型。在这里假设需要苹果公司(Ticker: AAPL)从2016年初到今天(2017年4月6日)的历史日价格。

到这里,打开你的Python代码编辑器,你便完成了所有的准备工作。

1 获取股价数据

此处需使用的包是datetime,pandas,和pandas-datareader. 导入datetime的原因是,我们要使用datetime包中的datetime.datetime.today()函数来调用今天的日期。

import datetime

import pandas as pd

import pandas_datareader.data as web

## !!! here it is 'pandas_datareader' rather than 'pandas-datareader'

在以上代码中,import A as B 的作用是导入A,并给A起一个别名叫做B. 此例中,pandas_datareader.data这个名称显然过长,因此给它起一个别名叫做web,这样在后文中使用pandas_datareader.data.DataReader函数时,直接使用web.DataReader即可。一定要注意的是,这里的pandas_datareader中使用的是下划线'_',而非在pip安装时使用的连接符‘-’.

接下来,设置起始日期和终止日期。使用datetime.datetime函数指向给定日期,使用datetime.date.today函数指向今天的日期。运行DataReader函数并将其保存到一个名为prices的变量中。

start = datetime.datetime(2016, 1, 1) # or start = '1/1/2016'

end = datetime.date.today()

prices = web.DataReader('AAPL', 'yahoo', start, end)

print prices.head() # print first rows of the prices data

注意DataReader函数中第二个参数代表数据来源,DataReader支持包括雅虎、谷歌在内的十数种数据来源,本篇笔记只关注来源为雅虎财经的数据。

观察一下获得的prices数据的前六行(含列名),

Open High Low Close Volume \

Date

2016-01-04 102.610001 105.370003 102.000000 105.349998 67649400

2016-01-05 105.750000 105.849998 102.410004 102.709999 55791000

2016-01-06 100.559998 102.370003 99.870003 100.699997 68457400

2016-01-07 98.680000 100.129997 96.430000 96.449997 81094400

2016-01-08 98.550003 99.110001 96.760002 96.959999 70798000

Adj Close

Date

2016-01-04 102.612183

2016-01-05 100.040792

2016-01-06 98.083025

2016-01-07 93.943473

2016-01-08 94.440222

这个DataFrame的index是日期,总共有六列数据,通常情况下我们只关注最后一列Adjusted Closing Price 并使用它计算收益率。Adj Close的好处是已将所有的权重、分割和股利分发等因素考虑在了价格中进行调整。

2 获取股利数据

pandas-datareader包也可以用来获取股利或股票分割等数据,只要将DataReader函数中的数据源参数修改为'yahoo-actions'即可。

actions = web.DataReader('AAPL', 'yahoo-actions', start, end)

print actions.head()

这样返回的actions仍是一个DataFrame类型的变量,其index为日期。观察前六行的数据。

action value

2017-02-09 DIVIDEND 0.57

2016-11-03 DIVIDEND 0.57

2016-08-04 DIVIDEND 0.57

2016-05-05 DIVIDEND 0.57

2016-02-04 DIVIDEND 0.52

此处的action表示证券所进行的操作,如派发股利,或股票分割等等,而value则表示操作值。我们可以看到,苹果公司最近一笔股利发放是在2017年2月9日,每股发放了0.57美元的股利。

值得一提的是,如果在给定日期内,该证券并没有操作活动,DataReader函数将返回一个空的DataFrame,既没有index,也没有列名。

print web.DataReader('AAPL', 'yahoo-actions', datetime.datetime(2017, 4, 1), datetime.date.today())

输出结果为,

Empty DataFrame

Columns: []

Index: []

3 合并股利和股价数据

因为actions的index是prices的index的一个子集,所以我们可以直接将actions的各列添加到prices后面。下面介绍两种合并股利和股价的方法。

第一种方法思路比较简单,直接将actions的每一列提取出来,添加到prices后面。

一个DataFrame变量的某一列单独提取出来,是一个Series变量,这也是pandas包中独有的一个数据类型。通常,在列名不含空格和连接符的情况下,可以直接将列名作为DataFrame变量的Attribute进行调用。如actions.action即为actions中action这一列,它的类型是Series. 而在prices变量中,‘Adj Close’列,因为列名中含有空格,只能使用prices['Adj Close']来调用。

Attribute可以理解为一个对象(如prices,actions,甚至start,end等等)所包含的一系列属性、方法、函数等等,如在之前使用的prices.head()即是在调用prices的head这一Attribute.

将actions的列调用出来后,即可对prices的新列进行赋值。

prices['action'], prices['value'] = actions.action, actions.value

print prices

观察合并后的数据中间的某几行。

Open High Low Close Volume \

Date

...

2016-02-01 96.470001 96.709999 95.400002 96.430000 40943500

2016-02-02 95.419998 96.040001 94.279999 94.480003 37357200

2016-02-03 95.000000 96.839996 94.080002 96.349998 45964300

2016-02-04 95.860001 97.330002 95.190002 96.599998 46471700

2016-02-05 96.519997 96.919998 93.690002 94.019997 46418100

2016-02-08 93.129997 95.699997 93.040001 95.010002 54021400

...

Adj Close action value

Date

...

2016-02-01 93.923996 NaN NaN

2016-02-02 92.024676 NaN NaN

2016-02-03 93.846074 NaN NaN

2016-02-04 94.600127 DIVIDEND 0.52

2016-02-05 92.073538 NaN NaN

2016-02-08 93.043048 NaN NaN

...

可以发现,所有没有action和value的日期,该处数值将为NaN(Not a Number),而有效的股利数据被加入了相应行中。

第二种方法是使用pandas包中的merge函数,它可以根据一定规则将两个DataFrame变量合并。

prices = pd.merge(prices, actions, how='outer', left_index=True, right_index=True)

print prices

以上代码,可以得到与第一种方法同样的结果。其中how='outer'是说最后合并结果的长度将是prices和actions中较长的长度,因此才会有NaN的出现。left_index和right_index都设为True,即当左右DataFrame的index相符时才合并。

4 输出为CSV文件

DataFrame类型有一个Attribute可以直接将数据导出为CSV文件。如将合并好的股价和股利数据保存到根目录out文件夹中,并起名为AAPL.csv.

prices.to_csv('.\\out\\AAPL.csv)

其中.to_csv()方法需要一个字符型参数,即所需保存路径。在该字符串中,'.'表示working directory,使用PyCharm等编译器的话,一般都是代码文件所在的目录。而两个反斜杠表示文件夹的层级关系,之所以用两个,是因为''在字符串中有转义作用。

需要注意的一点是,此例中,'.\out'文件夹应事先建好。直观的方法是直接新建文件夹,并命名为'out'. 使用Python的os包也可以实现。

import os

os.mkdir('.\\out')

将prices导出为CSV文件后,可以打开查看。也可以使用EXCEL进行操作。

Date,Open,High,Low,Close,Volume,Adj Close,action,value

...

2016-02-01,96.470001,96.709999,95.400002,96.43,40943500,93.923996,,

2016-02-02,95.419998,96.040001,94.279999,94.480003,37357200,92.024676,,

2016-02-03,95.0,96.839996,94.080002,96.349998,45964300,93.846074,,

2016-02-04,95.860001,97.330002,95.190002,96.599998,46471700,94.600127,DIVIDEND,0.52

2016-02-05,96.519997,96.919998,93.690002,94.019997,46418100,92.073538,,

2016-02-08,93.129997,95.699997,93.040001,95.010002,54021400,93.043048,,

...

Python可以很方便地对金融数据进行相关操作,我将在未来的笔记中讨论具体的做法。如果您发现任何问题或有任何疑问,欢迎指正或讨论。

by JohnnyMOON, COB @UIUC

这只是做Finance作业的学习笔记

EM: gengyug2@illinois.edu

pythonreader下载_使用Python的pandas-datareader包下载雅虎财经股价数据相关推荐

  1. python处理数据的包_在Python中利用Into包整洁地进行数据迁移的教程

    动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...

  2. python网站迁移_在Python中利用Into包整洁地进行数据迁移的教程

    动机 我们花费大量的时间将数据从普通的交换格式(比如CSV),迁移到像数组.数据库或者二进制存储等高效的计算格式.更糟糕的是,许多人没有将数据迁移到高效的格式,因为他们不知道怎么(或者不能)为他们的工 ...

  3. python gevent模块 下载_【python安全攻防】包、模块、类、对象

    终于又到了一周一度的整理博客的时间了,博主平时课余时间看书,周末统一整理,坚持周更真是爱了爱了 - 今天要说的是python面向对象这一部分的内容,今天这是基础篇的第二篇,也是最后一篇. 说来基础篇还 ...

  4. python beautifulsoup下载_使用Python和BeautifulSoup从网页下载.xls文件

    你的剧本目前的问题是:url有一个尾随的/在请求时给出一个无效的页面,而不是列出要下载的文件. soup.select(...)中的CSS选择器正在选择具有属性webpartid的div,该属性在链接 ...

  5. python 小说下载_通过python自动获取小说并下载

    1 importurllib.request2 importos3 4 headers ={5 "User-Agent": "Mozilla/5.0 (Windows N ...

  6. java我的世界行尸走肉_我的世界行尸走肉游戏下载_我的世界行尸走肉整合包下载_快吧单机游戏...

    <我的世界:行尸走肉>是<我的世界>的一款mod整合包,<行尸走肉>的主题不管是从剧情还是从可玩性都有可圈可点之处.玩家想要在<我的世界>中玩<行 ...

  7. Python中用pandas将numpy中的数组数据保存到csv文件

    Python中用pandas将numpy中的数组数据保存到csv文件 本博客转载自:[1]https://blog.csdn.net/grey_csdn/article/details/7018587 ...

  8. spotify音乐下载_使用Python和R对音乐进行聚类以在Spotify上创建播放列表。

    spotify音乐下载 Spotify is one of the most famous Music Platforms to discover new music. The company use ...

  9. pythonspark集群模式运行_有关python numpy pandas scipy 等 能在YARN集群上 运行PySpark

    有关这个问题,似乎这个在某些时候,用python写好,且spark没有响应的算法支持, 能否能在YARN集群上 运行PySpark方式, 将python分析程序提交上去? Spark Applicat ...

最新文章

  1. Linux下redis的安装(适用centos)
  2. 《Android App开发入门:使用Android Studio 2.X开发环境》——导读
  3. python信用卡违约_Python数据分析及可视化实例之银行信用卡违约预测(24)
  4. 在 emu8086 中学习汇编In,Out指令
  5. python向数据库传输数据时弹出not enough arguments for format string怎么办
  6. matlab adc仿真,[转载]关于ADC仿真做FFT的设置和结果分析
  7. method=post 怎么让查看源代码看不到_网上文档无法复制怎么办?试试这几个方法!...
  8. Android自定义view详解,使用实例,自定义属性,贝塞尔曲线
  9. MyBatis-Plus_快速入门0222
  10. 惠普服务器u盘做win7系统,惠普u盘装win7系统 利用u盘装win7系统
  11. java三色球问题_2020100期专业玩彩双色球走势分析
  12. 技术和技术管理人员评价标准
  13. 直播聊天室源码php,某网络直播聊天室源码 财经直播聊天系统
  14. C语言小案例_OA大典故障案例摘录【第1393篇】爱普生c5290 彩色喷墨打印机 打印横白道...
  15. Xmind模板文档分享——知识结构(5)
  16. 小草客户端android2.2.4 g,小草客户端android2.2.5-小草app安卓版客户端android2.2.5预约 v2.2.5-优盘手机站...
  17. laravel 文档
  18. 【python】PyQt6和pyqt6-tools在PyCharm2021的详细配置方法
  19. 知识图谱实战开发案例剖析(22)Protege开发环境安装部署
  20. certbot 安装ssl证书

热门文章

  1. 怎么批量修改图片名称?
  2. 从Web日志还原SQL注入拖走的数据
  3. 宣传活动任务后台管理之促销活动业务分析...
  4. 日本IT巨头富士通完成区块链电力共享项目测试
  5. 文件批量改名工具v2.0_绿色免安装版
  6. 记一次腾讯远程电话面试
  7. python把txt导入excel,python如何将txt文件导入Excel?
  8. 全球及中国高岭土市场运行规模与投资发展建议报告2022版
  9. 自编高中数学---排列组合公式推导
  10. Js 在字符串中提取数字