期權

在平面文件中儲存選項 EOD 時間序列

  • March 9, 2022

我購買了美國期貨期權價格的 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

查詢結果 CBOE 期權日終數據

它還有助於在數據庫中儲存參考數據,例如執行價格、到期日、基礎和根符號、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有一個測試腳本 。

引用自:https://quant.stackexchange.com/questions/60850