2017-01-06 17 views
2

インタラクティブブローカーAPIを使用してSPYで書かれた基礎とオプションの両方を取得しようとしていますが、現在のオプション(ストライク、問題は、私は歴史的なデータを取得することに固執している5ヶ月から今に戻ると言う。次のようにインタラクティブブローカー - OPT(MIDPOINTおよびTRADES)の履歴データを取得

コードは次のとおりです。

from ib.ext.Contract import Contract 
from ib.ext.ContractDetails import ContractDetails 
from ib.opt import ibConnection, message 
import time 
import datetime 

def watcher(msg): 
    print(msg) 

def contractDetailsHandler(msg): 
    contracts.append(msg.contractDetails.m_summary) 

def contractDetailsEndHandler(msg): 
    global DataWait 
    DataWait = False 

def contractHistDetailsHandler(msg): 
    contracts.append(msg.contractDetails.m_summary) 


con = ibConnection() 
con.host = "..." 
con.port = ... 
con.clientId = 5 
con.registerAll(watcher) 
con.register(contractDetailsHandler, 'ContractDetails') 
con.register(contractDetailsEndHandler, 'ContractDetailsEnd') 
con.register(contractHistDetailsHandler, message.historicalData) 

con.connect() 

contract = Contract() 
contract.m_exchange  = "SMART" 
contract.m_secType  = "OPT" 
contract.m_symbol  = "SPY" 
contract.m_currency  = "USD" 

endtime = '20170102 01:00:00' 

#con.reqContractDetails(1, contract) 

con.reqHistoricalData(2,contract,endtime,"5 M","1 sec","TRADES",0,1) 
con.reqHistoricalData(3,contract,endtime,"5 M","1 sec","MIDPOINT",0,1) 

contracts = [] 

DataWait = True ; i = 0 
while DataWait and i < 90: 
    i += 1 ; print(i), 
    time.sleep(1) 

con.disconnect() 
con.close() 

print(contracts) 

私が得るすべては、次のとおりです。

<error id=2, errorCode=321, errorMsg=Error validating request:-'yd' : cause - When the local symbol field is empty, please fill all option fields (right, strike, expiry))> 

は今、私は契約オブジェクトは、それらが含まれていないことを認識していますが、どのように1は右を知ることができ、ストライキと有効期限?それは基本的に私が必要とするものです(オプションの日付と基本的な変更があります)。それには別の方法がありますか?

私にいくつかの指針を与えることができれば、大歓迎です!または、選択した範囲(選択した範囲に応じて、元のプロジェクトのためにそれが必要であるかどうか)に基づいて、基礎とオプションのいずれかの代替ソースを選択します。

非常に手前にありがとう!入力は非常に高く評価されます。

答えて

1

を設定する必要があります私はこの質問にしたいというより答えが、私は持っているすべてのものを提出することになるコメントするのに十分な評判を持っていませんIB APIを通じて期限切れのオプション契約の履歴データを取得することはできません。

実際にはブライアンが言及したURL(https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm)は、次の言葉を引用:

過去のデータ要求は、現在の有効期限のためにのみ利用可能です。

あなたはおそらくあなたの時間を無駄にしています。ヒストリカルオプションのデータは膨大なものになる可能性があります。それはまた非常に高価な、一日の終わりのために十分に安い - http://ivolatility.comからそれを得ることができるが、intradayは高価になる。私はhttps://datashop.cboe.comを使用していますが、サービスのスピードとカスタマーサービスのスキルは確かに欠けていますが、1つの楽器を求めることができます。

1

あなたはcontractDetailsのリクエストをコメントしています。あなたはそれをする必要がありますが、あなたは多くを得るつもりです(私は〜5000を得る)。それを少し絞り込むには、有効期限やストライキ、権利を設定してみてください。

例えば、すべての230通話

contract.m_strike = 230 
contract.m_right = "CALL" 

私は30契約のみを取得します。

contractDetailsEndHandler(msg):にすべての契約が届いていることがわかります。その後、あなたが作っているcontracts[]Contractを使ってreqHistDataに電話してください。それはすべてのフィールドが記入されます。

取得できる履歴データの量には制限があります。リクエストごとに2000バーを見積もるので、リクエスト1回につき2000秒の1秒のバーがすべて得られます。そして10秒ごとに1つの要求。過去のデータが5ヶ月後に戻ってくるかどうかはわかりません。期限切れの契約上の履歴データを求めたとき、あなたはcontract.m_includeExpired = True

https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm