关于人工智能发展和代码性能优化的中期报告

故事标题图片

扑克机器人已死,BitSurfer万岁!- 不,说真的,发生了什么?

PokerBot和Poker Advisor是两个非常有趣的项目,我从这两个项目中学到了很多东西!扑克顾问从屏幕上拿起牌,自动输入AI,并预测手牌的结果。虽然扑克宝计划自己玩--一切都准备好了,但在线扑克在瑞士几乎是被禁止的。

所以是时候继续前进了。但下一个大的挑战可能是什么?

比特币价格表

我偶然发现了Coinbase,这是一家加密经纪商,我主要对比特币感兴趣。

他们有一个API,通过它你可以连接你最喜欢的交易软件,如Metatrader或类似的。但是没有。

当然,这个计划不是和我们喜欢的交易软件对接。而是以我的需求为出发点,从头开始构建自己的界面。这是难以置信的困难和非常陡峭的学习曲线,但它肯定是值得的努力。

第一个alpha版本已经准备好了。界面非常丑陋,但形式服从功能。我所认为的精心设计的软件主要不是花哨的用户界面。相反,我希望我的软件能简单地做它的事情。絕對的背景是:什么都不用安装,什么都不用坐在屏幕前告诉软件下一步该怎么做。只要运行起来,看得津津有味。

该界面基本上包括市场数据的可视化以及人工智能的标准化输入数据。

我学到了什么?首先,我必须连接到Coinbase。我学到了很多关于API的知识,幸运的是有了可用的包,这很容易。

编程性能方面的介绍

我必须学习很多关于人工智能的数据结构,这基本上涉及到很多关于代码性能的知识。到了完全疯狂的地步。主要是我还在用我那台培训回来的7年的老机器。虽说是老字号,但你能真正感受到岁月的....。从我的下一台即将上市的电脑上,我可以期待10倍的性能来满足我的用例。如果消耗大量线程的话,单单是处理器就快了400%左右(我就是这样)。

我发现自己遇到了以下情况。

我的代码处理8年的数据大约需要一周的时间(每个数据点是2s~126,000,000个价格点)。同时,下一代处理器和显卡只有几个月的时间,非常有前景。

需要处理的数据量非常大,所以我就开始研究代码性能优化。我已经有了一些多线程工作者同时处理多个任务的经验。结果,由于我的CPU有4个核心,我的性能已经低于3.5倍。现在处理8年的数据需要两天时间。这还是太过分了。当我运行回溯测试时,我想看到结果。我想让他们快点。

我不得不多研究一下性能优化,于是在C#中基于任务开发了自己的worker抽象。基本上,它实现了我在INA Lahr实习时学到的一种制作方法。这就像有一台机器(或工作者),有一个输入队列和一个输出队列。队列就像一个缓冲区,可以帮助每个cpu核心均匀地分配工作。它就像一个模块化的、可扩展的工人流水线,工人可以从队列或袋子中取出物品并进行处理。

这也让性能得到了很大的提升。现在我大约在一个晚上就能处理完所有的数据,但我决定进一步复制,只是想看看它能走多远。我订阅了一个Visual Studio扩展 "dotTrace",它在寻找代码中的瓶颈时非常有效。你可以记录一个跟踪,然后逐个函数查看它的执行时间。我发现了一个我完全没有想到的功能--输出字符串构建器节制了整个管道。你可以在堆栈溢出问题

总而言之,这个过程很简单。

  1. 确定最大的功率负荷
  2. 消除它
  3. 继续这样做,直到你有一个合理的性能。

在上面的例子中,这应该是ID为10584的CLR Worker进程,这时听起来有点混乱,但JetBrains在右边的调用树上,我们可以看到正在使用哪个函数。

结论和启示

我知道在这方面会有更多的力量,但目前我对这个结果很满意。

眼下,2年的时间不到4分钟就飞逝而过,如果要更仔细地观察行动,我已经换档了。

背部测试者的截图

股权线以及统计数据也被保存下来。它可以模拟/运行任意数量的账户和策略,而性能却只下降了一小部分。

我已经尝试过不同的策略与指标等。没有取得可喜的成果。毕竟,我找到了一个成功的策略,而不是做这些事情。它既不随波逐流,也不与之对赌。它并没有试图预测什么。既没有完美的切入点,也没有完美的出口。很简单,但我就不细说策略了。跳出框框,你可能会有所发现。

股票额度上升

这可是高达20%的年收益。平心而论,如果采用买入并持有的策略,我会有更大的空间,但另一方面,我并没有预测什么,我们没有这些疯狂的尖峰(和暴跌)。

现在我可以在这个基础上,看看什么是可能的,什么是不可能的。一个完整的沙盘模拟市场。一个几乎具有无限可能性的测试环境。

今天就到这里了,希望大家喜欢看我正在进行的一些项目。