交易軟體中的雙時態資料設計與定時單功能

December 14, 2023

img

交易軟體中的雙時態數據 (Bi-temporal data)

雙時態數據1 是指一個事件具有兩個時間的數據,例如報價 (Quote):

  1. 生效時間 (Effective Time, ET): 報價具體指涉或生效的時間,例如 9:10:00 AM 的報價
  2. 應用時間 (Application Time, AT): 報價具體進到應用程式的時間,後一秒 9:10:01

在報價中生效時間 100% 是落後應用時間,但是像是我們送出的委託:

  1. 生效時間:委託具體送到券商或交易所,在券商與交易所上打上的時間,例如 9:15:10
  2. 應用時間:委託送出應用程式的時間,可能是 9:15:09 (早一秒)

所以如果無關業務邏輯的話,雙時態數據的 ET 和 AT 可能有先有後。


相比一般軟體設計,關聯的可能是自己的資料庫,在交易軟體中關聯的是第三方

也就是不需要擔心生效時間與應用時間衝突,永遠都是生效時間優先

從生效時間去預測應用時間,或是從應用時間去預測生效時間,就是所謂的 預測 (Projection)


為什麼需要對 ET 與 AT 進行預測?

如果使用者有一個定時單,要在 9:15 送出一個台積電 2330 掛買一張

他是希望 ET 在 9:15,還是 AT 在 9:15?他是希望 9:15 送到交易所,還是 9:15 從電腦送出?

如果使用者要藉由 9:40 的台積電報價去生成另一個委託

他是希望以 ET 在 9:40 的報價來生成呢,還是 9:40 的應用時間

更複雜一點的狀況還包含,應用時間是在何時打上,可能是在報價進到電腦的時候打上

也有可能是在報價具體渲染到使用者畫面時打上,渲染前打上或渲染後打上

怎麼打都可以, 關鍵是你就會需要去預測 ET 與 AT 的落差

並且根據使用者需求,去使用這個落差,例如提前操作、延後操作


以定時單為例

使用者有一個單,他需要基於生效時間在 9:50 的報價,計算掛單量

然後定時在 10:00 要掛出,他希望盡可能生效時間接近 10:00 整掛出

而使用的報價也希望盡可能接近 9:50


由於我們要基於我們的大致預測去行為,就可能不那麼精準

這時候最關鍵的是,他對於提前的容忍度:

1. [ ] 可以接受使用到 9:49:59 的報價嗎?
2. [ ] 可以接受掛單到 9:59:59 的情況嗎?

如果使用者不能接受提前,ET 與 AT 的落差就不能使用來調整操作時間

如果使用者可以接受,你就可以盡量考量 ET/AT 的落差,讓 ET 落在使用者期待的時間

當然,這裡面可能就有很多規則,甚至啟動應用程式時還得試算 ET/AT 與評估網路情況

但大致的原則就是這樣,雙時態數據在例如開盤、尾盤與一些時間事件的交易處理上很有幫助


延伸討論:ET 與 AT 只會有一個嗎?

雙時態數據可能是最基本、最有表達力的方式,但有時候你可能需要更多時態描述事件

例如 ET 可能是個範圍,你的操作具體生效開始到生效結束有一個範圍

而 AT 也可能是個範圍,你的操作具體在應用程式中開始,到應用程式接收/發送完畢

完全可以根據你的需求延伸去做設計,以及根據 API 呼叫可能有的限制,去調整你的預測


Footnotes

1 雙時態數據在資料庫處理中,屬於事件溯源的範疇
見:https://www.planetgeek.ch/2023/12/04/our-experience-with-bi-temporal-event-sourcing/

Tags: design trading bi-temporal