大数据文摘作品,转载要求见文末
编译 |徐宇文,蒋晔、范玥灿
卞峥,yawei xia
技术早已成为金融业的一项资产:金融交易的高速、高频与超大数据体量结合,促使金融机构在一年一年不断地加深对技术的关注,在今天,技术已经切实成为了金融界的一项主导能力。
在金融界最受欢迎的编程语言中,你会看到r和python,与c++,c#和java这些语言并列。在本教程中,你将开始学习如何在金融场景下运用python。本教程涵盖以下这些方面:
基础知识:对于金融入门阶段的读者,你将会首先学到股票和交易策略,什么是时间序列数据,以及如何建立自己的工作空间等等。
时间序列数据和一些最为常见的金融分析的简介,例如滑动时间窗口、波动率计算等等在python工具包pandas中的实现。
一个简单的动量交易策略的开发:你将首先按部就班地过一遍开发流程,然后从公式化建立和编写简单的程序化交易策略着手。
紧接着,你将会使用pandas,zipline和quantopian对已构建的交易策略进行回测。
而后,你将会看到如何优化你的策略,以及最终你要对策略的表现以及稳健性进行评估。
从这里下载本教程的jupyter notebook(
https://github/kacawi/datacamp-community)
金融场景下的python入门指南
在进入任何交易策略之前,首先摸清基础知识脉络是有帮助的。本教程的第一部分将会专注于解释你需要了解的python基础知识。然而,这并不意味着你应该完全从零开始:你应该至少学过datacamp上的intro to python for data science (https://datacamp/courses/intro-to-python-for-data-science)免费课程,从中你会学到如何使用python列表,工具包以及numpy。此外,你最好已经了解pandas这个广为流传的python数据操作工具包,不过这不是必须的。如果你确实希望在学习本教程之前就已经熟知pandas,你可以考虑学习一下datacamp上的pandas foundations (https://datacamp/courses/pandas-foundations)课程。
当一家公司希望实现增长、从事新项目或者扩张,它可以通过发行股票来提高资产水平。一股代表着对公司的一部分所有权,并通过金钱交易的形式发行。股票被买进和卖出:买方和卖方交易那些现存的、先前发行的股权。股票卖出的价格变化可以独立于公司经营的成功与否:股票价格反映的是供需关系。这意味着,无论何时,无论是基于成功、还是受欢迎等原因,如果一支股票被认为是抢手的,它的股价就会上涨。
注意,股票并非完全与债券等同,债券是公司通过借贷的方式进行融资的凭证,可能是从银行贷款,或是发行债务。
如前所述, 当谈及股票时,买入、卖出或者交易是非常必要的,但显然并不局限于此:交易是资产买卖的行为,既可以是财政担保,例如股票、债券;亦或者有形产品,例如金子和石油。
股票交易是一个现金交易过程,即用于购买股票而支出的现金转化为对一家公司的一部分所有权,这部分所有权能够通过出售股票的形式转化回现金,并且你有希望从中盈利。现在,为了获得丰厚的利润回报,你可以选择长期或短期的市场策略:你可能会因为认为股票价格会走高而购入股票,以期在未来以更高的价格售出,你也可能卖出股票,认为将来可以以更低的价格重新买入,以实现盈利。当你遵循一种固定的方式来选择长期或短期市场策略的时候,你就已经有了一个交易策略。
开发交易策略是一件需要经过好几个阶段的事情,就比如,当你在建立机器学习模型的时候:你首先构建一个策略,将它具体化成一种可以在你的电脑上测试的形式,你进行初步检验和回测,优化你的策略,最后,你需要评估策略的表现和稳健性。
交易策略通常通过回测来验证:利用历史数据,利用你已开发的交易策略重新构建那些过去应该发生的交易。借此,你能获知你的策略的有效性如何,你也可以以此作为新策略投入市场前的优化和提升的起始点。当然,这一切都在很大程度上依赖于一个根本性的理论或者说信仰,那就是任何在过去表现良好的策略也将在未来继续表现良好,以及,任何在过去表现不好的策略在未来也将会表现很差。
一个时间序列指的是一个在时间维度依次均匀分布的有序的数值数据点。在投资领域,时间序列追踪一些特定的数据点在特定时间段的变动,例如股票价格,这些数据基于正则区间进行记录。如果你仍然对这到底是长什么样子的心存疑问,那么请看一下下面的例子:你可以看到日期被置于x轴,价格标注于y轴。所谓“在时间维度依次均匀分布”在这个例子中就是指日期在x轴上以14天的间隔均匀分布:请注意3/7/2005和下一个点3/31/2005的间隔,以及4/5/2005 和 4/19/2005的间隔。
然而,你在处理股票数据的时候可能经常会发现的是,数据并不只有两个包含了时间和价格的列,而是更常见的是,你会有5个列分别包含了在这段时间内的时间期间、开盘、最高、最低以及收盘价。这意味着,如果你的周期被设置为每日更新,一天的所有记录就能告诉你这一天内任何一支股票的开盘和收盘价以及极高和极低波动值。
现在,你已经对学习本教程所需要掌握的基本概念具备了基本的认知,这些概念将会很快再次出现,而你将会在这份教程中对他们了解更多。
准备你的工作环境是一件简单的事:你基本只需要确保你的系统上有python和ide。然而,你有多种方法可以着手准备,而其中一些可能会稍微更简单一些。
举个例子,anaconda是一个python和r的高性能分布工作空间,并且包含了100多个最受欢迎的python、r和scala数据科学工具包。此外,安装了anaconda你就可以通过conda获取超过720个工具包,以及我们在anaconda种配置的最新的工具包、从属工具和环境管理工具。以及,除此之外,你还能通过它获取 jupyter notebook 和 spyder ide。
听起来像是工作量很大,对吗?
你可以从这里安装anaconda,也别忘了从datacamp的jupyter notebook教程jupyter notebooktutorial: the definitive guide中查看如何建立你的jupyter notebook。
显然,anaconda并不是你唯一的选项:你还可以看一下canopy python distribution(https://enthought/products/canopy/)(收费), 或者试试quant platform(http://quant-platform/)。
在使用比如jupyter或spyder ide的基础上,后者提供了一些额外的好处, 因为它还为你提供了在浏览器上进行金融分析所需的一切!通过quant平台,你将会获取基于gui的金融工程的、可交互的和基于python的金融分析以及你自有的基于python的分析工具库。此外,你还可以进入一个论坛来跟你的同行一起探讨解决方案和疑问。
当你在金融中使用python的时候,你将会经常用到数据操作工具包,pandas。但你也会用到其他的工具包例如numpy,scipy,matplotlib等等,它们将会在你一旦深入的时候出现。
现在,让我们先关注在pandas上,并且用它来分析时间序列数据。这一部分将会解释你可以怎样使用pandas输入数据,探索和操作数据。在这之上,你还会学到如何对你输入的数据进行一些常见的金融分析。pandas-datareader工具包让你可以从google,yahoo! 金融和世界银行等渠道读入数据。如果你想要获得更新版的这项功能所能触及的数据源列表,可以去看一下文档。这个教程中,我们将会使用这个工具包从yahoo! 金融上读入数据。
注意,yahoo api 的终端最近有所变动,而且如果你已经想要开始自己使用这个工具库了,你需要安装一个暂时的补丁来利用pandas-datareader从yahoo金融抓取数据,直到正式的补丁完善。在开始之前,请确保阅读了这份说明。
当然,请别担心,在这份教程中,我们已经为你载入了数据,所以在学习如何在金融中通过pandas使用python的时候,你不会面对任何问题。聪明的思考角度是,虽然pandas-datareader提供了大量抓取数据的选项,它仍然不是唯一选项:例如,你还可以利用像quandl这样的其它的工具库从google金融获取数据。
关于如何使用quandl直接抓取金融数据的更多信息,请参见这个网页。
最后,如果你已经在金融行业工作了一段时间,你可能知道最常用于数据操作的工具是excel。因此,你需要知道如何将python和excel整合到一起。
更多信息请查看datacamp的python excel tutorial:the definitive guide。
当你终于在工作空间中获得数据以后,你要做的第一件事就是赶紧上手。然而,既然你现在对付的是时间序列数据,这看起来便可能不是很直接了,因为你的行标签中带有了时间值。
但是,请别担心!让我们首先按部就班地利用一些函数开始探索数据,如果你先前已经有了一些r的编程经验,或者你已经使用过pandas, 你可能已经对这些函数有所了解了。
无论哪种情况,你都会觉得这非常简单!
正如你在下面的代码中看到的,你已经用过pandas_datareader来输入数据到工作空间中,得到的对象aapl是一个数据框(dataframe),也就是一个二维带标记的数据结构,它的每一列都有可能是不同的数据类型。现在,当你手头有一个规则的数据框的时候,你可能首先要做的事情之一就是利用head()和tail()函数窥视一下数据框的第一和最后一行。幸运的是,当你处理时间序列数据的时候,这一点是不变的。
小贴士:也可以利用describe()函数来获取一些有用的总结性统计数据
请从这里找到一些附带的练习
正如你在介绍部分所看到的,数据清楚地包含了四个列,包括苹果的股票每天的开盘价和收盘价,和极高和极低的价格变动。此外,你还得到了两个额外的列:volume和adj close。前一个列是用来记录在这一天内交易的股权总量。后者则是调整的收盘价格:当天的收盘价格经过细微的调整以适应在后一天开盘前所发生的任何操作。你可以使用这一个列来检验历史回报或者对历史回报做一些细致的分析。
前一个列是用来记录在这一天内交易的股权总量。后者则是调整的收盘价格:当天的收盘价格经过细微的调整以适应在后一天开盘前所发生的任何操作。你可以使用这一个列来检验历史回报或者对历史回报做一些细致的分析。
请注意行标签是如何包含日期信息的,以及你的列和列标签是如何包含了数值数据的。
小贴士:如果你现在想要使用pandas的to_csv()函数把这些数据存储为csv格式的文件,或是通过read_csv()函数把数据读入回python。这一点在一些特定场景下是极其便利的,例如说yahoo api终端发生了变动,你难以再次获取数据的情况。
现在,你已经简要地检查了你的数据的第一行,并且已经查看了一些总结性统计数据,现在我们可以稍微深入一步了。
做这件事的一种方法是通过筛选,例如说某一个列的最后十行数据来检查行标签和列标签。后者则被称为取子集,因为你得到的是数据中的一个小的自己。取子集得到的结果是一个序列,也就是一个带标签的,可以是任何数据类型的一维数组。
请记住,dataframe结构是一个二维标记的数组,它的列中可能包含不同类型的数据。
在下面的练习中,将检查各种类型的数据。首先,使用index和columns属性来查看数据的索引和列。接下来,通过只选择dataframe的最近10次观察来取close列的子集。使用方括号[ ]来分隔这最后的十个值。您可能已经从其他编程语言(例如r)中了解了这种取子集的方法。总而言之,将后者分配给变量ts,然后使用该type()函数来检查ts的类型。您可以在这里进行练习。
方括号可以很好地对数据进行取子集,但这可能不是使用pandas最习惯的做法。这就是为什么您还应该看看loc()和iloc()函数:您可以使用前者进行基于标签的索引,后者可用于位置索引。
在实践中,这意味着您可以将行标签(如标签2007和2006-11-01)传递到loc()函数,同时传递整数(如22与43)到iloc()函数。
完成原文中的练习,了解loc()和iloc()两者是如何工作的。
小贴士:如果您仔细查看子集的结果,您会注意到数据中缺少某些日期; 如果您仔细观察这个模式,您会发现通常缺少两三天;这些天通常是周末或公共假期,这些并不是您需要的数据。没有什么可担心的:它完全正常,您不必补全这些缺失的日期。
除了索引之外,您还可能想要探索一些其他技术来更好地了解您的数据。您永远不知道还会出现什么。我们尝试从数据集中抽取大约20行,然后对数据进行重新采样,使得aapl按照每月进行采样而不是每天采样。您可以利用sample()和resample()函数来完成这项功能。
非常简单直接,不是吗?
resample()函数经常被使用,因为它为您的时间序列的频率转换提供了精细的控制和更多的灵活性:除了自己指定新的时间间隔,并指定如何处理丢失的数据之外,还可以选择指示如何重新取样您的数据,您可以在上面的代码示例中看到。这与asfreq()方法形成清晰的对比,它只有前面两种选择。
小贴士:在上述datacamp light块的ipython控制台中自己尝试一下。传递aapl.asfreq(m, method=bfill)看看会发生什么!
最后,在您将数据探索提升到一个新的水平之前,请先可视化您的数据并对数据执行一些常见财务分析,您可能已经开始计算每天开�...