qteasy中的數據類型

數據類型是qteasy的一個核心概念,它代表一個交易策略中所使用的資訊,例如歷史交易數據、宏觀經濟數據等。 資訊並不等同於數據,在過去的版本中,qteasy將數據類型直接定義爲DataSource數據表中的數據列, 但這樣的定義方式並不妥當:因爲資訊與數據是不同的。原因包括:

  1. 某些數據本身並沒有足夠的意義,需要與其他數據結合才能產生足夠的資訊

  2. 有些數據包含多重資訊,可以從不同的角度取提取,因此儘管很多情況下數據本身就包含了足夠的資訊

  3. 資訊的定義也是動態的,同樣的數據經過不同的方式可以有不同的解讀

因此,將資訊與數據等同起來是草率的,因爲從邏輯上來說,數據僅僅是資訊的載體而不是資訊本身。

在qteasy新的定義中,數據類型就是我們希望從龐雜的數據中提取的各種資訊,有些資訊可以直接從數據表中讀取,例如:

  • 股票的開盤價,可以直接從股票價格表中讀取

但是有些數據必須通過不同表中不同的數據通過組合來讀取,例如:

  • 股票的復權價格,必須讀取股票的價格,然後讀取股票價格復權因子,並通過計算得到

有些時候從同一列數據中可以讀取出不同的資訊,例如:

  • 昨收價格和每日漲幅是不同的資訊,但都可以從同一個股票價格表中提取

因此,qteasy將數據類型重新進行了定義,並將其定義爲我們需要的資訊,提供簡單易用的API,方便用戶從數據表中 快速提取所需資訊,同時,允許用戶創建自定義數據類型,以方便地提取自己感興趣的資訊。 另外,數據類型提供的API還將允許用戶很容易地將提取的資訊生成爲圖表、進行對比、比較以及統計分析

數據類型的定義應該通過一個類來實現,因而用戶自定義可以較容易實現。同時,qteasy應該提供相當完善的內置數據類型以減少用戶自定義工作量,且覆蓋儘可能多的數據表確保下載的數據能夠物盡其用。

從邏輯上講,一個數據類型的定義需要包含以下關鍵要素:

  • 數據來源:該資訊來自於那些數據表中的哪些數據字段?

  • 數據獲取方式:如何提取該資訊?

鑑於大量的內置數據類型需要被定義,那麼這些數據類型的定義必須是簡單地,參數化的,所幸數據類型類並不也不會太複雜,應該容易實現參數化定義。

用法和輸出 首先是數據類型的用法和輸出,看起來應統一爲兩個API:

API1: data_type.get(start, end, frequency):獲取該類型與個股無關的,區間內的單頻數據,輸出爲類似Series 的數據。

API2: data_type.get(shares, start, end, frequency): 獲取該類型與給定個股有關的區間內單頻數據。

也許還有第三個API: data_type.get(shares, start, end, frequency, **kwargs)

以上API應該完全統一,不管是內置還是自定義類型都可返回相同格式的數據。

數據類型的類型 其次應該研究的是數據類型的類型,有多少種不同類型的數據類型?當然,這裏的類型取決於從數據表中獲取數據的方式和產出,如股價數據和成份數據的獲取方式就不同,前者直接用數據標籤從表中讀取,而後者需從表中篩選後再通過行列變換得到。當然,還有可能更多的方式,如通過多表查詢如復權價格或多數據計算得到。 這裏只是說,明顯不同的數據類型都有各自的特點,一個類就必須分別處理。

如果不考慮多數據計算類的數據類型的話(因爲多數據計算可以在策略中實現,但雙數據計算型的特殊型:復權價格又應含在內),數據類型的類型也許有下面幾種:

以下屬性被稱爲數據的獲取類型(acquisition_type)這些類型的數據可以輸出symbolised或者un-symbolised數據,且 這些數據都支持輸出時間段數據(Periods)以及時間戳數據(TimeStamp):

在指定數據類型時,這種數據類型可以支持的輸出類型是在數據類型定義中就確定了的,無法更改

『basics』:

基本數據型。這些數據與時間無關,原則上不屬於歷史數據,僅作爲資訊調用。 這種類型的數據只需要一個表名和列名作爲kwargs讀取參數

『direct』:

直讀數據型。也就是根據區間頻段直接從數據表內直接讀取的數據,如價格或指標 這種類型的數據類型只需要從一個表名和列名中讀取數據即可,因此讀取參數只有一個表名和列名

『adjustment』:

數據修正型。從一張表中直讀數據A,另一張表直讀數據B,並用B修正後輸出,如復權價格 這種類型的數據需要從兩張表中讀取數據,因此讀取參數有兩個表名和列名

『relations』:

數據關聯型。從兩張表中讀取數據A與B,並輸出它們之間的某種關係,如eq/ne/gt/or/nor等等

『operation』:

數據計算型。從兩張表中讀取數據A與B,並輸出他們之間的計算結果,如+/-/*//

『event_status』:

事件狀態型。從表中查詢事件的發生日期並在事件影響區間內填充不同狀態的,如停牌,改名等

『event_multi_stat』:

多事件狀態型。從表中查詢多個事件的發生日期並在事件影響區間內填充多個不同的狀態,如管理層名單等

『event_signal』:

事件信號型。從表中查詢事件的發生日期並在事件發生時產生信號的,如漲跌停,上板上榜,分紅配股等

『composition』:

成份查詢型。從成份表中篩選出來數據並行列轉換 另外還應該有一些特殊類型,由特殊的過程實現

『compound』:

單時刻複合類型。查找一個時間點上可用的多種數據並組合輸出,如個股某時刻的財務報表

Output Type

『symbolised』:

以時間段爲單位的symbolised數據,這種數據結構類似一個DataFrame,行爲時間段,列爲股票代碼

『un-symbolised』:

以時間段爲單位的un-symbolised數據,這種數據結構類似於一個Series,行爲時間段,只包含單列數據

數據類型類的定義 類型的定義爲了簡單,應該是參數化的,只要參數定了,讀取方式和讀取目標表就確定了

類的唯一一個可被外部調用的方法只有一個,這個方法根據不同的讀取方式調用不同的方法,從目標表中讀取數據,並清洗後輸出。

甚至,不同的數據特點都可以定義在類型中,如open可以在最新的cycle中使用,而close則不可以

爲了可擴展性,類中也可以定義一個空白函數,用於特殊情況下由用戶重寫後自定義數據讀取方式

qteasy內置數據類型有非常多,爲了方便這些類的創建,這裏創建一個數據類型映射表,將所有的數據類型與其關鍵參數映射起來, 這樣就可以通過一個簡單的函數調用來創建一個數據類型類了。

1, DATA_TYPE_MAP:

DATA_TYPE_MAP: 定義數據類型與數據表之間的對應關係,以查詢每種數據可以再哪一張表裏查到 每種數據類型都有一個唯一的ID,且每種數據類型都只有一個唯一的存儲位置

Data table mapping中各列的含義如下: htype_name(key): 數據類型名稱(主鍵)

freq(key): 數據的可用頻率(主鍵) min - 分鐘數據 d - 日數據 w - 週數據 m - 月數據 q - 季度數據

asset_type(key): 數據對應的金融資產類型: E - 股票 IDX - 指數 FT - 期貨 FD - 基金 OPT - 期權 THS - 同花順指數 SW - 申萬行業指數

description: 歷史數據的詳細描述,可以用於列搜索

acquisition_type: 數據的獲取方式

table_name: 歷史數據所在的表的名稱

column: 歷史數據在表中的列名稱

「」」