1

在下面的代码中,我试图检索一些期权价格的历史价格。我正在查看 4 个月的历史,条形大小为 8 小时。我以 Apple 为例,我正在尝试下载 6 次行使价和一次到期的看涨期权价格。这需要疯狂的时间...

当我运行下面的代码时,第一次罢工需要 20 秒,第二次罢工需要 1770 秒,第三次罢工需要 3400 秒,第四次罢工需要 840 秒,第五次罢工需要 560 秒和 460 秒为最后一次罢工。下载所有内容大约需要 2 个小时。出了什么问题,我该怎么做才能让它更快?

import time
import pandas as pd
import collections
import datetime as dt

from ibapi.client import EClient
from ibapi.wrapper import EWrapper
from ibapi.contract import Contract
from ibapi.common import BarData

class TestApp(EClient, EWrapper):
    def __init__(self):
        EClient.__init__(self, self)
        self.data=collections.defaultdict(list)

    def error(self, reqId:int, errorCode:int, errorString:str):
        print("Error: ", reqId, "", errorCode, "", errorString)

    def historicalData(self, reqId:int, bar:BarData):
        self.data["date"].append(bar.date)
        self.data["price"].append(bar.close)

    def historicalDataEnd(self, reqId: int, start: str, end: str):
        print("HistoricalDataEnd. ReqId:", reqId, "from", start, "to", end)
        self.df = pd.DataFrame.from_dict(self.data)
        self.disconnect()
        print("finished")


def get_option_histo_prices_test(ticker:str,expiry:str,strike:str):

    app = TestApp()
    app.connect("127.0.0.1", 7496, 5)

    time.sleep(1)

    contract = Contract()
    contract.secType = "OPT"   
    contract.right = "C"
    contract.exchange = "SMART"
    contract.currency = "USD"
    contract.multiplier = "100" 

    contract.symbol = ticker
    contract.lastTradeDateOrContractMonth = expiry
    contract.strike = strike

    app.reqHistoricalData(1, contract,"","4 M", "8 hours", "ASK", 1, 1, False, [])

    app.run()

    return app.df

ticker = "AAPL"
expiry = "20200619"
start_time_initial = time.time()
for strike in ["300","280","240","220","180","160"]:

    start_time = time.time()
    prices = get_option_histo_prices_test(ticker,expiry,strike)
    end_time = time.time()
    print (end_time - start_time)

end_time_final = time.time()
print("it took",end_time_final - start_time_initial)
4

1 回答 1

0

用“TRADES”代替“ASK”是可行的。IT 需要 20 秒,而不是之前的 2 小时。

于 2020-06-15T21:14:47.397 回答