这是我的第一篇文章。抱歉,如果它看起来像一堵墙。 希望有人能理解我的问题,并提供一个可以做到这一点的示例模块,或者尝试一些代码。 我正在使用timeseries csv数据,下面是示例行,列是(datetime,O,H,L,C)
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
这是金融价格数据中所谓的烛台,可以直观地表示:
现在,我想要实现的是自动绘制一条线,该线尽可能多穿过烛芯(烛台上的垂直线),同时不超过指定容差数量的烛体(绿色或红色区域) )
希望这是有道理的。 例。跨越多个灯芯(在这种情况下在蜡烛下面)的线将从位置4开始,大约66.4并且有一个上坡,直到位置9大约66.55 ...
根据上图,
我想象的是什么样的线条
如果我提供起始位置,是否有可以执行此操作的模块? 基本上,类似于最佳拟合线,但实际上穿过所有点(一个点是垂直线,因此x轴上的范围),同时避免穿过红色/绿色区域,因此基本上是趋势线(不是弯曲的)< / p>
如果这是太复杂,因为线是对角线,你也可以提供一个水平线的例子来做同样的事情(只是x轴中的一个值)。例如,值66.54也可以工作(它将穿过所有灯芯,并触摸最后两个灯芯),如最后两条记录的数据L(第4列)所示 看黄线穿越或触摸所有低灯芯
在这种情况下,起始位置蜡烛的值(x轴)无关紧要并且也进行了调整
线将从预定义的点开始(例如,我可以选择图像中的位置5,这是最低点)并继续直到达到最佳结果,因此它可以在任何地方停止。然后我计划使用基于这两点的角度值来扩展这条线。
所以我正在寻找的输出实际上只是线的终点位置((x,y),如果是对角线趋势线)或者只是x轴值(水平线)。选择起点(A)和终点将基于算法优化,其中线应尽可能多地穿过蜡烛的垂直线(仅查看起点的右侧)但保持穿越的数量。蜡烛体区域低于公认的阈值容差,直到找不到更好的解决方案。 (B)
我看过Bresenham的Line算法和其他一些算法,但是没看到如何在python中对这些时间序列数据实现这一点。我希望使用fbprophet
很容易Real csv文件的重量最大为500MB,最多包含600万行 我宁愿使用详尽的算法而不是遗传算法,每次都会产生不同的结果......
我有一些关于如何在此期间尝试这样做的想法,但找不到任何适当的模块以及加快过程的示例
如果仍然不清楚...我想最大化线条穿过垂直线的次数,如蜡烛中间(图片上的白线)所示,同时保持允许的次数跨越限制在所选值的绿色/红色区域。
我使用pyqtgraph来进行视觉化 制作图表的示例代码: http://www.pyqtgraph.org/downloads/0.10.0/pyqtgraph-0.10.0-deb/pyqtgraph-0.10.0/examples/customGraphicsItem.py
答案 0 :(得分:0)
如果我理解正确,你想要最大化一条斜线与一组等间距垂直线段的交叉点数量(过度烛台的允许/不允许使问题有点模糊)。
如果我也理解正确,一次可能有数百万个细分市场。
如果线的斜率是固定的,让m
,你可以剪切空间,使得线变为水平线,端点垂直平移线段m.i
i
1}}(假设单位间距)。
然后,通过增加纵坐标对端点进行排序,您可以在平移线时轻松获得水平重叠段的数量。这需要N Log N
操作进行排序,并N
操作来构造计数功能。
现在对于任何坡度,您都可以获得最大数量的可能交叉点。如果此功能足够平滑,您可以通过黄金比率法或类似方法搜索此功能的最大值。