Typed Data Interfaces Migration
本文整理 FinLab 交易資料結構從隱式 dict/list 轉為正式 typed 介面的使用方式,包含相容策略與 deprecation policy。
1. 新增的正式資料結構
可由 finlab.schemas 匯入:
PositionEntryOrderEntryStrategyPositionDataPortfolioConfigDataPortfolioData
以上 dataclass 均提供 from_dict() / to_dict()。
2. Position typed API
Position.from_entries(entries)Position.to_entries()
說明:
- 舊有 from_list() / to_list() 仍可使用。
- typed 與 dict 介面可並存,方便逐步遷移。
3. OrderExecutor typed API
OrderExecutor.generate_orders(..., as_entries=False, quantity_type='decimal')OrderExecutor.generate_order_entries(..., quantity_type='decimal')
quantity_type 支援:
- decimal(預設)
- float
- string
預設行為維持不變:generate_orders() 仍回傳 list[dict]。
4. PortfolioSyncManager typed API
get_data(typed=False)set_data(data, typed=False)get_data_typed()set_data_typed(data)
說明:
- self.data 內部儲存格式仍為既有 dict shape。
- typed getter/setter 只在邊界做轉換,確保既有序列化路徑(to_path / to_local / to_cloud)相容。
5. symbol / stock_id 相容與未來政策
目前政策:
- symbol 為 canonical 欄位。
- stock_id 仍保留為向後相容 alias。
- 兩欄同時存在且值衝突時,會拋出錯誤(避免資料歧義)。
建議:
- 新程式碼請優先使用 symbol。
- 第三方整合請保留 stock_id 讀取相容,直到 major 版本公告移除時程。
規劃(暫定):
- 1.x: stock_id fully supported (alias mode)
- 2.x (not earlier than): 再評估是否改為 warning-only 或移除 alias
6. Report Typed API
CloudReport 提供 typed 介面存取策略報告:
CloudReport.from_dict(report_dict, execution_dict)— 從 dict 建立CloudReport.position_info2()— 取得持倉資訊CloudReport.position_schedulers— 排程與權重
ReportExecution 封裝回測執行設定:
ReportExecution.from_dict(d)/.to_dict().weights— 當前持倉權重(pd.Series).next_weights— 下期持倉權重.actions— 停損停利等動作.config— 回測設定(resample、stopLoss、takeProfit等).current_rebalance_date/.next_rebalance_date— 換倉日期
7. 遷移建議順序
- 先把資料模型改為
finlab.schemasdataclass。 - 逐步切換為 typed API(
from_entries/generate_order_entries/get_data_typed)。 - 保留 dict fallback,直到上層 UI/DB/排程全數完成遷移。