全文共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,加入读者圈,一起讨论最新鲜的人工智能科技哦~)
来源:CSDN
作者:读芯术
链接:https://blog.csdn.net/duxinshuxiaobian/article/details/103578735