在平面文件中儲存選項 EOD 時間序列
我購買了美國期貨期權價格的 EOD 結算數據供個人使用。我不需要多使用者訪問或實時訪問。我不是專家級程序員,但經常使用 C# 和 R。每個未來(比如 SPX)每天都會有幾個選項“鏈”。如果時間序列中的單個日期是 2016 年 5 月 25 日,我們可能有 3 個鏈交易。例如,SPM16(6 月到期)、SPU16(9 月)、SPZ16(12 月)每個鏈將包含許多相關的行使價。假設每條鏈有 50 個執行價格(我稱之為 StrikeRecords)。每個罷工都會有一個相關的看漲和看跌。我將這些單獨的呼叫和放置記錄稱為 SettlementRecords。
我將嘗試使用 drobertson 在此執行緒中建議的文件系統方法:
我發現它非常有用,因為我對數據庫並不太熟悉,而且我認為我最終可能會花更多時間在 PostgreSQL 學習曲線上,而不是研究數據。
他提到了 EOD 股票數據的文件結構。期貨空間中的一些東西可能看起來像:
\FutureEOD{YYYY}{初始}_symbol.json
2016 年的 SPX 數據將是
\FutureEOD\2016\S_SPX.json
像這種文件系統結構這樣的東西可以工作,但我會在這個 2016 年 SPX 文件中包含許多選項符號/罷工。
我想知道這個文件系統是否最好刪除 /{YYYY} 並進一步拆分為選項符號?按結算日期時間排序的每個鏈的單獨文件?就像是:
\FutureEOD\S\SPX_SPM16.csv
\FutureEOD\S\SPX_SPU16.csv
\FutureEOD\S\SPX_SPZ16.csv
然後,這些文件中的每一個都將包含合約存在的每一天(約 2 年)的每個鏈的所有罷工。我打算使用 SortedList 來處理記憶體中的數據並重新排序到有序的 TimeSeries 中。
我在這裡走錯了嗎?
此外,嘗試將平面文件儲存為 CSV 而不是 JSON 是否有意義?任何其他最適合使用 C# 讀取速度的文件結構?
有沒有人嘗試在文件系統中儲存選項 EOD 數據?非常感謝任何建議。
謝謝
Axibase 時間序列數據庫是一種非關係替代方案,具有用於刻度、EOD 和參考數據的內置模式。根據交易品種、日期範圍、執行價格等通用標準查詢 ATSD 中的統計資訊應該比從輸入文件中讀取要快得多,因為文件中的記錄順序無法保證,並且通常需要讀取整個文件以檢查所有內容比賽記錄。
ATSD 在單節點上免費生產。
以 CBOE EOD格式(他們稱之為佈局)為例:
underlying_symbol,quote_date,root,expiration,strike,option_type,open,high,low,close,trade_volume,bid_size_1545,bid_1545,ask_size_1545,ask_1545,underlying_bid_1545,underlying_ask_1545,bid_size_eod,bid_eod,ask_size_eod,ask_eod,underlying_bid_eod,underlying_ask_eod,vwap,open_interest,delivery_code ^VIX,2016-06-01,VIX,2016-11-16,65.000,P,0.0000,0.0000,0.0000,0.0000,0,6003,45.1000,7831,45.4000,14.2400,14.2400,572,45.1000,3340,45.3000,14.2000,14.2000,0.0000,0,
執行 python 腳本來解析 EOD 統計數據並將其上傳到
atsd_session_summary
表中:import csv from dateutil.parser import parse from decimal import Decimal from atsd_client import connect from dateutil.tz import gettz def to_option_symbol(root_symbol, expiration_date, option_type, strike): nd = expiration_date.replace("-", "") return root_symbol + nd + option_type + "{:09.3f}".format(Decimal(strike)).replace(".", "") def norm(d): return d.quantize(Decimal(1)) if d == d.to_integral() else d.normalize() def to_summary(row, columns): dt = parse(row['quote_date'] + ' 16:00:00 ET', tzinfos={"ET": gettz("US/Eastern")}) res = 'CBOE,XCBO,' + to_option_symbol(row['root'], row['expiration'], row['option_type'], row['strike']) res += ',' + dt.isoformat() res += ',Day,C' for c in columns: res += ',' + str(norm(Decimal(row[c]))) return res fields_eod = ['open', 'high', 'low', 'close', 'trade_volume', 'bid_size_1545', 'bid_1545', 'ask_size_1545', 'ask_1545', 'underlying_bid_1545', 'underlying_ask_1545', 'bid_size_eod', 'bid_eod', 'ask_size_eod', 'ask_eod', 'underlying_bid_eod', 'underlying_ask_eod', 'vwap', 'open_interest'] fields_sum = ['open', 'high', 'low', 'closeprice', 'voltoday', 'custom_num_01', 'custom_num_02', 'custom_num_03', 'custom_num_04', 'custom_num_05', 'custom_num_06', 'biddepth', 'bid', 'offerdepth', 'offer', 'underlying_bid', 'underlying_offer', 'vwap', 'numcontracts'] lines = set() file = 'UnderlyingOptionsEODQuotes_2016-06-01.csv' csvfile = open(file, 'r') reader = csv.DictReader(csvfile, delimiter=',') for row in reader: lines.add(to_summary(row, fields_eod)) hdr = "exchange,class,symbol,datetime,type,stage" for h in fields_sum: hdr += ',' + h conn = connect('./connection.properties') conn.post_plain_text('/api/v1/trade-session-summary/import?add_new_instruments=true', hdr + "\n" + "\n".join(lines))
一旦記錄在數據庫中,您可以使用 SQL 查詢統計資訊:
SELECT exchange, class, symbol, datetime, open, high, low, closeprice AS close, voltoday AS trade_volume, bid, biddepth, offer, offerdepth, underlying_bid, underlying_offer, vwap, numcontracts AS opencontracts, custom_num_01 AS bid_size_1545, custom_num_02 AS bid_1545, custom_num_03 AS offer_size_1545, custom_num_04 AS offer_1545, CAST(CONCAT(SUBSTR(symbol, LENGTH(symbol)-7, 5), '.', SUBSTR(symbol, LENGTH(symbol)-2, 3))AS number) AS strike FROM atsd_session_summary WHERE symbol LIKE 'VIX%' AND datetime BETWEEN '2016-06-01' AND '2016-06-02' AND strike BETWEEN underlying_bid*1.00 AND underlying_offer*1.05 ORDER BY entity.tags.symbol, datetime
它還有助於在數據庫中儲存參考數據,例如執行價格、到期日、基礎和根符號、ISIN、CUSIP、CIK 等,以便您可以使用靠近數據的參考欄位過濾統計數據,加快數據檢索。
WHERE CAST(entity.tags.strike AS number) BETWEEN 10 and 15
(免責聲明:我為 Axibase 工作)
什麼適合您將在很大程度上取決於您的要求,例如數據庫必須有多快,以及您的分析類型,例如您是否更關心橫截面或時間序列。
我定期將 EOD 期權價格儲存在 CSV 文件中(每個期權時間序列一個文件),然後根據需要匯總它們。我為此編寫了一個小型 R 包(https://github.com/enricoschumann/tsdb)。如果您想嘗試它並且速度是一個問題,那麼在 https://github.com/enricoschumann/tsdb/blob/master/inst/tests/write_read.R有一個測試腳本 。