1.1股票数据预处理练习

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

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"]})




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499519.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1-2 移动均线交叉策略1

第一阶段、一个简单策略入门量化投资 1-2 移动均线交叉策略1 第一阶段一个简单策略入门量化投资1-2 移动均线交叉策略1前言获取数据移动均线交叉策略数据可视化绘制折线图绘制K线图绘制移动均线 移动均线交叉策略回测什么是回测回溯买卖信号计算收益 未完待续完整代码 前言 …

STM32F412应用开发笔记之一:初识NUCLEO-F412ZG

&#xfeff;&#xfeff;今天终于收到了期待已久的NUCLEO-F412ZG&#xff0c;感谢电子发烧友论坛&#xff01; 近几年来基本都是在STM32平台上做一些设计开发工作。STM32F103、STM32F107、STM32F429等都应用过&#xff0c;但却从没有申请过试用。没想到这次申请居然能被选中&a…

STM32F412应用开发笔记之二:基本GPIO控制

&#xfeff;&#xfeff;NUCLEO-F412ZG板子上的元器件并没有完全焊接&#xff0c;除去ST-LINK部分和电源部分后&#xff0c;还有用一个USB主机接口&#xff0c;三个LED灯和两个按钮&#xff0c;不过很多功能引脚都已经引到了插针。查看原理图可发现&#xff0c;由原理图模块的…

1-3移动均线交叉策略2

第一阶段、一个简单策略入门量化投资 1-3移动均线交叉策略2 上一篇文章1-2 移动均线交叉策略1中我们最后提到&#xff1a; 如果我们从第一天买入股票&#xff0c;一直持有股票&#xff0c;最后一天卖出&#xff0c;获得的收益是每股124.02美元&#xff0c;收益率为412% 如果…

1-4移动均线交叉策略3

第一阶段、一个简单策略入门量化投资 1-4移动均线交叉策略3 上一文1-3移动均线交叉策略2中&#xff0c;我们得到的结果是令人失望的。但我们的探索还要继续。 我们知道&#xff0c;使用投资组合的方式进行分散投资是降低风险的好办法。尽管移动均线交叉策略的表现并不理想&a…

STM32学习及应用笔记一:SysTick定时器学习及应用

&#xfeff;&#xfeff; 这几年一直使用STM32的MCU&#xff0c;对ARM内核的SysTick计时器也经常使用&#xff0c;但几乎没有仔细了解过。最近正好要在移植一个新的操作系统时接触到了这块&#xff0c;据比较深入的了解了一下。 1、SysTick究竟是什么&#xff1f; 关于SysT…

使用Atom快速打造好用的Markdown编辑器

使用Atom快速打造好用的Markdown编辑器 Atom当前主流的跨平台的三大编辑器(Atom,sublime,vscode)之一 今天尝试了使用Atom来打造Markdown编辑器&#xff0c;快速上手且易用&#xff0c;墙裂推荐&#xff01; 下面直接进入正题&#xff0c;一步步介绍如何使用Atom快速打造好用…

PID控制器开发笔记之一:PID算法原理及基本实现

&#xfeff;&#xfeff; 在自动控制中&#xff0c;PID及其衍生出来的算法是应用最广的算法之一。各个做自动控制的厂家基本都有会实现这一经典算法。我们在做项目的过程中&#xff0c;也时常会遇到类似的需求&#xff0c;所以就想实现这一算法以适用于更多的应用场景。…

十分钟能学会的简单python爬虫

简单爬虫三步走&#xff0c;So easy~ 本文介绍一个使用python实现爬虫的超简单方法&#xff0c;精通爬虫挺难&#xff0c;但学会实现一个能满足简单需求的爬虫&#xff0c;只需10分钟&#xff0c;往下读吧~ 该方法不能用于带有反爬机制的页面&#xff0c;但对于我这样的非专业…

PID控制器开发笔记之二:积分分离PID控制器的实现

前面的文章中&#xff0c;我们已经讲述了PID控制器的实现&#xff0c;包括位置型PID控制器和增量型PID控制器。但这个实现只是最基本的实现&#xff0c;并没有考虑任何的干扰情况。在本节及后续的一些章节&#xff0c;我们就来讨论一下经典PID控制器的优化与改进。这一节我们首…

利用python实现短信和电话提醒功能

有时候&#xff0c;我们需要程序帮我们自动检测某些事件的发生 这个需求是广泛存在的 因此&#xff0c;这里整理了利用python实现短信和电话提醒功能的方法 主要需要完成以下4个步骤&#xff1a; - 安装核心库&#xff1a;twilio - 注册账号及配置 - 发送短信示例 - 电话…

PID控制器开发笔记之三:抗积分饱和PID控制器的实现

积分作用的引入是为了消除系统的静差&#xff0c;提高控制精度。但是如果一个系统总是存在统一个方向的偏差&#xff0c;就可能无限累加而进而饱和&#xff0c;极大影响系统性能。抗积分饱和就是用以解决这一问题的方法之一。这一节我们就来实现抗积分饱和的PID算法。 1、抗积…

如何获取STM32 MCU的唯一ID

前段时间由于应用需要对产品授权进行限制&#xff0c;所以研究了一下有关STM32 MCU的唯一ID的资料&#xff0c;并最终利用它实现了我们的目标。 1、基本描述 在STM32的全系列MCU中均有一个96位的唯一设备标识符。在ST的相关资料中&#xff0c;对其功能的描述有3各方面&#x…

SHA256算法原理详解

1. SHA256简介 SHA256是SHA-2下细分出的一种算法 SHA-2&#xff0c;名称来自于安全散列算法2&#xff08;英语&#xff1a;Secure Hash Algorithm 2&#xff09;的缩写&#xff0c;一种密码散列函数算法标准&#xff0c;由美国国家安全局研发&#xff0c;属于SHA算法之一&…

学习笔记:区块链概念入门

本文是100天区块链学习计划的第二篇学习笔记&#xff0c;其实就是按照阮一峰的网络日志-区块链入门教程的讲解进行的简单梳理。也是时间有点紧张的原因&#xff0c;相比于上一篇SHA256算法原理详解&#xff0c;个人感觉质量和原创程度明显下降。待对区块链有了更深的理解后&…

PID控制器开发笔记之四:梯形积分PID控制器的实现

从微积分的基本原理看&#xff0c;积分的实现是在无限细分的情况下进行的矩形加和计算。但是在离散状态下&#xff0c;时间间隔已经足够大&#xff0c;矩形积分在某些时候显得精度要低了一些&#xff0c;于是梯形积分被提出来以提升积分精度。 1、梯形积分基本思路 在PID控制…

SHA256 的C语言实现

前几天总结了SHA256的算法原理一文 SHA2系列的原理并不复杂&#xff0c;但是需要注意细节还是挺多的。不少中文博客贴出的代码都有错&#xff0c;这两天也踩了几个坑。 代码在这里&#xff01;&#xff01;&#xff01;SHA256的C Code 代码实现主要依照的这个git仓库crypto-…

信息摘要算法之一:MD5算法分析及实现

MD5即Message-DigestAlgorithm 5&#xff08;信息-摘要算法5&#xff09;&#xff0c;用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一&#xff08;又译摘要算法、哈希算法&#xff09;&#xff0c;主流编程语言普遍已有MD5实现。 1、MD5算法简介 MD5在90年代初由…

非对称加密概述

非对称加密概述 前言 在阅读《精通比特币》的过程中&#xff0c;我发现比特币系统中有两个重要的概念需要利用非对称加密技术&#xff1a; 比特币地址的生成 交易合法性的验证 因此&#xff0c;我用了几天时间学习了密码学基础知识&#xff0c;尤其是非对称加密技术的原理…

信息摘要算法之二:SHA1算法分析及实现

SHA算法&#xff0c;即安全散列算法&#xff08;Secure Hash Algorithm&#xff09;是一种与MD5同源的数据加密算法&#xff0c;该算法经过加密专家多年来的发展和改进已日益完善&#xff0c;现在已成为公认的最安全的散列算法之一&#xff0c;并被广泛使用。 1、概述 SHA算法…