图源:unsplash
首先要声明,本文仅仅是一个编程教程,出于学习目的,教你如何建立一个交易机器人。我的能力尚不足以为你提供投资、法律及其他建议,建立机器人后的一切决策、投资或风险均需自负。
我们常碰到一些类似“程序员应构建的10个项目”的文章,其中大多都包括交易机器人。交易机器人的确是个不错的项目,本文就将教你如何创建它。

然而,与其一列列地将所有代码和盘托出,不如让你了解建设此项目的需熟知的所有概念,这才是最优方案。毕竟,这是你自己敲出的代码。
本文将阐释你需要知道的一切有关建立交易机器人(从交易到简单的交易策略)的知识,以及一个简单的机器人的基础架构、概念及设计。此外,我会用伪代码,这可作为任意编程语言的教程。因此,你放心并专注于实际的编程,不必自己弄清楚所有设置。
第一步:选择武器
本教程的第一步就是自主选择使用的语言。比如,若想后续拓展机器人以使用机器学习,一些像Python这样的语言会很有帮助。选择你喜欢的语言即可。
第二步:选择战场
交易机器人教程常忽略的一步就是选择交易所。
为了让交易机器人工作,须进入能交易资产的交易所,这与知道如何编程同等重要。在这一步,我们需要决定交易何种资产(比如股票,货币,加密货币)及交易地点。
关于资产,我强烈推荐加密货币。这不是因为我是区块链/加密货币拥护者,而是因为加密货币市场全天候开放,全年无休。
大多数“传统”资产只能在特定时间交易,通常仅在工作日交易。比如,股票市场一般在上午9时到下午4时开放,周末休息。FOREX(外汇市场)24小时开放,但常常在周末关闭。
就此而言,交易机器人更方便全天候运行,适合加密货币市场。此外,加密货币以高流通性著称,这意味着:你可能失去大笔钱,但它们是学习及计策交易策略的好方式。
介绍完资产类别,现在回顾一下交易机器人选择交易所的两个要求:
· 在交易所及其提供的资产进行交易须得到法律许可,某些国家/地区不允许加密货币交易。
· 交易所必须具有公共API。若无接收机器人发送请求的端点,就无法构建机器人。
满足以上两个条件,你还要考虑如交易所收费情况、交易所是否知名或评级高及其API文档质量之类的问题。
最后,建议检查交易所的日交易量。交易量极低的交易所往往会滞后于价格走势,并且难以执行限价单。若决定选加密货币为资产类别,这里有一份囊括顶级交易所、其贸易额以及各种其他重要信息的清单,能帮助你做出选择:https://www.coingecko.com/en/exchanges。
第三步:选择基地
图源:unsplash
若交易所是战场,你还需要一个能向前线输送部队的基地。那就是服务器,你需要服务器来向交易所的API发送请求。
出于测试目的,你当然可以直接在自己的电脑上运行服务器。但是,若想机器人一直运转,个人电脑可不是个好选择。对此,我有两个提议:
· 选择树莓派(Raspberry Pi)当服务器(更酷)
· 选择云提供商(更好)
我觉得在树莓派运行机器人非常酷,如果你觉得不错可以试试。但是,大多数人或许会用云托管服务,如AWS、Azure、GCS或Digital Ocean。大部分大型云服务提供商都有不错的免费套餐,甚至可以免费托管机器人。
关于服务器,我就不再赘言了,选最适合自己的即可。而且对像这样的小项目而言,选什么都差不多。
第四步:创建机器人!
现在开始最有趣的部分。在开始前,请确保:
· 已在交易所注册并得到许可。
· 交易所API可用,有API key。
· 已确定如何托管机器人。
最简单的机器人
我的目的是以简单明了的方式从零创建机器人。就此,我会教你如何建立一个简易交易机器人,你可以对其拓展或升级以满足个人需求。
该机器人有如下限制:
· 机器人只能处于以下两个状态:买入或卖出。在多重价格点中,机器人不能同时买卖订单。若上次操作是卖出,下次才可能是买入。
· 机器人使用混合买卖阈值。智能机器人或许可以基于不同指标调整阈值,但我们的机器人需要手动设置策略及阈值。
· 机器人仅能交易一种货币对,如比特币/美元。
然而,限制也有好处。简单令机器人更易创建及维护,也能得到快速部署。
决策流
这是个关于机器人运行概况的简单图表:
到这里,我们可以决定框架形式。首先,需要一个变量以表明机器人目前状态是买入还是卖出。布尔值或枚举值应就非常适合。
然后需要设立买卖阈值。这能表明自上次操作后的价格升降幅度。比如,若以100美元的价格购买资产,资产目前价格102美元,则价格上涨2%。若销售阈值是上涨1%,机器人就会卖出,因为增幅超过阈值,赚了。
在案例中,这些阈值是限制。我们需要四条,每种状态两条:
买入阈值(当机器人处于卖出状态)
· DIP_THRESHOLD : 若价格降幅超过阈值,买入资产。基本理念是“低买高卖”,资产价格被低估时买入,价格上涨后卖出。
· UPWARD_TREND_THRESHOLD : 若价格增幅高于阈值,买入资产。这与“低买高卖”的理念相悖,但目的在于避免错失机会,在资产价格再度高涨之前买入。
此处图解或许会有帮助:
在图中的“卖出”点执行卖出操作后,设定买入操作的阈值。若价格一直低于底部绿线或者一直高于顶部绿线,执行买入操作。本例中,价格超过顶部绿线,基于UPWARD_TREND_THRESHOLD 准则,买入。
卖出阈值(当机器人处于买入状态)
· PROFIT_THRESHOLD : 若价格增幅高于买入阈值,卖出资产。卖出价高于买入价,以此盈利。
· STOP_LOSS_THRESHOLD : 理想状态下,我们只在有利可图时卖出。但是,或许市场正在暴跌,我们打算尽早脱手,然后再低价买入。因此,这个阈值是为避免更大亏空而赔本卖出。
这是图示:
在“买入”点执行买入操作。之后,在价格高于上部红线并未跌到下部红线之前卖出资产获利。此即交易机器人赚钱之法。我们已然对机器人的工作原理有所了解,开始着手(伪)代码吧。
API辅助函数
机器人需要的第一件事是能获取交易所API数据的辅助函数。需要:
上图足够明了,但要确保自己了解在执行买入或卖出操作时POST的API请求时需要何种货币。通常,比如用美元买黄金,要么明确买多少黄金,要么明确卖多少美元。弄清货币十分重要。
机器人Loop循环
有了辅助函数后,我们开始定义机器人工作流。首先需要有休眠时间的无限循环。比如,我们想让机器人每三十秒执行一次操作,示例如下:
接下来设定之前提过的变量、约束及决策制定流。除API辅助函数外,代码会是这个样子:
注意,此处阈值是任意的,应根据个人策略设定值。若上述内容配对辅助函数及循环函数且能放入 main,我们便有了机器人工作的基本框架。
机器人在每次迭代时会检查目前状态(买入或卖出),并尝试根据硬编码的阈值进行交易。之后,机器人更新买入/卖出状态及上次交易价格。循环往复。
第五步:改善机器人
机器人的基本构架已完成,但还需有所补充。
图源:unsplash
日志
首次创建这类机器人时,有件事情十分重要:不断将机器人的操作记录在终端及单独文档的日志中。每一步,我都会创建如下日志:
[BALANCE] USD Balance = 22.15$[BUY] Bought 0.002 BTC for 22.15 USD[PRICE] Last Operation Price updated to 11,171.40 (BTC/USD)[ERROR] Could not perform SELL operation - Insufficient balance
存入文档的日志均会添加时间戳。因此,假设我一整天后访问服务器并发现错误,我可以准确找到错误发生点及一切机器人的错误行为。这需要建立每步都要用的 createLog 函数,如下:
找到趋势
机器人的主要目的是低价买入、盈利卖出。但是,我们的两个阈值略悖于该目的:UPWARD_TREND_THRESHOLD 和 STOP_LOSS_THRESHOLD 。
上述阈值表示何时亏本卖出或涨价买入,但我们试图找到不在总体策略范围内、但可能对我们有害或有益的趋势,因此我们应该照做。然而,我上述的构建方式有很大的局限性。价格的数据快照远不足以表明趋势。
所幸,无需太多麻烦,你就可以令其更可信。你要做的是跟踪更多的价格,而不仅是只看 lastOpPrice 。比如,你可以跟踪10或20次迭代前的价格,并与当前价格而非 lastOpPrice 相比较。这或许会更好的找到趋势,因为这检查了价格的快速转变,而非长期变化。
数据库
运行时,其实此简易机器人无需数据库,因为它处理的数据极少,能保存将所有信息。但当机器人出故障时情况会如何?若无人手动检查,它如何定 lastOpPrice?
为避免手动操作,你或许想用某种轻量级数据库来跟踪一些事情,比如 lastOpPrice 。这样一来,启动时,机器人会检查已存价值并从这里开始,而非使用错误价值。根据方式的难易程度,你甚至可以考虑文件格式为 .txt 或 json 的“数据库”,因为你可能只储存少许值。
控制面板
若想更方便地查看机器人操作并进行管理,而无需进入并手动调代码,你也可以考虑将机器人连接到控制面板。这需要连接机器人到的它自己的web服务器/API,以便控制其功能。这样便可以更轻松地更改阈值。
有许多免费控制面板模板,无需自己制作,可以去Start Bootstrap和Creative Tim上看看。
对过去数据的测试策略
许多交易所允许访问过去价格数据。如有需求,通常可以随时轻松获取数据。若想在操作前测试策略,这点非常有用。你可以用过去数据及“假钱”模拟运行机器人,看看定义的阈值的效果,并根据实际交易对其调整。
阈值及订单的附加信息
下订单时需要注意以下事项:
首先,订单有两种:限价订单和市场订单。如果不熟悉这些概念,你得读读有关概念。
市场订单是按当前市场价格执行的订单,在大多数情况下可以立即有效执行。
而限价订单出现在如下情况:下单的价格低于市价(买入订单)或高于市价(卖出订单)。由于价格可能未达到所设阈值,不能保证执行买卖操作。限价订单的好处在于可以预测市场走势,并在市场变动之前下订单。此外,限价单通常比市价单费用低。这是因为市价单支付通常所说的“接受者费用”,限价单则支付“制造商费用”。
命名及其相应费用的原因是,市场订单仅采用(“接受”)当前市场价格,而市价外的限价订单增加了流动性,从而“形成市场”,因此可以获得较低费用的“奖励”。
注意,本文中的机器人最适合市场订单。
最后,当设定你的 PROFIT_THRESHOLD 时,记得考虑费用。为了获利,你要先买入在卖出,这需要交两个费用。因此要保证在足够支付费用后才能出售,否则你就会赔钱。
想一想,假设费用固定,若以100.00 $的价格购买资产,费用是0.50 $,然后以100.75 $的价格出售,费用还是0.50 $,则毛利润为0.75%。但实际上,净损失0.25%。假如机器人一直以净亏损出售,你很快就会损失大笔钱……
图源:unsplash
指南目的是教你所有关于建立交易机器人的概念(零经验小白也没问题),而不是教你如何编程。这是我第一次写这类指南(基于伪代码),希望对你有所帮助。
留言点赞关注
我们一起分享AI学习与发展的干货
如转载,请后台留言,遵守转载规范