如何建構股票市場數據數據庫
我想從網際網路上下載股票市場數據(例如通過抓取……)並將它們組織在一個數據庫中(我正在使用 python 和 SQL),該數據庫每天或根據要求更新。(想法是創建一個篩選器,做回測等等……)我對數據庫不是很熟悉,所以我正在尋找一些關於數據庫結構的建議。
我想到的結構如下(見圖)。
有 8 個表格(TICKER LIST、OHLCV 和 6 個不同的財務報表表格)。
主表是 TICKER LIST:它應該包含某種證券的唯一 ID。我認為股票程式碼不能是唯一的ID,成為公司的股票程式碼可以改變。公司名稱不能是唯一的 ID,因為可以在不同的交易所擁有相同的公司。這就是我創建列“id”的原因。
每個“id”都與一個 OHLCV 表相關聯。例如,BP 將有一個來自 NYSE 交易所的美元 OHLCV 表和一個來自 LSE 交易所的英鎊 OHLC 表)。然而,兩個交易所的財務報表(收入、餘額、現金流量……)應該是相同的。這意味著我將擁有 2 個完全相同的財務報表表副本,在此範例中,一個用於 id 987448,另一個用於 id 239484。也許複製不是最好的方法……
我的問題是,這種結構有意義嗎?你會如何改進它?正如我所說,我不熟悉數據庫。謝謝
與往常一樣,這個問題的任何答案都很大程度上取決於您的案例。以下是我的解釋和解釋。在 QSE 和 DB 交易所,我看到了保存金融/市場數據的各種方法 - 相應的討論非常激烈……有些人建議簡單地轉儲/讀取 CSV,其他人建議時間序列數據庫等. 等等。它真的(!)取決於您的案例。我的數據保持整潔,並為**我的分析案例提供了一個不言自明且可擴展的數據模型。
好的,我們走吧:在這一點上,我將您的問題解釋為:
"I want to store daily OHLCV data across a (limited) number of market instruments from a number of trading venues. I furthermore want to be able to link (in some sense to be yet defined) market data and financial statement data per company. Once that is done, I want to do some analysis, get some signals, backtesting etc.*
*顯然,這個陳述仍然很薄弱,但它至少有助於了解一些基礎知識。
因此,您不必擔心並發性,您不必擔心(超低)延遲/數據庫性能,並且您不必過多擔心時間序列數據庫的額外好處-但您可能需要擔心 雙時間性,即您希望如何讓歷史事件反映在您的數據中(例如,企業行動或合併)?為簡單起見,讓我們假設您只需在公司行動發生時重新載入一個完整的**調整時間序列,僅此而已。**此外,如果發生合併,您只需“放棄”舊公司……
正如您已聲明要使用關係數據庫和 SQL,讓我們堅持下去。現在讓我們將所有內容拆分為實體、屬性和關係。
您可能想要關心的實體和關係
- 公司:顯然,每家公司都是一個實體。我們不考慮任何公司內部聯繫、所有權關係等,而只是將公司視為此類。公司至少有名稱和報告貨幣。
- 儀器:為簡單起見,每家公司都提供一種或多種儀器,由其 12 位 ISIN 唯一標識。如果需要,您可以在稍後階段將任何其他與儀器相關的表從該表中分支出來。
- 市場:市場(或場所)是交易工具和觀察價格的地方。為簡單起見,讓我們將貨幣固定在這個級別。
- 供應商:供應商是負責將數據提供給您的一方。在專業環境中,這可能是路透社或彭博社;簡單來說,這可能是 AlphaVantage、Yahoo、Quandl、…
- 符號:在市場中,您可以通過其符號唯一地辨識一種工具。然而,如果您使用一些可用的 API,符號可能是特定於供應商的,帶有不確定的“地圖”。將它們簡單地寫在級別上可能會有所幫助:symbol = <instrument, market, vendor>。(您可能還希望能夠對此進行時間戳記,請參見上面的雙時態。)
- 價格:現在您可以將所有內容放在一起:符號、日期、OHLCV讓您可以在此處儲存您需要的所有內容。
現在來財務報表數據。
由於您想使用 Python 進行數據分析,我建議您添加以下內容:
- 行項目:資產負債表/損益表中的每個項目都或多或少地按層次排列。我建議以某種方式設置它,以便您以後可以進行簡單的聚合。您可以在表上介紹資產負債表和損益表。
- statement header:這是每個語句的標題表。它告訴您公司、日期和報表類型(收入、餘額..)
- statement data:該表保存statement數據,即headerid、lineitem、value。
筆記:
- 恕我直言,這個設置很容易理解,我將它用於我的私人活動(例如財務報表的東西)。我覆蓋了大約 150 個股票程式碼,每天或每週載入幾次數據;我使用 SQL 和 R 執行分析。對於這麼少量的數據,這個設置就足夠了。但是,我當然將設置工作換成透明度!
- FX:您可以引入虛擬公司“EURUSD”、“GBPUSD”等,並以與儲存股票價格相同的方式儲存 FX 值,或者為此創建另一個表。從實際的角度來看,一個不同的表可能更可取,並且由於您在 Python 中進行分析,因此您不會受到 SQL 緊身胸衣的限制,不是嗎?
- 參照完整性:當然,您應該強制執行:價格有符號有工具/市場/供應商有公司。
- 正如我們上面所說的,我們不太擔心雙時性:如果有一些公司事件,我們只需重新載入給定符號的所有價格。如果你想合併多個版本的數據,你需要添加列/表來保存歷史,當然……
I HTH,或者它可以幫助您為您的案例找到正確的方向……
事實上 SQL 不是一個好主意,只有 NYSE 可以傳遞 100 GB/天,我建議你開始關注 MongoDB,看看這個演講James Blackburn - Python and MongoDB as a Platform for Financial Market Data