勾選不平衡條 - 金融機器學習的進展
如果你們中的任何人能澄清以下問題,我將不勝感激。我一直在努力自己去理解它。
- [數學處理錯誤] $ 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} $ ?
- [數學處理錯誤] $ \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個參數:
- 不平衡柱中預期的刻度數的初始猜測(𝐸0
[Math Processing Error]$$ 𝑇 $$)。當您開始計算不平衡柱時,您根本沒有任何柱,因此您沒有任何關於不平衡柱內預期刻度數的資訊。這就是為什麼您需要初步猜測的原因。此參數不會顯著影響進一步的不平衡條,但仍然需要第一個條計算 2. 用於條中預期刻度數的條數。當您累積不平衡條時,您可以定義 𝐸0
[Math Processing Error]$$ 𝑇 $$作為之前柱中刻度數的 EWMA,這就是您需要設置 EWMA 計算視窗的原因。 3. 用於預期不平衡計算的刻度數。預期刻度不平衡 (2𝑃
[Math Processing Error]$$ 𝑏𝑡=1 $$−1) 可以通過從先前交易/分時的分時不平衡中計算 EWMA 來找到。我們需要為 EWMA 設置視窗。
整個算法描述:
- 設置參數
- 在每筆交易中計算刻度不平衡的累積總和 (𝜃𝑇)
- 開始累積刻度,直到刻度不平衡的數量達到用於預期刻度不平衡計算的視窗。
- 當刻度不平衡的數量達到 EWMA 視窗大小時 - 計算預期的刻度不平衡 (2𝑃[數學處理錯誤] $$ 𝑏𝑡=1 $$-1)
- 檢查是否 |𝜃𝑇| ≥𝐸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)