資料是任何量化框架的基石,種類豐富、齊全,質量可靠的各類資料,是產生可靠策略的必要條件。
對主要進行量化分析、投資的中大型以上、業務已經走上正規的機構投資人來說,商業化的資料庫必不可少,雖然所費不少,但是相對於依託商業資料庫所產生的效益,和其業務規模來說,還是物有所值。
但是個人投資者或者剛剛起步的小型機構/工作室,更傾向一款物美價廉的資料庫。近幾年陸續有相關的開源/免費網路資料庫出現,前有tushare,後有akshare、dtshare、baostock ,以及其他等等,給大家提供了更多的選擇空間。
但是,他們都是網路資料庫,需要資料時都要先通過 api 將資料取到本地,再在本地進行相關的分析運算,資料落地的速度會受到以下情況的影響:
1)網際網路的穩定性和速度。
2)不少網路資料庫為了降低伺服器壓力,都有針對使用者拉取資料的流控。
受它們的影響,有時在前期的資料準備上就要花不少時間。對我這種強迫癌晚期患者來說,還是希望能從本地電腦或者區域網裡直接取到資料,而不用擔心因為各種原因影響到網路資料庫的連線、資料落地,繼而影響到後續建模、回測等事情的正常開展。
這裡就分享一下我在將網路資料庫本地化的心得體會。
1、資料庫的選擇
1)本地資料庫的選擇
常見的有關係型的大型資料庫 oracle、mysql、postgresql,mini型的sqlite,以及非關係型的mongodb。
根據以下考慮:
1)資料都比較規整,暫時用不到mongodb。
2)只在本機上用資料庫,不考慮遠端訪問的問題。
3)最小日級別的資料吞吐量,對效能要求比較寬鬆。
4)使用大型資料庫需要安裝驅動,對系統資源有一定占用。
我決定使用 sqlite,反正以後如果有需要,要遷移到其他資料庫也方便。
(嗯,貪圖方便還說得那麼清新脫俗。。。。。。)
2)網路資料庫的選擇
目前本人接觸過的開源或者免費資料庫有:tushare、akshare、dtshare、baostock ,以後可能會有別的類似的網路資料庫出現,到時再更新本文。
這裡要再向這些網路資料庫的作者致意,因為他們的辛勤勞動,大家獲取相關資料的門檻大大降低了。
以上幾個資料庫各自的特點這裡就不展開了,以後有緣的話再展開。
從自身的使用考慮,我選擇了 **share。(嗯。。。)
它的特點是傳統的資料比較齊全,而且推出時間已經較長,使用者較多,使用者型別也較多樣,可以預期資料的質量相對比較穩定。
2、本地資料庫框架的功能
1)主要功能
a、在資料庫中新建表,並根據資料屬性設定每個欄位的屬性。
b、通過 api 介面,從網路資料庫上取資料到本地。
c、將取到的資料寫入本地資料庫中。
d、定期或者不定期更新資料並入庫。
2)框架大致描述
a、首先新建乙個獲取資料的基類 class datatable(),包含以下基本功能:
i)根據獲取的資料屬性在資料庫中新建表。
ii)將獲取的資料寫入資料庫中。
b、將網路資料庫上的資料表,按資料的型別分成以下幾類:
i)資料量不大的表。
ii)資料量較大,可逐個交易日取資料的表。
iii)資料量較大,可逐個資產取資料的表。
iv)其他資料量較大,按其他方式取資料的表。
c、針對以上每類表,新建專門處理該類表資料的子類
分別命名為 class datatable1(datatable) ~ datatable4(datatable),其中第四類表的內容可能要多一點,因為所有非規整資料表的處理都在這裡,但是因為表的總量不大,因此情況也還好。當然也不一定就4類,大家可以根據自己的喜好來分類。
d、訪問資料庫的**實現路徑
python中對資料庫的讀寫,理論上,既可以用 pandas 中的方法來實現,也可以通過 sqlalchemy、peewee 等 orm 包實現,還可以直接匯入 sqlite3、pymysql、cx_oracle 等包,用 sql **來實現。
以上幾種方法之間,當然有一定的效能差異,但因為不涉及高併發、大流量的動態吞吐,以上幾種方法基本都能滿足需要,因此具體採用哪種方式,完全看各人的偏好。
因為不涉及到太複雜的資料庫操作,我偏好匯入 sqlite3 之後,直接用 sql 語句進行操作。
3)關於流控
一般網路資料庫為了降低伺服器本身和所在網路的壓力,都會對使用者的訪問進行控制,常見的有:
a)每秒最大同時訪問次數;
b)每分鐘 / 小時總訪問次數;
c)返回資料的記錄數量。
這些措施對網路伺服器的長期穩定使用當然是好的,但是其直接後果就是給使用者取資料增加了一些麻煩。
解決辦法一般是在取資料時針對流控措施,進行等待、延遲、拆分申請時間跨度/資產數量等措施,這裡就不一一展開了。
4)新建資料表時設定列資料格式
顯式在資料庫中建表時,要設定每個欄位的格式,一般是先用 python 自動識別所取資料每列的格式,據以設定資料表對應欄位的格式。
如果從早期向近期取數,由於早期各類資料都還不是很齊全,可能出現取來的某列資料都是 none 或者 nan 的情況,那麼 python 會自動識別為 object 型別,如果不注意,有可能使得建表時相應字段資料型別不是很準確。
最後,相信大家對如何將自己心儀的網路資料庫落到本地,都有自己的思路,**就不放上來了。
那麼下一步就是如何在此基礎上實現/復現一些應用、模型或者策略,這涉及到以下幾個方面的內容:
1)定期資料的圖形展現,了解近期市場的結構性變化。
2)對某個思路的驗證。
3)將某個思路擴充套件成乙個策略,並通過回測了解其效果。
4)將回測表現良好的策略進行模擬交易/實時交易。
這些內容我們以後慢慢聊。
本地SQL Server資料庫提示網路問題無法連線
執行程式時發現本地sqlserver資料庫無法連線,提示資訊為 在與sql server 建立連線時出現與網路相關的或特定與例項的錯誤。未能找到或無法訪問伺服器。請驗證例項名稱是否正確並且sql server已配置為允許遠端連線。在網上查閱資料,首先開啟sqlserver的配置管理器,檢視sqlse...
註解模擬資料庫持久化框架
dao層的model一般會對應乙個資料表,而model中的屬性對應表中的字段。而在我們進行資料庫的增刪改查的時候,一般直接通過寫sql語句,填寫增刪改查字段來進行。如果我們能將model裡面的屬性與資料表的字段對應,將model與相應的表對應,然後注入到sql語句中。當更改配置時,卻不影響sql的功...
搭量化資料庫 網際網路金融之三
一 資料的獲得與儲存 二 搭自己的資料庫 建立庫 建立表 三 python同資料庫連線 資料匯入 視覺化 四 時間序列分析實戰 建立本地金融資料庫的意義 建模 模型建立 模型評估 模型回測 風險控制 時間序列分析 建立乙個投資組合,使組合是平穩的乙個過程 回歸到mean的速率,均值,時間序列的方差,...