2017-11-25 380 views
1

这是我的第一篇文章。对不起,如果它看起来像一堵文字墙。 希望有人能够理解我的问题,并提供一个可以做到这一点的示例模块,或者一些代码来尝试。 我正在与时间序列CSV数据时,下面的实施例的行,列是(日期时间,O,H,L,C)Python优化算法调整线越过尽可能多的点

1999-10-26 21:00:00 68.81 68.83 68.07 68.19 
1999-10-27 21:00:00 68.19 68.2 66.83 67.43 
1999-10-28 21:00:00 67.43 68.06 66.91 68.06 
1999-10-29 21:00:00 68.06 68.11 66.31 66.66 
1999-01-11 22:00:00 66.66 67.15 66.09 66.63 
1999-02-11 22:00:00 66.63 67.38 66.42 66.58 
1999-03-11 22:00:00 66.58 67.73 66.42 67.48 
1999-04-11 22:00:00 67.48 67.81 66.54 66.76 
1999-05-11 22:00:00 66.76 68.2 66.54 67.87 

哪个是所谓烛台在金融价格数据,并可以被表示视觉上像这样:

enter image description here

现在,我想实现的是自动绘制,将横看成灯芯(垂直线的烛台)尽可能一条线,而不是跨越超过规定的公差更蜡烛体数量(绿色或红色区域)

希望这是有道理的。 示例。穿越尽可能多的灯芯(在这种情况下蜡烛下面)的线将开始在位置4,大约66.4,并且具有上升斜率,直到位置9大约在66.55 ...

我想象的线条基于上述

画面是否有一个模块,可以做到这一点,如果我提供了一个首发位置? 基本上,像一条最合适的线,但实际上穿过所有的点(一个点是一条垂直线,所以在x轴上的范围),同时避免穿过红色/绿色区域,所以本质上是趋势线(不是弯曲的)

如果这太复杂了,因为这条线是对角线,那么您最好还是提供一个水平线来做相同的示例(从x轴只有一个值)。例如,如最后两条记录的数据L(第四列)所示,66.54的值也可以起作用(它将穿过所有灯芯,并触摸最后两条记录) 请参阅黄线交叉或触摸所有低灯芯

在这种情况下值

(x轴)的起始位置蜡烛无关紧要的,并调节得

线在预定的点(例如,我可以选择在位置5将开始图像,这是最低点),并继续,直到获得最佳效果,以便它可以在任何地方停下来。然后我计划使用基于这两点的角度值来扩展这条线。因此,我要查找的输出实际上只是线((x,y)的对角线趋势线)或简单的x轴值(水平线)的终点位置。起点将被选择(A),并且终点基于算法优化,其中线应尽可能多地跨越蜡烛的垂直线(只看向起点的右侧),但保持跨越的计数蜡烛身体区域低于公认的阈值容限,直到找不到更好的解决方案。 (B)

我已经看过布雷森汉姆的线算法和一堆其他人,但没有看到如何在Python时间序列数据中实现这个。我希望这很容易就像使用fbprophet

真正的csv文件重达500MB,并包含多达600万行 我宁愿一个穷举算法,而不是遗传,每次都会产生不同的结果...

我已经就如何尝试在此期间做到这一点的一些想法,但找不到与示例中的任意合适的模块,以加快这一进程

如果这还不清楚......我想最大化在蜡烛中间(图片上的白线)所看到的线条穿过垂直线的次数,同时保持允许跨越限制为所选值的绿色/红色区域的次数。

我用pyqtgraph为visuallisation 实施例的代码,使剧情: http://www.pyqtgraph.org/downloads/0.10.0/pyqtgraph-0.10.0-deb/pyqtgraph-0.10.0/examples/customGraphicsItem.py

回答

0

如果正确地明白,要最大化的倾斜线的交叉点的数目与一组等间距的垂直线段的(交叉烛台的允许/禁止使得问题有点模糊)。

如果我也理解正确的话,一次可以有一百万段。

如果线的斜率是固定的,让m,可以以这样的方式剪切空间使该行成为水平并且端点是垂直通过量m.i用于段i(假设单元间距)平移。

然后,通过增加纵坐标对端点进行排序,您可以在翻译线条时轻松获得水平重叠的段数。这需要N Log N操作进行排序,N操作来构造计数功能。

现在对于任何斜率,您都可以获得可能的最大交叉数。如果此功能足够平滑,可以通过黄金比例法或类似方法搜索此功能的最大值。

+0

感谢您的建议,并指出我在正确的方向。经过进一步的研究,我相信我正在寻找的是一种算法,以返回+1或-1皮尔逊相关系数的所有可能性,其中元素多于2。 – Cactus