滴答數據

勾選不平衡條 - 金融機器學習的進展

  • June 22, 2021

如果你們中的任何人能澄清以下問題,我將不勝感激。我一直在努力自己去理解它。

  1. [數學處理錯誤] $ b_t=\begin{cases}b_{t-1}, & \text{if}\ \Delta p_t = 0 \ \frac{|\Delta p_t|}{\Delta p_t} ,& \text{if} \Delta p_t \neq 0 \end{cases} $ (1)

在哪裡 $ p_t $ = 與報價 t 相關的價格

**問題 1:**我的分時數據同時有出價和要價。根據這個等式,我應該分別出價和詢價嗎?IE $ b_{bid} $ 和 $ b_{ask} $ ?

  1. [數學處理錯誤] $ \theta_T = \sum_{t = 1}^{T}b_t $ (2)

T = 分時指數

[數學處理錯誤] $ T^* = \underset{T}{Argmin} (|\theta_T| \geq E_0[T]|2P[b_t = 1] - 1) $ (3)

$ E_0 $ 由先前柱狀圖的 T 值的指數加權移動平均值估計。

$ 2P[b_t = 1] -1 $ 計算為指數加權移動平均值 $ b_t $ 來自先前柱的值。

問題 2:方程 2 的 T 值是從方程 3 推導出來的?

問題 3:我對等式 2 和 3 的解釋是,將值代入 T,計算 $ \theta_T $ 直到大於 $ E_0[T]|2P[b_t = 1] - 1 $ . 這種解釋正確嗎?

我非常感謝任何人在這件事上的意見。我自己學習這些很難,但在你的幫助下,我應該能夠實現它。

問題 1。實際上,交易數據格式的假設是你有交易的時間戳、大小和價格(不是買/賣)。有時,交易(報價)包含在假設買賣資訊的 1 級數據(也稱為 BBO)中。然而,柱線是基於交易而非報價建構的。

問題 2。是的,T 值是從方程 3 得出的。該過程將在下面詳細描述。

不平衡條計算的整個過程並不簡單。首先,您必須設置3個參數:

  1. 不平衡柱中預期的刻度數的初始猜測(𝐸0

[Math Processing Error]$$ 𝑇 $$)。當您開始計算不平衡柱時,您根本沒有任何柱,因此您沒有任何關於不平衡柱內預期刻度數的資訊。這就是為什麼您需要初步猜測的原因。此參數不會顯著影響進一步的不平衡條,但仍然需要第一個條計算 2. 用於條中預期刻度數的條數。當您累積不平衡條時,您可以定義 𝐸0

[Math Processing Error]$$ 𝑇 $$作為之前柱中刻度數的 EWMA,這就是您需要設置 EWMA 計算視窗的原因。 3. 用於預期不平衡計算的刻度數。預期刻度不平衡 (2𝑃

[Math Processing Error]$$ 𝑏𝑡=1 $$−1) 可以通過從先前交易/分時的分時不平衡中計算 EWMA 來找到。我們需要為 EWMA 設置視窗。

整個算法描述:

  1. 設置參數
  2. 在每筆交易中計算刻度不平衡的累積總和 (𝜃𝑇)
  3. 開始累積刻度,直到刻度不平衡的數量達到用於預期刻度不平衡計算的視窗。
  4. 當刻度不平衡的數量達到 EWMA 視窗大小時 - 計算預期的刻度不平衡 (2𝑃[數學處理錯誤] $$ 𝑏𝑡=1 $$-1)
  5. 檢查是否 |𝜃𝑇| ≥𝐸0

[數學處理錯誤] $$ 𝑇 $$* |(2𝑃[Math Processing Error]$$ 𝑏𝑡=1 $$-1)| (左右絕對值) 6. 如果為真 - 這意味著我們有第一個柱。將𝜃𝑇設置為零,設置預期的刻度數(𝐸0

[Math Processing Error]$$ 𝑇 $$) 到先前柱中刻度數數組的 EWMA。由於我們只有一個可用的條形圖,因此您可以在生成的條形圖數組上呼叫 EWMA 並設置視窗,不要擔心您可以將 window = 3 的 EWMA 呼叫到元素少於 3 個的數組。 7. 如果 False 繼續,直到 |𝜃𝑇|≥𝐸0[數學處理錯誤] $$ 𝑇 $$|2𝑃[數學處理錯誤] $$ 𝑏𝑡=1 $$-1|

我是https://github.com/hudson-and-thames/mlfinlab包的貢獻者,您可以在其中看到上述不平衡條(美元、刻度、交易量)的實現

**問題 1:**只有分時數據適用於這種柱狀生成方法,這意味著您實際上需要提供成功的交易。買賣都行不通。

問題 2: T 值在每個柱上生成,其值取決於在給定報價數據的情況下滿足等式 (3) 中的條件所需的時間。

問題3: * E

$$ T $$使用 b 的 EWMA 和來自先前柱的 T 的 EWMA 計算。以下程式碼應闡明此過程:

  • 請記住,一開始您需要猜測 b 和 T 的 EWMA,並且您需要提供參數 alpha 來計算這兩個 EWMA。
import numpy as np

# Generate tick imbalanced bars id of every tick by computing: get_bars_ids(get_b(ticks))
class Tick_Imbalance():
 def __init__(self, alpha_T, alpha_imbalance, expected_imbalance, expected_ticks):
   self.T = 0
   self.bar_id = 0
   self.imbalance = 0
   self.expected_tick_imbalance = expected_imbalance * expected_ticks

   self.alpha_ticks = alpha_T
   self.alpha_imbalance = alpha_imbalance
   self.EWMA_ticks = expected_ticks
   self.EWMA_imbalance = expected_imbalance


 def __get_EWMA(self, alpha, rt, EWMA_0):
   return alpha * rt + (1 - alpha) * EWMA_0

 def __get_b(self, price_change):
   if price_change == 0: return self.last_b
   self.last_b = abs(price_change)/price_change

   return self.last_b

 def get_b(self, price_ticks: np.ndarray) -> np.ndarray:
   price_change = (price_ticks[1:] - np.roll(price_ticks, 1)[1:]) / np.roll(price_ticks, 1)[1:]
   b = [self.__get_b(x) for x in price_change]

   return np.asarray(b)

 def get_bar_ids(self, b: np.ndarray) -> np.ndarray:
   bars_ids = []    
   for _imbalance in b:
     self.T += 1
     self.imbalance += _imbalance

     self.EWMA_imbalance = self.__get_EWMA(self.alpha_imbalance, _imbalance, self.EWMA_imbalance)

     bars_ids.append(self.bar_id)

     if abs(self.imbalance) >= self.expected_tick_imbalance:
       self.EWMA_ticks = self.__get_EWMA(self.alpha_ticks, self.T, self.EWMA_ticks)
       
       self.expected_tick_imbalance = self.EWMA_ticks * abs(self.EWMA_imbalance)

       self.T = 0
       self.imbalance = 0
       self.bar_id += 1
 
   return np.asarray(bars_ids)
 

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