博客
【求职分享】
【笔试/面试】
使用TensorTrade建立交易算法
Feb 01,2023
分享本文:
本文我们将展示如何将 Ray 与 TensorTrade (TT) 结合使用,以便在可预测的正弦曲线上创建能进行套利的交易算法。
你可能会问自己,当现实世界更难以预测时,为什么还要使用如此简单的东西?这是一个很好的问题,并且有很简单的答案:
“移山的人,从搬走小石头开始。”——孔子
在尝试进入现实复杂交易环境的世界之前,可以使用简单的正弦曲线对你的交易算法进行健全性检查。所使用的激励和行动方案应该能够以可预测的模式赚钱。如果没有,那么就不可能在更复杂的环境中找到成功。
在浪费时间和资源开发算法之前,有一些问题要问。首先,激励函数是否正确确定了目标?在本教程中,我们将展示一个激励和行动方案,可用于训练模型在正弦曲线上做出有利可图的策略。
01
开始
首先,我们需要安装用到的一些库
pip install tensortrade==1.0.1b0 ray[tune,rllib] symfit
接下来让我们导入运行代码所需的库。

现在来定义我们想要在我们的投资组合中拥有的两种工具。这里将使用美元和一种名为 TensorTrade Coin 的虚拟货币。
理想情况下,我们希望我们的交易程序在高价时卖出,在低价时买入,即高卖低吸。接下来们我将定义允许执行此行为的程序。
我构建的 ActionScheme 非常简单,只依赖于两个内部状态:现金和资产。
以下是显示状态以及可以执行的操作的转换图:stay和move
例如,如果我从cash开始并选择move,那么我将转换为asset并获得 P(t)-P(t-1) 作为激励,其中 P(t) 是时间t的资产价格。描述这些箭头的激励将在下面更详细地描述。
接下来,我们将创建一个激励模式来反映我们在环境中的位置。本质上,我们要一个映射来反映我们所处的每个状态的正确激励。
该表显示在不同情况下满足何种条件会产生激励。例如,在第一行中,假设模型处于cash状态并选择在价格下跌时stay,那么就会有正向激励。
我们可以用相同的方式读取其他行。为了得到这个激励函数,我们创建一个基于位置的激励 (PBR) 方案。让 s(t)、a(t) 和 p(t) 分别是时间步 t 的state, action 和 price。
然后我们可以将激励 r(t) 定义为:
在前面,我们提的个例子,我们从cash开始并选择了move。根据上面的等式,这转化为:
此函数生成激励显示在转换图的箭头上,如前所述。

最后,我们想确保我们可以看到模型是否在高价时卖出并在低价时买入。下面是一个可以使用 Matplotlib 显示此信息的渲染器。
02
训练
为了在 ray 中使用我们的自定义环境,我们必须首先编写一个从配置文件创建 TradingEnv 实例的函数。
由于环境已建立好,我们可以使用 rllib 的近端策略优化 (PPO) 算法来训练我们的模型。
要检查一切是否正常,设置一个较低的 episode_reward_mean 以便可以进行快速检查(这里设置为 10)。一切就绪后,将其设置为 500 并运行训练。训练完成后,我们可以通过从最后一个检查点恢复来访问模型的策略。
现在让我们通过渲染环境来可视化模型在正弦曲线上的决策。
从图表中,我们可以看到模型正在对环境做出接近最优的决策。这符合我们的预期,并确认激励功能正常工作。现在让我们将模型放在其它的环境中,看看它会做出什么样的决策。
03
评估
为了使价格曲线更具挑战性,我们使用 symfit 库将 5 阶傅里叶级数拟合到随机生成的几何布朗运动 (GBM)。
现在我们可以建立评估环境并查看模型的执行情况。尽管这不是一个正确的评估方式,但它仍然提供了一个很好的可视化启发式方法来衡量模型在不同情况下的表现。
以下图表来自使用此评估环境的 6 个不同样本。
样本1
样本2
样本3
样本4
样本5
样本6
正如你所看到的,模型已经能够对一些价格曲线做出正确的决策,但不是全部。
特别是,最后三个曲线展示了模型的一些缺点。在样本 4 和 5 中,它似乎没有理解总体趋势是下降的,并且应该将其所有asset转换为cash。对于样本 6,模型似乎完全停止了决策。这很可能归因于价格曲线的高波动性,相对于前三条曲线包含许多局部最小值和最大值。由于价格变化如此之快,模型决定最好的选择是一直持有(stay)。
04
结论
我们的主要目标是测试我们的激励和行动方案是否可用于训练模型在简单的正弦曲线上做出获利的决策。尽管有一些样本的性能欠佳,但这里的目标是深入了解模型决策并告知我们如何设计未来的激励计划。
从这些基本概念,您可以着手构建更复杂的行动和激励计划,从中可以制作出成功的算法。可以使用 TensorTrade 创建的交易环境种类没有限制,我们鼓励每个人尝试不同的可能性。
上一页
上一页