轻松构建算法交易机器:一点python基础+一点运气

只谈情不闲聊 提交于 2019-12-17 15:42:16

全文共3071字,预计学习时长9分钟

图源:Unsplash

人工智能的新突破每天都成为头条新闻。在金融领域,因其具有深厚历史、清楚明了和结构化数据,机器学习广泛运用。最终,金融领域成为了“学习机器”的一个早期标志,在这个领域取得的巨大成功还在继续。

现在,免佣金交易应用程序编程接口(API)和云计算的兴起让普通人只需要运气不错,再加上会一点python,就能运行自己的算法交易策略。

 

下面,小芯将展示如何在谷歌云平台(GCP)上使用Alpaca来进行构建框架。一如既往,文中所有编码可在Github主页里找到。

 

首先需要一些数据。数据来源当然有的免费,有的需要付费。本文中所用到的TD Ameritrade API(德美利证券)是免费的。下一步需要可以通过API递交免佣金交易的交易平台

 

这一步会用到Alpaca。Alpaca允许纸交易(虚拟币),这样就可以在免于破产的前提下测试所构建的交易策略。接下来只需要自动运行机器并存储/检索数据。此处将使用GCP,因为我对这一平台较为熟悉,但其他的云平台如AWS、Azure等都是不错的。

图源:Unsplash

对了,当然还需要算法交易策略。本文所讲的是如何建构运行交易策略的框架,所以策略本身并不重要,不是本文的重点。为了演示,文中会使用动量策略(momentumstrategy)查找过去125天内动量最大的股票,并每天进行交易。

 

在进行完全回测前,请不要盲目使用上述策略。切记,千万不要从我这里吸取投资建议,不然你很可能会后悔的。

 

数据

 

首先需要的是许许多多的股票。这里会用到所有列在纽约证券交易所(NYSE)的股票。所有的股票代码将从eoddata.com获取,然后再向TD Ameritrade API请求这些股票代码的数据。

 

一拿到数据,就可以将它们储存进BigQuery(BQ)表以备之后使用。所有的数据会在云函数(Cloud Function)中,可安排在每个工作日市场关闭后运行,以获得最新的收盘价。

 

将API凭证存在云存储的文本文件中以防被写死,因为这里只是用API调用来检索凭证。之后检查在当天日期市场是否开放,然后获取NYSE的股票代码,并传给TD Ameritrade API获取当天的数据。

 

然后用API将数据存储进BQ表以备之后机器人使用。

 

上面只用了收盘价,但是API还返回了许多其他的数据,所以将所有数据存储起来也不错。我创建了一个叫“equity_data”的数据集,表的名字为“daily_quote_data”。如果表先前并不存在,也就是说这是第一次创建,那么今天便会创建新表,之后每天都会有新的数据附加进去。

 

 

在GCP中可以用下面这个脚本创建云函数。如果要将这个云函数安排在指定时间运行,只需在触发器(Trigger)选项选择“云发布/提交(CloudPub/Sub)”并创建一个主题。

 

然后转到Cloud Scheduler中设置主题来在需要的时候运行。这里设置为在每个工作日东部时间下午5点运行。频率设置为unix-cron格式。有效载荷就是要发送的信息,写什么都可以,但必须填写。

 

还可以将云函数的超时设置为最大540s来……避免超时。它可以在高级选项中找到。

 

这样就可以下载往后的数据了。但是建构交易机器人还需要回溯数据。这里使用的端点是“quotes”端点,不提供历史数据。要获得历史价格数据,必须使用“pricehistory”端点。在我的GitHub文件夹中有一个名为“get_historical_data.py”的文件。读者可以在本地运行该文件,然后将数据框下载到csv中再上载到BQ表。

 

交易机器人

 

从基础来看,交易机器人必须能:

1. 了解有多少可供交易的资金

2. 获得要在交易策略中使用的数据

3. 根据交易策略决定所选股票

4. 买/卖股票来更新证券投资组合

 

整个云函数比较长,所以这里只是简单总结一下,完整的代码在GitHub上。就像之前所说,策略在这里并不重要。这里使用的是一个简单的动量策略,选择了过去125天里动量最大的10只股票。

 

首先,为了之后的动量策略,从BQ API将历史数据下载为数据框。

 

接下来从Alpaca API获得当前头寸和投资组合价值。这里用的是Alpaca的APIWrapper凭证还是存储在云存储的文本文件中。

 

注意,这里用的基本URL用于纸币交易,可以在纸币交易账户中设置任意金额,这里设置的是1万美元。显然,如果这是第一次运行,Alpaca里是没有什么头寸的。所以在运行云函数前,要先在本地运行脚本,基于所选的动量股票来得到最初的投资组合。然后将它们发送到AlpacaAPI中进行购买。这里假设上述步骤都已经完成了。

 

有了历史数据和交易金额后,就可以根据策略选择股票了。第一步是找出拥有最高动量的股票。

 

上面的动量计算来自Andreas F. Clenow所著的《交易发展(Trading Evolved)》,推荐大家阅读。这本书浅显易懂,其中有适用于各种策略的编码案例。

 

动量计算中计算了过去125天内每只股票收盘价的对数(最小天数为40天)的线性回归。下一步,取回归线斜率的指数(以天为单位表示其上升或下降的百分比),然后将其年化(取252的幂,即一年中的交易日数),并将其乘以100。这样数据会更好理解。最后乘以r的平方值,赋予解释方差的模型权重。

 

确定了动量得分最高的前10只股票之后,还需要决定购买多少股票。投资组合配置本身就是一个完整的话题,它并不重要,所以在此不进行展开。这里使用了pyportfolioopt库进行配置。

 

现在有了一个df,里面有想买的股票和数量。然后需要根据当前的投资组合来决定是否卖出股票。有以下几种可能:

 

1. 今天动量股票的选择和配置和昨天完全相同,没有买卖的必要

2. 当前投资组合中有不想持有的股票

3. 今天想买的股票和当前拥有的一样,但是数量有了变化(增/减)

4. 今天有了新的想买的股票,但是它不在昨天的投资组合中

 

上面的情况都需要进行检查并进行所有必要买卖。首先,检查当前投资组合中是否有不需要的股票。

 

这样就得到了一个数据框,其中包含想要卖掉的股票和数量。接着检查现有的股票数量是否有减少。这里可能没有任何变化,所以必须要进行检查。这样就可以得到需要卖掉的股票的最终数据框。

 

有了需要卖掉的股票清单(如果有的话),就可以将它发送到AlpacaAPI来运行指令。

 

最后,看看拥有的新股票有没有数量上的增加,或者今天有没有想买的新股票。

 

如果有的话,就向API发送指令。

 

完成之后记录投资组合也是个好做法。Alpaca只允许有一个纸交易账户,所以如果想要(应该要)运行多个算法,就要创建日志自己追踪它们。可以创建策略列来从策略中进行识别。然后可以将它添加到另一个BQ表中。

 

 

下面的SQL查询可以提供每日总计,还有和前一天的投资组合相比的变化百分比。

 

这样就构建好交易机器了。大家之后可以将它放在云函数中每天运行。它便是运行交易策略的优秀框架。

 

祝你成功!

 

留言 点赞 关注

我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”

(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!