2017-11-25 381 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