paint-brush
算法流程图法术:在外汇网上交易平台网上交易中采取图论 过程@optiklab
1,062 讀數
1,062 讀數

算法魔法:在外汇交易中利用图论

通过 Anton Yarkov22m2023/10/28
Read on Terminal Reader

太長; 讀書

继我之前的努力之后,我继续使用图和图遍历算法来寻找一种有利可图的货币兑换方式。
featured image - 算法魔法:在外汇交易中利用图论
Anton Yarkov HackerNoon profile picture
若是您熟练掌握金融投入创新科持创立于产业,您或者我听说过品牌总部靠近英式都柏林的知名度金融投入创新科持三巨头Revolut。 Revolut 创立于 2015 年,已换取很多投入,成英式发展趋势快速的创立于工厂一种,为很多澳洲公民权出示农行服务项目。


即使信用社金融业务在是如何造成薪资年收入地方并非笼罩着在新奇世间,但 Revolut 2020 年和 2021 年的几个关键因素数据显示现在已经体现了了其薪资年收入来自:


革命损益表


如图图甲中图甲中,这儿新农行利润的更大一步分是来自于现货黄金(FX)、创富处理(其中包括进行加密货比)和卡服務。可以重视的是,2021 年,现货黄金是最怎样赚钱的领域。


我的一味朋友们也是属于名PC游戏项目科技水利师,他曾一度说说过属于至于他几节前在 Revolut PC游戏项目水利机构来科技面视的有意义内容。他的任務是搭建属于计算方式方法,以选择选用属于或多种多样上面经济转变这两种经济最极为有利的可图的方式方法。近义句,许多人已经在录找属于经济套利交易机制。


货币套利是一种交易策略,其中货币交易者通过多次交易利用经纪商为特定货币对提供的不同点差。


任务卡中知道谈到计算方法的基础条件不得不深植图论。


外汇基础知识

FX(即现货黄金交易)在世界里各国易货贸易中充分调动功效着关键所在功效,支撑架着他们互不建立联系的世界里的运营。很明显,现货黄金交易在银行业被选为最极富的安排组成各方面也充分调动功效强调要功效。


外汇成交平台形成的毛利率大部分是购置价(BID)和卖掉价(ASK)内的价差或点差。尽管每笔成交的这个差别有机会让 微不佳道,但综合要考虑平日运维量,它会累计成数十万万澳元的毛利率。这使人几个司都可以仅仰仗他们较高自功化的财务会计运维来强盛的发展。


在 FX(外汇交易平台)邻域,公司自始至终的使用钱币对,假如英镑/英镑。在部分是数情况报告下,一些相互交换是双项的(即英镑/英镑和英镑/英镑),但会每一位角度的利率值都有差异。


套利对代表两种货币(例如欧元和美元)价值之间的数值比率,决定它们之间的汇率。


潜在地,我们可以使用多种中间货币进行有利可图的交易,这被称为“肯定的赌注”


套利保证赌注是一组以循环方式使用的对。


诸多具备商主要采用数学试卷绘制和解析来提高认识我自己的盈利空间并以免的人从从盈利。那么,这里英文或者会重视该套语。


确定下注长度是指构成一组潜在套利机会的对的数量。


在本质游戏世界中,各种各个银行系统或的交易app平台中间的美金汇率或者出现所各种各个。外国游客女主穿越一座什么城区追寻最佳惠价的情况发生并一些见。选用计算的机免费软件,当您就能够采访给出商汇总时,此具体步骤就能够在几毫秒内完全。在合理的能买卖价格中,2个参与将相关用多种买卖价格服务平台的多种现金参与换钱。也就是说,套利交易圈需要特别非常广泛。


套利圈是获取一种货币,将其转移到另一个平台,与其他货币进行兑换,最终返回到原始货币。


两种货币之间通过一种或多种中间货币进行的汇率计算为这些中间交易的汇率的乘积


一个例子

譬如,假设检验.我想要用人民币 网上购买法国法郎,然而将法郎获得成日币,然而再出卖日币换到人民币 。在 2023 年 春季,.我有下列利率:


  1. 小编就能够用 1 欧元选用 0.91 CHF(歪果法郎)。
  2. .我是可以用 1 瑞士队法郎售卖 163.16 日币。
  3. 当我们可以用 1 韩元买入 0.0067 欧元。


就让们用一工作表格来体现它:
 1 USD | 1 CHF | 1 YEN 0.91 CHF | 163.16 YEN | 0.0067 USD ----------------|-------------------|-------------- 1.098901099 | 0.006128953 | 149.2537313


现在,我们需要找到这些值的乘积。当该产品产生的值小于 1 时,一系列交易变得有利可图

 1.098901099 * 0.006128953 * 149.2537313 = 1.005240803


我门能看见最终高于 1,以至于看开来我门损失率了 0.05% 的钱。但大概有几多呢?我门能怎样清理:
 0.91 CHF * 163.16 (YEN per 1 CHF) * 0.0067 (USD per 1 YEN) = 0.99478652 US Dollars


因为,开开始了卖到 1 加元后,.我终于拥有 0.994 - 不倒 1 加元。


容易来看,当都可以用不大于一方的相同之处世界虚拟货币得到 一方的世界虚拟货币时,无风险套利寿命就有弊可图。


猜测他们看见有机肥料会在开始消费中每 1 元入账 0.92 瑞典法郎,而不能 0.91 瑞典法郎:
 1 USD | 1 CHF | 1 YEN 0.92 CHF | 163.16 YEN | 0.0067 USD ----------------|-------------------|-------------- 1.086956522 | 0.006128953 | 149.2537313


乘积将值为 1:
 1.086956522 * 0.006128953 * 149.2537313 = 0.994314272


这暗示着着,以真正钱币核算,它会给们面临已经超过 1 人民币的投资收益:
 0.92 CHF * 163.16 (YEN per 1 CHF) * 0.0067 (USD per 1 YEN) = 1.00571824 US Dollars


Wuolah,我们得到了一些利润!现在,让我们看看如何使用图形分析来自动化此操作。

由此,检验 3 个无风险无风险套利对的无风险无风险套利圈中的利润率或损失费的计算方式下列图示:
 USD/CHF * CHF/YEN * YEN/USD < 1.0

图形表示

为了能半深圳自动化某些的时候,公司能够动用统计图。以前提过的和表格能够清新地和转化了为图的分块矩阵认为,这当中构件表达币,边表达交叉相互交换。


故此,在向量中透露两个交流很简约,详细图甲中:
 EUR USD 1 1 EUR 1 1 USD


基于涉及及的对的使用量,.我的矩阵的特征值能能扩容:
 EUR USD YEN CHF 1 1 1 1 EUR 1 1 1 1 USD 1 1 1 1 YEN 1 1 1 1 CHF


因为,比如我大家要考虑较多的交易价格软件平台和信息,就算只要有二者币,我大家的凳子也会看上去相等于大。


只为改善其实的货比对冲套利疑问,通畅实用含有货比参考价格的一切的联系的删改条形图。六种货比兌换表会如下所述如下图所示:
 USD CHF YEN { 1.0, 1.10, 0.0067 } USD { 0.91, 1.0, 0.0061 } CHF { 148.84, 163.16, 1.0 } YEN


我们公司就可以实用一些比较简单的来表现硬盘中的金币对:
 class GraphNode { public: string Name; }; class Graph { public: vector<vector<double>> Matrix; vector<GraphNode> Nodes; };


目前 ,人们只需要寻找是如何遍历整个图并选择最极为有利的可图的小圈子。但另外还有条个原因...

数学再次拯救我们

经典图算法不太适合处理边长的乘积,因为它们旨在查找定义为这些长度之和的路径(请参阅任何众所周知的经典路径查找算法)。


或许,为了更好地避开的这限定,很多种数学试卷策略能能将乘积换算为和:常用对数计算计算。要乘积诞生在常用对数计算计算下,则能能将其换算为常用对数计算计算之和。


对数


在这里等式的右边,需求的小数高于等于一,反映该小数的对数计算须要高于等于零:
 LogE(USD/CHF) * LogE(CHF/YEN) * LogE(YEN/USD) < 0.0


这个简单的数学技巧使我们能够从搜索边长乘积小于 1 的环路转变为搜索边长总和小于零的环路

企业的矩阵的值值变为为 LogE(x) 并在点后舍入 2 数字字,现时正确如下图所示:
 USD CHF YEN { 0.0, 0.1, -5.01 } USD { -0.09, 0.0, -5.1 } CHF { 5.0, 5.09, 0.0 } YEN


现阶段,安全使用经典英文图聚类算法都可以更加容易地避免这里间题。我门需用的是遍历数据图表搜索最有助可图的对调渠道。

图算法

每类java算法都其的的局限。我从中提及到过至少一系列。

我们不能在这里应用经典的 BFS、DFS 甚至 Dijkstra,因为我们的图可能包含负权重,这可能会在遍历图时导致负循环。负循环对算法提出了挑战,因为它在每次迭代中不断找到更好的解决方案。


方便化解这里原因,贝尔曼-福特计算方式简略地受限了最速下降法频繁。它在一两个重复中遍历图的一条边,并对每个边APP松驰不超 V-1 次(在这其中 V 是组件数)。


从而,贝尔曼-福特神经网络算法是该无风险套利系统的核心思想,是由于它可看到图上两端点相互间充分满足两基本上规范标准的线路:因此构成负网站权重同时不会负循环往复的1一些。


既然这java算法在理论体系上很容易(你都可以以找回数百亿个关与它的视頻),但确保我门都的要求的实际的确保还要部分全力以赴。使我门都坚持问题导向的研究下。

贝尔曼-福特算法实现

原因这篇文的的目的是算出机科学研究,于是我将选用与实际存在费率关系不大的幻想费率。


想要更顺利的地的介绍该法求,要我国采用的已经不包含了负循环法的图:
 graph.Nodes.push_back({ "USD" }); graph.Nodes.push_back({ "CHF" }); graph.Nodes.push_back({ "YEN" }); graph.Nodes.push_back({ "GBP" }); graph.Nodes.push_back({ "CNY" }); graph.Nodes.push_back({ "EUR" }); // Define exchange rates for pairs of currencies below // USD CHF YEN GBP CNY EUR graph.Matrix = { { 0.0, 0.41, INF, INF, INF, 0.29 }, // USD { INF, 0.0, 0.51, INF, 0.32, INF }, // CHF { INF, INF, 0.0, 0.50, INF, INF }, // YEN { 0.45, INF, INF, 0.0, INF, -0.38 }, // GBP { INF, INF, 0.32, 0.36, 0.0, INF }, // CNY { INF, -0.29, INF, INF, 0.21, 0.0 } }; // EUR


当图片不足负循环系统时,下的码例子在使用 Bellman-Ford 汉明距离检查三个结点相互的线路:
 vector<double> _shortestPath; vector<int> _previousVertex; void FindPath(Graph& graph, int start) { int verticesNumber = graph.Nodes.size(); _shortestPath.resize(verticesNumber, INF); _previousVertex.resize(verticesNumber, -1); _shortestPath[start] = 0; // For each vertex, apply relaxation for all the edges V - 1 times. for (int k = 0; k < verticesNumber - 1; k++) for (int from = 0; from < verticesNumber; from++) for (int to = 0; to < verticesNumber; to++) if (_shortestPath[to] > _shortestPath[from] + graph.Matrix[from][to]) { _shortestPath[to] = _shortestPath[from] + graph.Matrix[from][to]; _previousVertex[to] = from; } }


针对人民币运行此代码会填充_previousVertex数组并产生如下结果:

 Path from 4 to 0 is : 4(CNY) 3(GBP) 0(USD) Path from 4 to 1 is : 4(CNY) 3(GBP) 5(EUR) 1(CHF) Path from 4 to 2 is : 4(CNY) 3(GBP) 5(EUR) 1(CHF) 2(YEN) Path from 4 to 3 is : 4(CNY) 3(GBP) Path from 4 to 4 is : 4(CNY) Path from 4 to 5 is : 4(CNY) 3(GBP) 5(EUR)


然而您所考察到的,它确认了国民币与各项其他的数字货币彼此的最佳选择路劲。


要不然做次,我会专注力于只寻找到1个尽量的,鉴于它是相对来说简单易行的的任务,而不算这段话的个人目标。


据此满足在好条件下体验不错,但在处置其中包含负反复的的图案时体验不佳。

检测负循环

当自己正宗需的是够辨识数据图表要不要分为负再循环,如是,则查出有方面的方面。这类相关知识使当自己够消除这类方面并进而察觉重要可图的小链。


迭代更新的次数并不一定肯定精确度高地满足 V - 1。若果在第 (N+1) 个反复的中未出现 比第 N 个反复的中的相对路径名更强的相对路径名,则而言看去了处理策划方案。所以,都有轻柔优化调整的室内空间。


前加讲过的码应该促进,不单应该查找相对路径,还应该检验图是否能够涉及负反复,还包括我讲过的优化调整:
 vector<double> _shortestPath; vector<int> _previousVertex; bool ContainsNegativeCycles(Graph& graph, int start) { int verticesNumber = graph.Nodes.size(); _shortestPath.resize(verticesNumber, INF); _previousVertex.resize(verticesNumber, -1); _shortestPath[start] = 0; // For each vertex, apply relaxation for all the edges V - 1 times. for (int k = 0; k < verticesNumber - 1; k++) { updated = false; for (int from = 0; from < verticesNumber; from++) { for (int to = 0; to < verticesNumber; to++) { if (_shortestPath[to] > _shortestPath[from] + graph.Matrix[from][to]) { _shortestPath[to] = _shortestPath[from] + graph.Matrix[from][to]; _previousVertex[to] = from; updated = true; } } } if (!updated) // No changes in paths, means we can finish earlier. break; } // Run one more relaxation step to detect which nodes are part of a negative cycle. if (updated) for (int from = 0; from < verticesNumber; from++) for (int to = 0; to < verticesNumber; to++) if (_shortestPath[to] > _shortestPath[from] + graph.Matrix[from][to]) // A negative cycle has occurred if we can find a better path beyond the optimal solution. return true; return false; }


目前当我们便用其中的一个更非常复杂的数据表格,其中的收录负无限循环:
 graph.Nodes.push_back({ "USD" }); // 1 (Index = 0) graph.Nodes.push_back({ "CHF" }); graph.Nodes.push_back({ "YEN" }); graph.Nodes.push_back({ "GBP" }); graph.Nodes.push_back({ "CNY" }); graph.Nodes.push_back({ "EUR" }); graph.Nodes.push_back({ "XXX" }); graph.Nodes.push_back({ "YYY" }); // 8 (Index = 7) // USD CHF YEN GBP CNY EUR XXX YYY graph.Matrix = { { 0.0, 1.0, INF, INF, INF, INF, INF, INF }, // USD { INF, 0.0, 1.0, INF, INF, 4.0, 4.0, INF }, // CHF { INF, INF, 0.0, INF, 1.0, INF, INF, INF }, // YEN { INF, INF, 1.0, 0.0, INF, INF, INF, INF }, // GBP { INF, INF, INF, -3.0, 0.0, INF, INF, INF }, // CNY { INF, INF, INF, INF, INF, 0.0, 5.0, 3.0 }, // EUR { INF, INF, INF, INF, INF, INF, 0.0, 4.0 }, // XXX { INF, INF, INF, INF, INF, INF, INF, 0.0 } }; // YYY


我国的系统软件都是退出并凸显一根最新消息:
 Graph contains negative cycle.


当你们并能强调一些故障 ,可是,当你们需手机浏览数据表格中含一些故障 的区域。

避免负循环

要满足这一个,.我将选用常量值 NEG_INF 标识专属负循环往复一台分的三角形的中心:
 bool FindPathsAndNegativeCycles(Graph& graph, int start) { int verticesNumber = graph.Nodes.size(); _shortestPath.resize(verticesNumber, INF); _previousVertex.resize(verticesNumber, -1); _shortestPath[start] = 0; for (int k = 0; k < verticesNumber - 1; k++) for (int from = 0; from < verticesNumber; from++) for (int to = 0; to < verticesNumber; to++) { if (graph.Matrix[from][to] == INF) // Edge not exists { continue; } if (_shortestPath[to] > _shortestPath[from] + graph.Matrix[from][to]) { _shortestPath[to] = _shortestPath[from] + graph.Matrix[from][to]; _previousVertex[to] = from; } } bool negativeCycles = false; for (int k = 0; k < verticesNumber - 1; k++) for (int from = 0; from < verticesNumber; from++) for (int to = 0; to < verticesNumber; to++) { if (graph.Matrix[from][to] == INF) // Edge not exists { continue; } if (_shortestPath[to] > _shortestPath[from] + graph.Matrix[from][to]) { _shortestPath[to] = NEG_INF; _previousVertex[to] = -2; negativeCycles = true; } } return negativeCycles; }


现如今,但如果大家公司在 _shortestPath 数组中找到 NEG_INF,大家公司还可以表现一道qq消息并绕开该段,时还是选定许多货币价格的最合适来处理办法设计。举列,相对于子域 0(是外币):
 Graph contains negative cycle. Path from 0 to 0 is : 0(USD) Path from 0 to 1 is : 0(USD) 1(CHF) Path from 0 to 2 is : Infinite number of shortest paths (negative cycle). Path from 0 to 3 is : Infinite number of shortest paths (negative cycle). Path from 0 to 4 is : Infinite number of shortest paths (negative cycle). Path from 0 to 5 is : 0(USD) 1(CHF) 5(EUR) Path from 0 to 6 is : 0(USD) 1(CHF) 6(XXX) Path from 0 to 7 is : 0(USD) 1(CHF) 5(EUR) 7(YYY)


哇啦!即使大家的动态统计数据“优势脏”,但大家的编码可以区分大多极为有利的可图的链。上提及的几乎所有编码例子(包含测式动态统计数据)均在上与您公享。

即使很小的波动也很重要

到现在让你们夯实基础看看所报的项目。给定七种币种的人民币汇率列表页,自己可不可以轻易监测负时间:
 graph.Nodes.push_back({ "USD" }); // 1 (Index = 0) graph.Nodes.push_back({ "CHF" }); graph.Nodes.push_back({ "YEN" }); // 3 (Index = 2) // LogE(x) table: USD CHF YEN graph.Matrix = { { 0.0, 0.489, -0.402 }, // USD { -0.489, 0.0, -0.891 }, // CHF { 0.402, 0.89, 0.0 } }; // YEN from = 0; FindPathsAndNegativeCycles(graph, from);


结杲:
 Graph contains negative cycle. Path from 0 to 0 is: Infinite number of shortest paths (negative cycle). Path from 0 to 1 is: Infinite number of shortest paths (negative cycle). Path from 0 to 2 is: Infinite number of shortest paths (negative cycle).


不过,纵然固定汇率再次发生细小不同(即引流矩阵优化)也概率产生显长对比分析:
 // LogE(x) table: USD CHF YEN graph.Matrix = { { 0.0, 0.490, -0.402 }, // USD { -0.489, 0.0, -0.891 }, // CHF { 0.403, 0.891, 0.0 } }; // YEN from = 0; FindPathsAndNegativeCycles(graph, from);


看,公司寻得了一个有利于可图的链:
 Path from 0 to 0 is : 0(USD) Path from 0 to 1 is : 0(USD) 2(YEN) 1(CHF) Path from 0 to 2 is : 0(USD) 2(YEN)


各位能将哪些原则利用于很大的图形,密切相关许多种货币价格:
 graph.Nodes.push_back({ "USD" }); // 1 (Index = 0) graph.Nodes.push_back({ "CHF" }); graph.Nodes.push_back({ "YEN" }); graph.Nodes.push_back({ "GBP" }); graph.Nodes.push_back({ "CNY" }); // 5 (Index = 4) // LogE(x) table: USD CHF YEN GBP CNY graph.Matrix = { { 0.0, 0.490, -0.402, 0.7, 0.413 }, // USD { -0.489, 0.0, -0.891, 0.89, 0.360 }, // CHF { 0.403, 0.891, 0.0, 0.91, 0.581 }, // YEN { 0.340, 0.405, 0.607, 0.0, 0.72 }, // GBP { 0.403, 0.350, 0.571, 0.71, 0.0 } }; // CNY from = 0; runDetectNegativeCycles(graph, from);


但是,我们公司也许会得到很多个侯选者来获取一个利益:
 Path from 0 to 0 is : 0(USD) Path from 0 to 1 is : 0(USD) 2(YEN) 1(CHF) Path from 0 to 2 is : 0(USD) 2(YEN) Path from 0 to 3 is : 0(USD) 2(YEN) 3(GBP) Path from 0 to 4 is : 0(USD) 2(YEN) 4(CNY) 


斯克鲁奇·麦克老鸭


只有,有这两个关键性重要因素:
  1. 时是开展套利交易期间的关键的原因,大部分是会因为贷币房价的如何快速震荡。这样,明确赌局的使用期限相当短促。
  2. 游戏平台对每笔网上交易再次收取提佣。


因此,通过限制确定赌注的长度来实现最小化时间成本减少佣金至关重要。


生产经验意味着,可配受或许确定注大小一般性为 2 到 3 对。除此认知能力,测算的要求连续不断升級,寄售APP免收大的手续费。


所以说,要赚回创收并严重不必以享用这部分枝术,还要有拥有低关卡的返点。一般,仅仅只有特大型财务公司手里才有这样子的材料。


使用智能合约实现自动化

我更加深入论述了国际外汇实操的语言表达与怎么样才能能从中了解毛利,但我可以还没有碰触应用于运行这实操的工艺。尽管这里一话题一点偏移题目,但我不会能依赖谈起自动化期货合约。


在使用自动化协议是当今世界来炒国际外汇基本作业最具去创造性的行为之1。自动化协议可改变进行炒国际外汇基本作业,不要网络延时或人为干涉(自动化协议的建立以外)。


Solidity 都是种针对性的代码编程语言的,应用在创造一键化合同规定,使牵涉加锁虚拟货币的可能性管控进行操作一键化。一键化合同规定的游戏是日常动态的,并深受尽快的的技术革命和某个劲变换的法的会影响。这都是个起着很大的炒高和与小钱包和法正规对应的重点可能性的区域。


而是没有任何质疑有才气横溢的我和开发团队从这种范畴收益,但总有监管中介机构中介机构奋发努力保证市厂守则达到运维。

我们为什么要调查这个?

无论怎样国际社会经济冗杂、晦涩且无法精准预测,外汇交易仍是风险管控生活的隐蔽能量力。它有的是个关键所在基本概念,使全生活数以千计的企业和数以5000万计的人才能跨越国界以幸福的的方法公司合作、出具精准服务并共利共赢共利。


当,政治学、稽查和中央人民银行等种因素分析一定会影响力外汇交易率和外汇交易效应。这一些繁复性使人金融科技分区布局错综繁复。而是,他们必要我相信这一些繁复性促进保持联合个人利益的更广要求。


不少科学合理论文题目开展调研科研了世界各国经济能力中固定汇率的存在的和确定,仅举几例:

这个毕业论文阐发了外汇交易平台的些许大多机能,但这个机能一样不易定义并融入到另外一种建模。


可是,玩编号并试着得到预期故障的处理好方案范文幫助我拥有了较多踪迹。我祝愿我们和你相同感兴趣那次大大的深入研究之夜。为感重视!

链接

  • Sedgewick R. - C 语言算法,第 5 部分:图算法


也上架。


바카라사이트 바카라사이트 온라인바카라