第一阶段、一个简单策略入门量化投资

1.1股票数据预处理练习

无论我们要对股票市场进行何种探索,在开始前,研究如何获取数据,并进行对应的预处理都是必要的。

本节以美股为例,进行股票数据预处理的练习。正文如下:

利用Yahoo财经提供的接口,获取一家公司的股票是相当容易的。下面这段代码可以获取苹果公司16年至今的股数

据。

import pandas as pd
import pandas_datareader.data as web
import datetimestart = datetime.datetime(2010,1,1)
end = datetime.date.today()
apple = web.DataReader("AAPL", "yahoo", start, end)
print(apple.head())

得到的数据如下所示:

                 Open       High        Low      Close  Adj Close   Volume

Date

2015-12-31 107.010002 107.029999 104.820000 105.260002 101.703697 40912300

2016-01-04 102.610001 105.370003 102.000000 105.349998 101.790649 67649400

2016-01-05 105.750000 105.849998 102.410004 102.709999  99.239845 55791000

2016-01-06 100.559998 102.370003  99.870003 100.699997  97.297760 68457400

2016-01-07  98.680000 100.129997  96.430000  96.449997  93.191338 81094400

你也许已经发现,受网络的影响,上面这段代码不一定能够运行成功,可能出现连接远程服务器失败的情况,那么把获取到的数据存到本地,需要时再读取就是件很自然的工作了。下面这段代码,模拟了将苹果公司股票数据保存成.csv文件,并在需要时读取的过程。

##### save data
apple.to_csv(path_or_buf='data_AAPL.csv')##### read the data from .csv when need
apple=pd.read_csv(filepath_or_buffer='data_AAPL.csv')
print(apple.head())

请仔细对比从.csv文件中重新读取的数据发生的变化

        Date      Open      High       Low     Close Adj Close    Volume

0 2009-12-31 30.447144 30.478571 30.080000 30.104286 27.083506  88102700

1 2010-01-04 30.490000 30.642857 30.340000 30.572857 27.505054 123432400

2 2010-01-05 30.657143 30.798571 30.464285 30.625713 27.552608 150476200

3 2010-01-06 30.625713 30.747143 30.107143 30.138571 27.114347 138040000

4 2010-01-07 30.250000 30.285715 29.864286 30.082857 27.064222 119282800

可以看到,重新读取的数据的索引列发生了变化,这并不希望被看到,因为使用时间作为数据的索引列将会使后续的数据处理更加方便,也更加合理。

因此,使用如下代码来修改从.csv中读取的数据,使其恢复最初的样子。

date_list = []
for i in range(len(apple)):date_str = apple['Date'][i]t = time.strptime(date_str, "%Y-%m-%d")temp_date = datetime.datetime(t[0], t[1], t[2])date_list.append(temp_date)
apple['DateTime'] = pd.Series(date_list,apple.index)
del apple['Date']
apple = apple.set_index('DateTime')

还有一点需要注意,从Yahoo获取的数据中,只有收盘价提供了调整后的收盘价。但使用调整后收盘价与收盘价的比例,可以很容易的将开盘价,最低价,最高价的调整后价格计算出来。于是实现如下函数:

def ohlc_adjust(dat):return pd.DataFrame({"Open": dat["Open"] * dat["Adj Close"] / dat["Close"],"High": dat["High"] * dat["Adj Close"] / dat["Close"],"Low": dat["Low"] * dat["Adj Close"] / dat["Close"],"Close": dat["Adj Close"]})

最后,我们将上面的内容进行整合,使得程序能够批量的获取、保存、读取、修改不同公司的股票数据。这分别通过实现stockdata_preProcess.py中的三个函数实现(代码在文末)

downloadAndSaveData()

repairAndGetData()

ohlc_adjust()

此时,我们只需提供一个所关心公司的股票代码列表即可完成预处理工作,例如:

listed_company_list = ["AAPL", "MSFT", "GOOG", "FB", "TWTR", "NFLX", "AMZN", "SNY", "NTDOY", "IBM", "HPQ"]

调用函数downloadAndSaveData(listed_company_list,start,end),可以自动获取所提供列表中的公司,从startend时间段内的股票数据。由于网络可能出现问题,代码中还加入了失败重连的机制。测试效果如下,所需的数据已经都保存到相应的.csv文件中了:

-----------------------------------------------------------------------------------------------------------------------------------------------------------

完整代码:

import pandas as pd
import pandas_datareader.data as web
import datetime
import time
import os# download the stock data
# parameter explanation:
# start & end : the time interval of the data we want to get(from start to end)
#     e.g :  start = datetime.datetime(2010, 1, 1)
#        end = datetime.date.today()
# listed_company_list : the list of listed companies that we are concerned about
#     e.g : listed_company_list = ["AAPL", "MSFT", "GOOG", "FB", "TWTR", "NFLX", "AMZN", "YHOO", "SNY", "NTDOY", "IBM", "HPQ"]
def downloadAndSaveData(listed_company_list, start, end):downloadResult_list=[] # use downloadResult_list to denote whether the data has download successfullyfor index in range(len(listed_company_list)):downloadResult_list.append(False)# start downloading data...for index in range(len(listed_company_list)):companyStr = listed_company_list[index]filename = "data_" + companyStr + ".csv"if os.path.exists(filename): # if the file has existed, we don't need to download againprint(companyStr+"'s data has already exists ^_^")downloadResult_list[index]=TruecontinuetryNumbers = 0max_tryNumbers = 10while tryNumbers<max_tryNumbers :try:print(companyStr + " data connecting start...")# try to get data, this may throw exceptiondata = web.DataReader(companyStr, "yahoo", start, end)# save data in .csvdata.to_csv(path_or_buf=filename)print(companyStr + "'s data has successfully saved in " + filename + " ^_^")downloadResult_list[index]=Truetime.sleep(10)breakexcept Exception as e:print("error:",e)print("connecting failed, waiting to reconnect...")tryNumbers += 1time.sleep(5*tryNumbers)if tryNumbers == max_tryNumbers:print("give up to get "+companyStr+"'s data -_-|")print("the result shows below:")for index in range(len(listed_company_list)):print(listed_company_list[index] +" : " + str(downloadResult_list[index]))return downloadResult_list# get the data we save in .csv file (download and save by function downloadAndSaveData)
# and then return the repaired data to the user
# why repair?
# note that some format(data type) of data we read from .csv has changed
# for example the attribute 'Date' should be the index of the dataframe, and the date type changed from datetime to string
# this changes would made some methods got trouble. So we need to repair the data before return
def repairAndGetData(listed_company_list):companyNumber = len(listed_company_list)DataSetList = []# traverse all the listed companiesfor c in range(companyNumber):cur_companyStr = listed_company_list[c]cur_fileName = "data_" + cur_companyStr + ".csv"cur_companyData = pd.read_csv(filepath_or_buffer=cur_fileName)# repair current company's data# change the data type of attribute "Date" from string to datetime, and let it become the index of the dataframedate_list = []for i in range(len(cur_companyData)):date_str = cur_companyData['Date'][i]t = time.strptime(date_str, "%Y-%m-%d")temp_date = datetime.datetime(t[0], t[1], t[2])date_list.append(temp_date)cur_companyData['DateTime'] = pd.Series(date_list, cur_companyData.index)del cur_companyData['Date']cur_companyData = cur_companyData.set_index('DateTime')# save the repaired dataDataSetList.append(cur_companyData)# return all the repaired data in the original orderreturn DataSetList# adjust the price of ohlc("Open","High","Low","Close")
# normally only interface only provides the adjust price of 'Close'
# but it is easy to adjust the price by the proportion of 'Adj Close' and 'Close'
def ohlc_adjust(dat):return pd.DataFrame({"Open": dat["Open"] * dat["Adj Close"] / dat["Close"],"High": dat["High"] * dat["Adj Close"] / dat["Close"],"Low": dat["Low"] * dat["Adj Close"] / dat["Close"],"Close": dat["Adj Close"]})

1.1股票数据预处理练习相关推荐

  1. python股票数据预处理_Python股票处理之六_数据预处理A

    1. 说明 在数据统计和预测的过程中,工程师基本都使用现成的算法,工程师的主要工作是根据具体业务逻辑预处理数据和选择算法. 首先要对数据预处理(数据清洗),包括数据的归一化,去除重复数据,修改错误数据 ...

  2. python股票数据预处理_PythonStock(14):使用pandas 批量处理股票数据,批量计算股票指标...

    前言 使用Python开发一个股票项目. 项目地址: https://github.com/pythonstock/stock 相关资料: http://www.voidcn.com/article/ ...

  3. Python股票处理之六_数据预处理A

    1.        说明 在数据统计和预测的过程中,工程师基本都使用现成的算法,工程师的主要工作是根据具体业务逻辑预处理数据和选择算法. 首先要对数据预处理(数据清洗),包括数据的归一化,去除重复数据 ...

  4. excel量化交易接口系统程序怎样进行数据预处理?

    在数据统计和预测的过程中,工程师基本都使用现成的算法,工程师的主要工作是根据具体业务逻辑预处理数据和选择算法,即可以使用excel量化交易接口系统来进行数据预处理. 首先要对数据预处理包括数据的归一化 ...

  5. 数据预处理 泰坦尼克号_了解泰坦尼克号数据集的数据预处理

    数据预处理 泰坦尼克号 什么是数据预处理? (What is Data Pre-Processing?) We know from my last blog that data preprocessi ...

  6. 属性子集选择的基本启发方法_一文看懂数据预处理最重要的3种思想和方法

    导读:本文我们考虑应当采用哪些预处理步骤,让数据更加适合挖掘.数据预处理是一个广泛的领域,包含大量以复杂的方式相关联的不同策略和技术.我们将讨论一些最重要的思想和方法,并试图指出它们之间的相互联系. ...

  7. 一文看懂数据预处理最重要的3种思想和方法

    导读:本文我们考虑应当采用哪些预处理步骤,让数据更加适合挖掘.数据预处理是一个广泛的领域,包含大量以复杂的方式相关联的不同策略和技术.我们将讨论一些最重要的思想和方法,并试图指出它们之间的相互联系. ...

  8. 【R】【课程笔记】04+05 数据预处理+收益率计算

    本文是课程<数据科学与金融计算>第4-5章的学习笔记,主要介绍金融数据处理.收益率计算和R与C++调用,用于知识点总结和代码练习,Q&A为问题及解决方案. 往期回顾: 博文 内容 ...

  9. Python量化交易实战:获取股票数据并做分析处理

    量化交易(也称自动化交易)是一种应用数学模型帮助投资者进行判断,并且根据计算机程序发送的指令进行交易的投资方式,它极大地减少了投资者情绪波动的影响.量化交易的主要优势如下: 快速检测 客观.理性 自动 ...

  10. 【数值预测案例】(6) LSTM、GRU 时间序列股票数据预测,附TensorFlow完整代码

    大家好,今天和各位分享一下如何使用循环神经网络 LSTM 和 GRU 完成对股票数据的预测.GRU 是在 LSTM 基础上的简化,将 LSTM 内部的三个闸门简化成两个,往往 GRU 的计算效果会优于 ...

最新文章

  1. 【机器学习基础】(三):理解逻辑回归及二分类、多分类代码实践
  2. SIGIR 2021 | 深入探索犯罪情节,中科大提出基于环境感知的法律判决预测
  3. Google 开源图形着色器测试框架 GraphicsFuzz
  4. 本地方法(JNI)——访问域+字符串参数
  5. 【原创】什么是 wire protocol
  6. 从程序员到项目经理(13):如何管理自己的时间(下)【转载】
  7. [ 总结 ] 删除通过find查找到的文件
  8. Android TextureView简易教程
  9. python bottle session-使用beaker让bottle支持session
  10. 使用Dockerfile构建镜像-Docker for Web Developers(5)
  11. HTML5+CSS3从入门到精通随书光盘 ISO 镜像视频教程​
  12. 天津大学计算机学院王培懿,t即tboxa即abox-天津大学计算机科学与技术学院.ppt
  13. 计算机游戏软件使用说明书,虚贝游戏上号器怎么用 使用方法详解
  14. a href点击无效_a标签失效的问题
  15. 双显示器扩展怎么设置上下扩展
  16. 【重磅】个税上调作为程序员更要上班做私单了!
  17. 记得常回头看看以前犯的错误,但绝不要为它们感到后悔
  18. C51中各种存储区名词解释
  19. android支付界面设计,Android支付宝支付设计开发
  20. Ubuntu下vim打开文件时,提示请按ENTER或其它命令继续

热门文章

  1. reg类型变量综合电路_Verilog中 reg和wire 用法和区别以及always和assign的区别
  2. 注册表操作,reg脚本简单编写
  3. DDE学习1、DDE的原理和基本特点简介_马鸿凯_新浪博客
  4. R语言作图——Dumbbell plot(哑铃图)
  5. [Pytorch系列-24]:神经网络基础 - 单个无激活函数的神经元实现简单线性回归 - 1
  6. 瑞幸最新股权曝光:大钲资本持股33.9% 有57%投票权
  7. 软件工程第三次作业——用户体验分析:以“南通大学教务学生管理系统”为例...
  8. css图片悬停特效,使用CSS3实现图片悬停放大的特效
  9. 易到用车最艰难时刻,未来赌什么?
  10. K60 FTM定时器 定时中断