程式

從 Python 中的 OHLC 數據中檢測模式

  • July 9, 2020

我正在嘗試創建一個從標準 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')

這是我正在做的事情:

  1. 檢索數據
  2. 使其成為 JSON 數據
  3. 對於每一行,確定價格變化的百分比,這Variation就是
  4. 使其成為 Pandas 數據框

任何形式的幫助表示讚賞!

據我所知,沒有圖書館。與其他一些研究人員一起,我們在 20 年前在方案中實現了這一點(是的,很久以前,當 Lisp 而不是 python 是人工智慧的語言時)。

我們的方法(非常快)如下

  1. 你需要一個時間尺度,例如一周
  2. 標記時間尺度上的所有局部最小值和局部最大值
  3. 現在你需要形成經過其中兩個的線,而不是越過“價格線”,如果你想一想的話;要有效率
  • 您只能將局部最小值和局部最大值連接在一起,因此您需要一個可以執行兩次的程式碼,一旦您“反轉”價格(即 $ \times (-1) $ ).
  • 一旦你檢測到線路連結 $ m_i $ 至 $ m_j $ 越過“價格線”,您可以從列表中刪除很多 $ m_k $ 在哪裡 $ k>j $ 如果它們高於 $ [m_i,m_j) $ 線
  1. 現在你有一組連接兩個(不是強制連續的)局部最小值的線 $ (m_i,m_j) $ 在一起,你“只是”必須
  • 與每條線的水平軸成角度
  • 檢查具有一個共同的局部最小值的線是否具有“相同的角度”(您需要一個門檻值來使兩個角度不同;如果您想要真實,計算正確的門檻值是很棘手的)
  • 現在你有一個包含 3 個局部最小值的行列表
  • 你可以迭代
  1. 在舞台上,你有大量的線條,其特點是
  • 起點和終點(它們穿過價格線或一個局部極值的位置)
  • 它與 $ x $ 軸
  • 它的“支持點”數量(請注意,如果您有 3 個“對齊點”,則有 3 條不同的線:2 條帶 2 點,1 條帶 3 點)
  1. 您需要編寫“正則表達式”語言來創建此類行的組合,例如
  • 一個開放的三角形是:一條上線和一條下線,開角為正,跨越至少 3 個共同的日期
  • 頭肩線由三條線組成:兩條具有“幾乎對稱”角度的上部(分別是下部)線和一條“幾乎水平”的下部(分別是上部)線,跨越至少 5 個共同的日期

如果你實現它,請給我一份你的程式碼;{)}

$$ EDIT $$似乎有一個中等文章,指向一個 quantopian 程式碼,這與我的描述非常接近。然而,程式碼似乎很差。 例如,這是在 pandas 中查找局部最大值(60 天)的一行程式碼:

prices.iloc[np.where((prices.rolling(60,center=True).max()==prices).values)[0],:]

而在 quantopian 程式碼中,它們有 20 行複雜的程式碼(應該是 2,因為它們執行 min 和 max)。我的建議是重新實現,坦率地說它並不復雜。

引用自:https://quant.stackexchange.com/questions/55449