程式
從 Python 中的 OHLC 數據中檢測模式
我正在嘗試創建一個從標準 OHLC 數據中查找模式的腳本。我現在正在尋找的特定模式是向上移動後的橫向移動,這是一個範例:
所以基本上我的程式碼應該檢測價格何時在上面的盒子裡。
我知道這不容易做到,而且我不是在找人來提供他們的程式碼,我只需要一些幫助來找到關於這個問題的大致方向或一些資源/庫,如果有的話。
我的想法如下:檢測價格何時上漲,如果價格在上漲後開始在 X 和 Y 區間之間移動(因此不會過度上升或下降),將其標記為範圍(這就是我尋找)。我認為這應該可行,但我不知道如何將其寫入程式碼。
這是我所擁有的:
import copy import urllib import numpy as np import pandas as pd import cfscrape import json import datetime from datetime import datetime as dt BU = cfscrape.create_scraper() URL = "https://api.binance.com/api/v1/klines?&symbol=ADABTC&interval=1h&limit=250" ResultRaw = BU.get(URL, timeout=(10, 15)).content Result = json.loads(ResultRaw) for x in Result: TimeUnix = float(x[0]) / float(1000) K = datetime.datetime.fromtimestamp(TimeUnix) x[0] = K Variation = Result.index(x) Previous = Variation-1 Variation = ((float(x[4])-float(x[1]))/float(x[1]))*100 print(Variation) df = pd.DataFrame([x[:6] for x in Result], columns=['Date', 'Open', 'High', 'Low', 'Close', 'Volume']) format = '%Y-%m-%d %H:%M:%S' df['Date'] = pd.to_datetime(df['Date'], format=format) df = df.set_index(pd.DatetimeIndex(df['Date'])) df["Open"] = pd.to_numeric(df["Open"],errors='coerce') df["High"] = pd.to_numeric(df["High"],errors='coerce') df["Low"] = pd.to_numeric(df["Low"],errors='coerce') df["Close"] = pd.to_numeric(df["Close"],errors='coerce') df["Volume"] = pd.to_numeric(df["Volume"],errors='coerce')
這是我正在做的事情:
- 檢索數據
- 使其成為 JSON 數據
- 對於每一行,確定價格變化的百分比,這
Variation
就是- 使其成為 Pandas 數據框
任何形式的幫助表示讚賞!
據我所知,沒有圖書館。與其他一些研究人員一起,我們在 20 年前在方案中實現了這一點(是的,很久以前,當 Lisp 而不是 python 是人工智慧的語言時)。
我們的方法(非常快)如下
- 你需要一個時間尺度,例如一周
- 標記時間尺度上的所有局部最小值和局部最大值
- 現在你需要形成經過其中兩個的線,而不是越過“價格線”,如果你想一想的話;要有效率
- 您只能將局部最小值和局部最大值連接在一起,因此您需要一個可以執行兩次的程式碼,一旦您“反轉”價格(即 $ \times (-1) $ ).
- 一旦你檢測到線路連結 $ m_i $ 至 $ m_j $ 越過“價格線”,您可以從列表中刪除很多 $ m_k $ 在哪裡 $ k>j $ 如果它們高於 $ [m_i,m_j) $ 線
- 現在你有一組連接兩個(不是強制連續的)局部最小值的線 $ (m_i,m_j) $ 在一起,你“只是”必須
- 與每條線的水平軸成角度
- 檢查具有一個共同的局部最小值的線是否具有“相同的角度”(您需要一個門檻值來使兩個角度不同;如果您想要真實,計算正確的門檻值是很棘手的)
- 現在你有一個包含 3 個局部最小值的行列表
- 你可以迭代
- 在舞台上,你有大量的線條,其特點是
- 起點和終點(它們穿過價格線或一個局部極值的位置)
- 它與 $ x $ 軸
- 它的“支持點”數量(請注意,如果您有 3 個“對齊點”,則有 3 條不同的線:2 條帶 2 點,1 條帶 3 點)
- 您需要編寫“正則表達式”語言來創建此類行的組合,例如
- 一個開放的三角形是:一條上線和一條下線,開角為正,跨越至少 3 個共同的日期
- 頭肩線由三條線組成:兩條具有“幾乎對稱”角度的上部(分別是下部)線和一條“幾乎水平”的下部(分別是上部)線,跨越至少 5 個共同的日期
如果你實現它,請給我一份你的程式碼;{)}
$$ EDIT $$似乎有一個中等文章,指向一個 quantopian 程式碼,這與我的描述非常接近。然而,程式碼似乎很差。 例如,這是在 pandas 中查找局部最大值(60 天)的一行程式碼:
prices.iloc[np.where((prices.rolling(60,center=True).max()==prices).values)[0],:]
而在 quantopian 程式碼中,它們有 20 行複雜的程式碼(應該是 2,因為它們執行 min 和 max)。我的建議是重新實現,坦率地說它並不復雜。