avatar

目录
ib_insync速查表

此文为ib_insync需要下载历史数据用的一些操作. 目的是能迅速查到想要的code.
ib_insync是ib的 python api. 因为vnpy已经封装了ib的实盘模块, 所以我用ib_insync只是为了下载历史数据.

ib基础

连接ib

python
1
2
import ib_insync
print(ib_insync.__all__)
['util', 'Event', 'SoftDollarTier', 'PriceIncrement', 'Execution', 'CommissionReport', 'BarList', 'BarDataList', 'RealTimeBarList', 'BarData', 'RealTimeBar', 'HistogramData', 'NewsProvider', 'DepthMktDataDescription', 'ScannerSubscription', 'ScanDataList', 'FundamentalRatios', 'ExecutionFilter', 'PnL', 'PnLSingle', 'AccountValue', 'TickData', 'TickByTickAllLast', 'TickByTickBidAsk', 'TickByTickMidPoint', 'HistoricalTick', 'HistoricalTickBidAsk', 'HistoricalTickLast', 'TickAttrib', 'TickAttribBidAsk', 'TickAttribLast', 'MktDepthData', 'DOMLevel', 'TradeLogEntry', 'TagValue', 'FamilyCode', 'SmartComponent', 'PortfolioItem', 'Position', 'Fill', 'OptionComputation', 'OptionChain', 'Dividends', 'NewsArticle', 'HistoricalNews', 'NewsTick', 'NewsBulletin', 'ConnectionStats', 'Contract', 'Stock', 'Option', 'Future', 'ContFuture', 'Forex', 'Index', 'CFD', 'Commodity', 'Bond', 'FuturesOption', 'MutualFund', 'Warrant', 'Bag', 'ComboLeg', 'DeltaNeutralContract', 'ContractDetails', 'ContractDescription', 'ScanData', 'Trade', 'Order', 'OrderStatus', 'OrderState', 'OrderComboLeg', 'LimitOrder', 'MarketOrder', 'StopOrder', 'StopLimitOrder', 'BracketOrder', 'OrderCondition', 'ExecutionCondition', 'MarginCondition', 'TimeCondition', 'PriceCondition', 'PercentChangeCondition', 'VolumeCondition', 'Ticker', 'IB', 'Client', 'Wrapper', 'FlexReport', 'FlexError', 'IBC', 'IBController', 'Watchdog']
python
1
2
from ib_insync import *
util.startLoop()
python
1
2
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=37)
<IB connected to 127.0.0.1:7497 clientId=37>

合约查询

python
1
ib.reqPositions()
[Position(account='DU1331072', contract=Forex('EURUSD', conId=12087792, localSymbol='EUR.USD', tradingClass='EUR.USD'), position=0.0, avgCost=0.0)]
python
1
ib.positions()
[]
python
1
[v for v in ib.accountValues() if v.tag == 'NetLiquidationByCurrency' and v.currency == 'BASE']
[AccountValue(account='DU1331072', tag='NetLiquidationByCurrency', value='1016878.84', currency='BASE', modelCode='')]
python
1
2
3
4
5
6
7
8
Contract(conId=270639)
Stock('AMD', 'SMART', 'USD')
Stock('INTC', 'SMART', 'USD', primaryExchange='NASDAQ')
Forex('EURUSD')
CFD('IBUS30')
Future('ES', '20180921', 'GLOBEX')
Option('SPY', '20170721', 240, 'C', 'SMART')
Bond(secIdType='ISIN', secId='US03076KAA60');
python
1
2
contract = Stock('TSLA', 'SMART', 'USD')
ib.reqContractDetails(contract)
[ContractDetails(contract=Contract(secType='STK', conId=76792991, symbol='TSLA', exchange='SMART', primaryExchange='NASDAQ', currency='USD', localSymbol='TSLA', tradingClass='NMS'), marketName='NMS', minTick=0.01, orderTypes='ACTIVETIM,AD,ADJUST,ALERT,ALGO,ALLOC,AVGCOST,BASKET,BENCHPX,COND,CONDORDER,DARKONLY,DARKPOLL,DAY,DEACT,DEACTDIS,DEACTEOD,DIS,GAT,GTC,GTD,GTT,HID,IBKRATS,ICE,IMB,IOC,LIT,LMT,LOC,MIT,MKT,MOC,MTL,NGCOMB,NODARK,NONALGO,OCA,OPG,OPGREROUT,PEGBENCH,POSTONLY,PREOPGRTH,REL,RPI,RTH,SCALE,SCALEODD,SCALERST,SNAPMID,SNAPMKT,SNAPREL,STP,STPLMT,SWEEP,TRAIL,TRAILLIT,TRAILLMT,TRAILMIT,WHATIF', validExchanges='SMART,AMEX,NYSE,CBOE,PHLX,ISE,CHX,ARCA,ISLAND,DRCTEDGE,BEX,BATS,EDGEA,CSFBALGO,JEFFALGO,BYX,IEX,EDGX,FOXRIVER,NYSENAT,PSX', priceMagnifier=1, underConId=0, longName='TESLA INC', contractMonth='', industry='Consumer, Cyclical', category='Auto Manufacturers', subcategory='Auto-Cars/Light Trucks', timeZoneId='EST', tradingHours='20200301:CLOSED;20200302:0400-20200302:2000;20200303:0400-20200303:2000;20200304:0400-20200304:2000;20200305:0400-20200305:2000;20200306:0400-20200306:2000;20200307:CLOSED;20200308:CLOSED;20200309:0400-20200309:2000;20200310:0400-20200310:2000;20200311:0400-20200311:2000;20200312:0400-20200312:2000;20200313:0400-20200313:2000;20200314:CLOSED;20200315:CLOSED;20200316:0400-20200316:2000;20200317:0400-20200317:2000;20200318:0400-20200318:2000;20200319:0400-20200319:2000;20200320:0400-20200320:2000;20200321:CLOSED;20200322:CLOSED;20200323:0400-20200323:2000;20200324:0400-20200324:2000;20200325:0400-20200325:2000;20200326:0400-20200326:2000;20200327:0400-20200327:2000;20200328:CLOSED;20200329:CLOSED;20200330:0400-20200330:2000;20200331:0400-20200331:2000;20200401:0400-20200401:2000;20200402:0400-20200402:2000;20200403:0400-20200403:2000;20200404:CLOSED', liquidHours='20200301:CLOSED;20200302:0930-20200302:1600;20200303:0930-20200303:1600;20200304:0930-20200304:1600;20200305:0930-20200305:1600;20200306:0930-20200306:1600;20200307:CLOSED;20200308:CLOSED;20200309:0930-20200309:1600;20200310:0930-20200310:1600;20200311:0930-20200311:1600;20200312:0930-20200312:1600;20200313:0930-20200313:1600;20200314:CLOSED;20200315:CLOSED;20200316:0930-20200316:1600;20200317:0930-20200317:1600;20200318:0930-20200318:1600;20200319:0930-20200319:1600;20200320:0930-20200320:1600;20200321:CLOSED;20200322:CLOSED;20200323:0930-20200323:1600;20200324:0930-20200324:1600;20200325:0930-20200325:1600;20200326:0930-20200326:1600;20200327:0930-20200327:1600;20200328:CLOSED;20200329:CLOSED;20200330:0930-20200330:1600;20200331:0930-20200331:1600;20200401:0930-20200401:1600;20200402:0930-20200402:1600;20200403:0930-20200403:1600;20200404:CLOSED', evRule='', evMultiplier=0, mdSizeMultiplier=100, aggGroup=1, underSymbol='', underSecType='', marketRuleIds='26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26', secIdList=[], realExpirationDate='', lastTradeTime='', stockType='', cusip='', ratings='', descAppend='', bondType='', couponType='', callable=False, putable=False, coupon=0, convertible=False, maturity='', issueDate='', nextOptionDate='', nextOptionType='', nextOptionPartial=False, notes='')]

日志信息级别

python
1
util.logToConsole()
python
1
2
import logging
util.logToConsole(logging.ERROR)

断开ib

python
1
ib.disconnect()

合约细节

合约基础信息

python
1
2
3
4
5
6
7
8
from ib_insync import *
util.startLoop()

import logging
# util.logToConsole(logging.DEBUG)

ib = IB()
ib.connect('127.0.0.1', 7497, clientId=11)
<IB connected to 127.0.0.1:7497 clientId=11>

cds 包含了所有交易所对于这个合约的细节信息。

python
1
2
3
4
5
amd = Stock('AMD')

cds = ib.reqContractDetails(amd)

len(cds)
35
python
1
cds[0]
ContractDetails(contract=Contract(secType='STK', conId=4391, symbol='AMD', exchange='SMART', primaryExchange='NASDAQ', currency='USD', localSymbol='AMD', tradingClass='NMS'), marketName='NMS', minTick=0.01, orderTypes='ACTIVETIM,AD,ADJUST,ALERT,ALGO,ALLOC,AVGCOST,BASKET,BENCHPX,COND,CONDORDER,DARKONLY,DARKPOLL,DAY,DEACT,DEACTDIS,DEACTEOD,DIS,GAT,GTC,GTD,GTT,HID,IBKRATS,ICE,IMB,IOC,LIT,LMT,LOC,MIT,MKT,MOC,MTL,NGCOMB,NODARK,NONALGO,OCA,OPG,OPGREROUT,PEGBENCH,POSTONLY,PREOPGRTH,REL,RPI,RTH,SCALE,SCALEODD,SCALERST,SNAPMID,SNAPMKT,SNAPREL,STP,STPLMT,SWEEP,TRAIL,TRAILLIT,TRAILLMT,TRAILMIT,WHATIF', validExchanges='SMART,AMEX,NYSE,CBOE,PHLX,ISE,CHX,ARCA,ISLAND,DRCTEDGE,BEX,BATS,EDGEA,CSFBALGO,JEFFALGO,BYX,IEX,EDGX,FOXRIVER,NYSENAT,PSX', priceMagnifier=1, underConId=0, longName='ADVANCED MICRO DEVICES', contractMonth='', industry='Technology', category='Semiconductors', subcategory='Electronic Compo-Semicon', timeZoneId='EST', tradingHours='20200301:CLOSED;20200302:0400-20200302:2000;20200303:0400-20200303:2000;20200304:0400-20200304:2000;20200305:0400-20200305:2000;20200306:0400-20200306:2000;20200307:CLOSED;20200308:CLOSED;20200309:0400-20200309:2000;20200310:0400-20200310:2000;20200311:0400-20200311:2000;20200312:0400-20200312:2000;20200313:0400-20200313:2000;20200314:CLOSED;20200315:CLOSED;20200316:0400-20200316:2000;20200317:0400-20200317:2000;20200318:0400-20200318:2000;20200319:0400-20200319:2000;20200320:0400-20200320:2000;20200321:CLOSED;20200322:CLOSED;20200323:0400-20200323:2000;20200324:0400-20200324:2000;20200325:0400-20200325:2000;20200326:0400-20200326:2000;20200327:0400-20200327:2000;20200328:CLOSED;20200329:CLOSED;20200330:0400-20200330:2000;20200331:0400-20200331:2000;20200401:0400-20200401:2000;20200402:0400-20200402:2000;20200403:0400-20200403:2000;20200404:CLOSED', liquidHours='20200301:CLOSED;20200302:0930-20200302:1600;20200303:0930-20200303:1600;20200304:0930-20200304:1600;20200305:0930-20200305:1600;20200306:0930-20200306:1600;20200307:CLOSED;20200308:CLOSED;20200309:0930-20200309:1600;20200310:0930-20200310:1600;20200311:0930-20200311:1600;20200312:0930-20200312:1600;20200313:0930-20200313:1600;20200314:CLOSED;20200315:CLOSED;20200316:0930-20200316:1600;20200317:0930-20200317:1600;20200318:0930-20200318:1600;20200319:0930-20200319:1600;20200320:0930-20200320:1600;20200321:CLOSED;20200322:CLOSED;20200323:0930-20200323:1600;20200324:0930-20200324:1600;20200325:0930-20200325:1600;20200326:0930-20200326:1600;20200327:0930-20200327:1600;20200328:CLOSED;20200329:CLOSED;20200330:0930-20200330:1600;20200331:0930-20200331:1600;20200401:0930-20200401:1600;20200402:0930-20200402:1600;20200403:0930-20200403:1600;20200404:CLOSED', evRule='', evMultiplier=0, mdSizeMultiplier=100, aggGroup=1, underSymbol='', underSecType='', marketRuleIds='26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26', secIdList=[], realExpirationDate='', lastTradeTime='', stockType='', cusip='', ratings='', descAppend='', bondType='', couponType='', callable=False, putable=False, coupon=0, convertible=False, maturity='', issueDate='', nextOptionDate='', nextOptionType='', nextOptionPartial=False, notes='')

查看合约最基础信息

python
1
2
3
contracts = [cd.contract for cd in cds]

contracts[0]
Contract(secType='STK', conId=4391, symbol='AMD', exchange='SMART', primaryExchange='NASDAQ', currency='USD', localSymbol='AMD', tradingClass='NMS')

合约查看和filter

股票’AMD’的当前所以可以交易的合约信息

python
1
util.df(contracts).head()
secType conId symbol lastTradeDateOrContractMonth strike right multiplier exchange primaryExchange currency localSymbol tradingClass includeExpired secIdType secId comboLegsDescrip comboLegs deltaNeutralContract
0 STK 4391 AMD 0.0 SMART NASDAQ USD AMD NMS False [] None
1 STK 32596680 AMD 0.0 SMART IBIS EUR AMD XETRA False [] None
2 STK 172603743 AMD 0.0 SMART EBS CHF AMD AMD False [] None
3 STK 298633607 AMD 0.0 SMART ASX AUD AMD AMD False [] None
4 STK 4391 AMD 0.0 AMEX NASDAQ USD AMD NMS False [] None

查询期货gc的当前所有合约

python
1
2
3
gc = ib.reqContractDetails(Future('GC'))
gc_contracts_df = util.df([cd.contract for cd in gc])
gc_contracts_df.head(5)
secType conId symbol lastTradeDateOrContractMonth strike right multiplier exchange primaryExchange currency localSymbol tradingClass includeExpired secIdType secId comboLegsDescrip comboLegs deltaNeutralContract
0 FUT 158708412 GC 20200626 0.0 100 NYMEX USD GCM0 GC False [] None
1 FUT 178747429 GC 20201229 0.0 100 NYMEX USD GCZ0 GC False [] None
2 FUT 198577650 GC 20210628 0.0 100 NYMEX USD GCM1 GC False [] None
3 FUT 217648791 GC 20211229 0.0 100 NYMEX USD GCZ1 GC False [] None
4 FUT 238666255 GC 20220628 0.0 100 NYMEX USD GCM2 GC False [] None

当前所有NYMEX的GC的期货合约

python
1
gc_contracts_df[gc_contracts_df["exchange"] == "NYMEX"].sort_values("lastTradeDateOrContractMonth")
secType conId symbol lastTradeDateOrContractMonth strike right multiplier exchange primaryExchange currency localSymbol tradingClass includeExpired secIdType secId comboLegsDescrip comboLegs deltaNeutralContract
18 FUT 397594943 GC 20200327 0.0 100 NYMEX USD GCH0 GC False [] None
8 FUT 319684499 GC 20200428 0.0 100 NYMEX USD GCJ0 GC False [] None
20 FUT 405978966 GC 20200527 0.0 100 NYMEX USD GCK0 GC False [] None
0 FUT 158708412 GC 20200626 0.0 100 NYMEX USD GCM0 GC False [] None
10 FUT 335154396 GC 20200827 0.0 100 NYMEX USD GCQ0 GC False [] None
11 FUT 343699127 GC 20201028 0.0 100 NYMEX USD GCV0 GC False [] None
1 FUT 178747429 GC 20201229 0.0 100 NYMEX USD GCZ0 GC False [] None
13 FUT 358917044 GC 20210224 0.0 100 NYMEX USD GCG1 GC False [] None
14 FUT 368776104 GC 20210428 0.0 100 NYMEX USD GCJ1 GC False [] None
2 FUT 198577650 GC 20210628 0.0 100 NYMEX USD GCM1 GC False [] None
16 FUT 385426871 GC 20210827 0.0 100 NYMEX USD GCQ1 GC False [] None
17 FUT 393223512 GC 20211027 0.0 100 NYMEX USD GCV1 GC False [] None
3 FUT 217648791 GC 20211229 0.0 100 NYMEX USD GCZ1 GC False [] None
4 FUT 238666255 GC 20220628 0.0 100 NYMEX USD GCM2 GC False [] None
5 FUT 260862601 GC 20221228 0.0 100 NYMEX USD GCZ2 GC False [] None
6 FUT 280949060 GC 20230628 0.0 100 NYMEX USD GCM3 GC False [] None
7 FUT 301051213 GC 20231227 0.0 100 NYMEX USD GCZ3 GC False [] None
9 FUT 324078607 GC 20240626 0.0 100 NYMEX USD GCM4 GC False [] None
12 FUT 347896248 GC 20241227 0.0 100 NYMEX USD GCZ4 GC False [] None
15 FUT 372852975 GC 20250626 0.0 100 NYMEX USD GCM5 GC False [] None
19 FUT 397594951 GC 20251229 0.0 100 NYMEX USD GCZ5 GC False [] None

SMART交易所的唯一AMD合约

python
1
2
3
amd = Stock('AMD', 'SMART', 'USD')

assert len(ib.reqContractDetails(amd)) == 1

SMART交易所的唯一INTC合约

python
1
2
3
intc = Stock('INTC', 'SMART', 'USD')

assert len(ib.reqContractDetails(intc)) == 1

不存在的合约

python
1
2
3
xxx = Stock('XXX', 'SMART', 'USD')

assert len(ib.reqContractDetails(xxx)) == 0
2020-03-01 18:01:03,946 ib_insync.wrapper ERROR Error 200, reqId 7: No security definition has been found for the request, contract: Stock(symbol='XXX', exchange='SMART', currency='USD')

EURUSD forex合约

python
1
2
3
eurusd = Forex('EURUSD')

assert len(ib.reqContractDetails(eurusd)) == 1
python
1
amd
Stock(symbol='AMD', exchange='SMART', currency='USD')

填充contrat missing的信息

python
1
2
ib.qualifyContracts(amd)
amd
Stock(conId=4391, symbol='AMD', exchange='SMART', primaryExchange='NASDAQ', currency='USD', localSymbol='AMD', tradingClass='NMS')

填充一个contracts的list

python
1
2
3
4
qualContracts = ib.qualifyContracts(amd, intc, xxx, eurusd)

assert intc in qualContracts
assert xxx not in qualContracts
2020-03-01 18:54:48,242 ib_insync.wrapper ERROR Error 200, reqId 13: No security definition has been found for the request, contract: Stock(symbol='XXX', exchange='SMART', currency='USD')
2020-03-01 18:54:48,244 ib_insync.ib ERROR Unknown contract: Stock(symbol='XXX', exchange='SMART', currency='USD')
python
1
qualContracts
[Stock(conId=4391, symbol='AMD', exchange='SMART', primaryExchange='NASDAQ', currency='USD', localSymbol='AMD', tradingClass='NMS'),
 Stock(conId=270639, symbol='INTC', exchange='SMART', primaryExchange='NASDAQ', currency='USD', localSymbol='INTC', tradingClass='NMS'),
 Forex('EURUSD', conId=12087792, exchange='IDEALPRO', localSymbol='EUR.USD', tradingClass='EUR.USD')]

股票专用查询合约。查询包含intc的所有合约

python
1
2
3
4
matches = ib.reqMatchingSymbols('intc')
matchContracts = [m.contract for m in matches]

matches
[ContractDescription(contract=Contract(secType='STK', conId=270639, symbol='INTC', primaryExchange='NASDAQ.NMS', currency='USD'), derivativeSecTypes=['CFD', 'OPT', 'IOPT', 'WAR', 'FUT', 'BAG']),
 ContractDescription(contract=Contract(secType='STK', conId=38709539, symbol='INTC', primaryExchange='MEXI', currency='MXN'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=12178234, symbol='INTC', primaryExchange='EBS', currency='CHF'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=11463493, symbol='INTCUSD', primaryExchange='EBS', currency='USD'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=130861844, symbol='S', primaryExchange='MEXI', currency='MXN'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=130861851, symbol='2S7', primaryExchange='FWB', currency='EUR'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=130651996, symbol='S', primaryExchange='NYSE', currency='USD'), derivativeSecTypes=['CFD', 'OPT', 'FUT', 'BAG']),
 ContractDescription(contract=Contract(secType='STK', conId=14015710, symbol='4613', primaryExchange='TSEJ', currency='JPY'), derivativeSecTypes=['CFD']),
 ContractDescription(contract=Contract(secType='STK', conId=257310905, symbol='002436', primaryExchange='SEHKSZSE', currency='CNH'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=257765562, symbol='603737', primaryExchange='SEHKNTL', currency='CNH'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=234809384, symbol='FPQ1', primaryExchange='FWB2', currency='EUR'), derivativeSecTypes=['IOPT']),
 ContractDescription(contract=Contract(secType='STK', conId=234809383, symbol='FING.B', primaryExchange='SFB', currency='SEK'), derivativeSecTypes=['CFD', 'OPT', 'IOPT', 'BAG']),
 ContractDescription(contract=Contract(secType='STK', conId=83364054, symbol='FRP', primaryExchange='VALUE', currency='USD'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=169544707, symbol='ECC', primaryExchange='NYSE', currency='USD'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=90691307, symbol='1151', primaryExchange='SEHK', currency='HKD'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=96816938, symbol='E16', primaryExchange='SGX', currency='USD'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=392988575, symbol='1JO', primaryExchange='FWB2', currency='EUR'), derivativeSecTypes=[]),
 ContractDescription(contract=Contract(secType='STK', conId=173148149, symbol='JYNT', primaryExchange='NASDAQ.SCM', currency='USD'), derivativeSecTypes=['OPT', 'BAG']),
 ContractDescription(contract=Contract(secType='STK', conId=131085231, symbol='4621', primaryExchange='TSEJ', currency='JPY'), derivativeSecTypes=[])]

期权链

spx合约

python
1
2
spx = Index('SPX', 'CBOE')
ib.qualifyContracts(spx)
[Index(conId=416904, symbol='SPX', exchange='CBOE', currency='USD', localSymbol='SPX')]

这里使用delayed data.

marketDataType: One of:

* 1 = Live
* 2 = Frozen
* 3 = Delayed
* 4 = Delayed frozen
python
1
ib.reqMarketDataType(4)

当前tick信息

python
1
2
[ticker] = ib.reqTickers(spx)
ticker
Ticker(contract=Index(conId=416904, symbol='SPX', exchange='CBOE', currency='USD', localSymbol='SPX'), time=datetime.datetime(2020, 3, 2, 0, 1, 57, 930587, tzinfo=datetime.timezone.utc), bid=-1.0, bidSize=0, ask=-1.0, askSize=0, last=-1.0, lastSize=0)

当前市场价格。因为是非交易时间所以是nan

python
1
2
spxValue = ticker.marketPrice()
spxValue
nan

查看option链

python
1
2
3
chains = ib.reqSecDefOptParams(spx.symbol, '', spx.secType, spx.conId)

util.df(chains)
exchange underlyingConId tradingClass multiplier expirations strikes
0 SMART 416904 SPX 100 [20200319, 20200416, 20200514, 20200618, 20200... [100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 650...
1 CBOE 416904 SPXW 100 [20200302, 20200304, 20200306, 20200309, 20200... [800.0, 900.0, 1000.0, 1100.0, 1150.0, 1200.0,...
2 SMART 416904 SPXW 100 [20200302, 20200304, 20200306, 20200309, 20200... [800.0, 900.0, 1000.0, 1100.0, 1150.0, 1200.0,...
3 CBOE 416904 SPX 100 [20200319, 20200416, 20200514, 20200618, 20200... [100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 650...

选择tradingclass 是spx, exchange是smart的那个合约, 查看这个合约的option chain

python
1
2
chain = next(c for c in chains if c.tradingClass == 'SPX' and c.exchange == 'SMART')
chain
OptionChain(exchange='SMART', underlyingConId='416904', tradingClass='SPX', multiplier='100', expirations=['20200319', '20200416', '20200514', '20200618', '20200716', '20200820', '20200917', '20201015', '20201119', '20201217', '20210114', '20210318', '20210617', '20211216', '20221215'], strikes=[100.0, 200.0, 300.0, 400.0, 500.0, 600.0, 650.0, 700.0, 750.0, 800.0, 850.0, 900.0, 950.0, 1000.0, 1050.0, 1100.0, 1150.0, 1200.0, 1225.0, 1250.0, 1275.0, 1300.0, 1325.0, 1350.0, 1375.0, 1400.0, 1425.0, 1450.0, 1475.0, 1500.0, 1525.0, 1550.0, 1575.0, 1600.0, 1625.0, 1650.0, 1675.0, 1700.0, 1725.0, 1750.0, 1775.0, 1800.0, 1825.0, 1850.0, 1875.0, 1900.0, 1925.0, 1950.0, 1975.0, 2000.0, 2025.0, 2050.0, 2075.0, 2090.0, 2100.0, 2110.0, 2120.0, 2125.0, 2130.0, 2140.0, 2150.0, 2160.0, 2170.0, 2175.0, 2180.0, 2190.0, 2200.0, 2210.0, 2220.0, 2225.0, 2230.0, 2240.0, 2250.0, 2260.0, 2270.0, 2275.0, 2280.0, 2290.0, 2300.0, 2310.0, 2320.0, 2325.0, 2330.0, 2340.0, 2350.0, 2360.0, 2370.0, 2375.0, 2380.0, 2385.0, 2390.0, 2395.0, 2400.0, 2405.0, 2410.0, 2415.0, 2420.0, 2425.0, 2430.0, 2435.0, 2440.0, 2445.0, 2450.0, 2455.0, 2460.0, 2465.0, 2470.0, 2475.0, 2480.0, 2485.0, 2490.0, 2495.0, 2500.0, 2505.0, 2510.0, 2515.0, 2520.0, 2525.0, 2530.0, 2535.0, 2540.0, 2545.0, 2550.0, 2555.0, 2560.0, 2565.0, 2570.0, 2575.0, 2580.0, 2585.0, 2590.0, 2595.0, 2600.0, 2605.0, 2610.0, 2615.0, 2620.0, 2625.0, 2630.0, 2635.0, 2640.0, 2645.0, 2650.0, 2655.0, 2660.0, 2665.0, 2670.0, 2675.0, 2680.0, 2685.0, 2690.0, 2695.0, 2700.0, 2705.0, 2710.0, 2715.0, 2720.0, 2725.0, 2730.0, 2735.0, 2740.0, 2745.0, 2750.0, 2755.0, 2760.0, 2765.0, 2770.0, 2775.0, 2780.0, 2785.0, 2790.0, 2795.0, 2800.0, 2805.0, 2810.0, 2815.0, 2820.0, 2825.0, 2830.0, 2835.0, 2840.0, 2845.0, 2850.0, 2855.0, 2860.0, 2865.0, 2870.0, 2875.0, 2880.0, 2885.0, 2890.0, 2895.0, 2900.0, 2905.0, 2910.0, 2915.0, 2920.0, 2925.0, 2930.0, 2935.0, 2940.0, 2945.0, 2950.0, 2955.0, 2960.0, 2965.0, 2970.0, 2975.0, 2980.0, 2985.0, 2990.0, 2995.0, 3000.0, 3005.0, 3010.0, 3015.0, 3020.0, 3025.0, 3030.0, 3035.0, 3040.0, 3045.0, 3050.0, 3055.0, 3060.0, 3065.0, 3070.0, 3075.0, 3080.0, 3085.0, 3090.0, 3095.0, 3100.0, 3105.0, 3110.0, 3115.0, 3120.0, 3125.0, 3130.0, 3135.0, 3140.0, 3145.0, 3150.0, 3155.0, 3160.0, 3165.0, 3170.0, 3175.0, 3180.0, 3185.0, 3190.0, 3195.0, 3200.0, 3205.0, 3210.0, 3215.0, 3220.0, 3225.0, 3230.0, 3235.0, 3240.0, 3245.0, 3250.0, 3255.0, 3260.0, 3265.0, 3270.0, 3275.0, 3280.0, 3285.0, 3290.0, 3295.0, 3300.0, 3305.0, 3310.0, 3315.0, 3320.0, 3325.0, 3330.0, 3335.0, 3340.0, 3345.0, 3350.0, 3355.0, 3360.0, 3365.0, 3370.0, 3375.0, 3380.0, 3385.0, 3390.0, 3395.0, 3400.0, 3405.0, 3410.0, 3415.0, 3420.0, 3425.0, 3430.0, 3435.0, 3440.0, 3445.0, 3450.0, 3455.0, 3460.0, 3465.0, 3470.0, 3475.0, 3480.0, 3485.0, 3490.0, 3495.0, 3500.0, 3505.0, 3510.0, 3515.0, 3520.0, 3525.0, 3530.0, 3535.0, 3540.0, 3545.0, 3550.0, 3555.0, 3560.0, 3565.0, 3570.0, 3575.0, 3580.0, 3585.0, 3590.0, 3595.0, 3600.0, 3605.0, 3610.0, 3615.0, 3620.0, 3625.0, 3630.0, 3635.0, 3640.0, 3650.0, 3660.0, 3670.0, 3675.0, 3680.0, 3690.0, 3700.0, 3710.0, 3720.0, 3725.0, 3750.0, 3775.0, 3800.0, 3850.0, 3900.0, 3950.0, 4000.0, 4050.0, 4100.0, 4200.0, 4300.0, 4400.0, 4500.0, 4600.0, 4700.0, 4800.0, 4900.0])

Bar数据

GC future合约 2020年4月28日到期

python
1
2
contract_319684499 = Contract(conId=319684499)
ib.qualifyContracts(contract_319684499)
[Contract(secType='FUT', conId=319684499, symbol='GC', lastTradeDateOrContractMonth='20200428', multiplier='100', exchange='NYMEX', currency='USD', localSymbol='GCJ0', tradingClass='GC')]

合约开始时间

python
1
ib.reqHeadTimeStamp(contract_319684499, whatToShow='MIDPOINT', useRTH=True)
datetime.datetime(2018, 5, 30, 22, 0)

10天的1分钟数据。一次下太多ib就要搞你,10天的够了。

python
1
2
3
4
5
6
7
8
bars = ib.reqHistoricalData(
contract_319684499,
endDateTime='',
durationStr='10 D',
barSizeSetting='1 min',
whatToShow='TRADES',
useRTH=True,
formatDate=1)
python
1
bars[0]
BarData(date=datetime.datetime(2020, 2, 14, 9, 30), open=1583.3, high=1583.8, low=1583.0, close=1583.4, volume=922, average=1583.43, barCount=347)
python
1
2
3
df = util.df(bars)
display(df.head())
display(df.tail())
date open high low close volume average barCount
0 2020-02-14 09:30:00 1583.3 1583.8 1583.0 1583.4 922 1583.43 347
1 2020-02-14 09:31:00 1583.5 1583.6 1583.2 1583.4 547 1583.45 240
2 2020-02-14 09:32:00 1583.4 1583.4 1582.6 1582.7 786 1582.95 299
3 2020-02-14 09:33:00 1582.8 1582.9 1582.1 1582.6 710 1582.43 293
4 2020-02-14 09:34:00 1582.7 1582.8 1582.4 1582.6 230 1582.58 127
date open high low close volume average barCount
4495 2020-02-28 16:55:00 1586.6 1589.0 1586.2 1586.8 82 1587.33 50
4496 2020-02-28 16:56:00 1586.9 1588.6 1586.2 1587.0 42 1587.39 32
4497 2020-02-28 16:57:00 1587.0 1588.7 1587.0 1587.4 104 1587.74 40
4498 2020-02-28 16:58:00 1587.7 1588.1 1587.4 1587.7 29 1587.71 20
4499 2020-02-28 16:59:00 1587.3 1587.5 1586.5 1587.3 43 1587.00 26

下面的code通过循环把一个合约所有数据都下载下来

python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
contract_319684499 = Contract(conId=319684499)
ib.qualifyContracts(contract_319684499)

dt = ''
barsList = []
while True:
bars = ib.reqHistoricalData(
contract_319684499,
endDateTime=dt,
durationStr='10 D',
barSizeSetting='1 min',
whatToShow='TRADES',
useRTH=True,
formatDate=1)
if not bars:
break
barsList.append(bars)
dt = bars[0].date
print(dt)

allBars = [b for bars in reversed(barsList) for b in bars]
df = util.df(allBars)
2020-02-14 09:30:00
2020-01-31 09:30:00
2020-01-16 09:30:00
2020-01-02 09:30:00
2019-12-17 09:30:00
2019-12-03 09:30:00
2019-11-18 09:30:00
2019-11-04 09:30:00
2019-10-21 09:30:00
2019-10-07 09:30:00
2019-09-23 09:30:00
2019-09-09 09:30:00
2019-08-23 09:30:00
2019-08-09 09:30:00
2019-07-26 09:30:00
2019-07-12 09:30:00
2019-06-27 09:30:00
2019-06-13 09:30:00
2019-05-30 09:30:00
2019-05-15 09:30:00
2019-05-01 10:21:00
2019-04-17 09:30:00
2019-04-03 10:53:00
2019-03-21 09:30:00
2019-03-07 09:30:00
2019-02-21 09:30:00
2019-02-06 09:45:00
2019-01-24 09:55:00
2019-01-11 09:30:00
2019-01-02 09:30:00
2018-12-20 14:43:00
2018-12-07 10:01:00
2018-11-29 09:42:00
2018-11-23 11:44:00


Error 162, reqId 39: Historical Market Data Service error message:HMDS query returned no data: GCJ0@NYMEX Trades, contract: Contract(secType='FUT', conId=319684499, symbol='GC', lastTradeDateOrContractMonth='20200428', multiplier='100', exchange='NYMEX', currency='USD', localSymbol='GCJ0', tradingClass='GC')

上面的报错原因猜测是因为20181123之前,成交量太低了,选择whattoshow == “TRADE”的话就返回不了数据. 选择whattoshow == “MIDPOINT” 还是可以返回数据, 但是我们不需要了,到这就够了.

下面的数可以看出,20181123的时候这个合约还不是主力合约,没有人交易。而当前最新的交易量显示它是主力合约

python
1
df.head()
date open high low close volume average barCount
0 2018-11-23 11:44:00 1272.7 1272.7 1272.7 1272.7 11 1272.7 5
1 2018-11-23 11:45:00 1272.7 1272.7 1272.7 1272.7 0 1272.7 0
2 2018-11-23 11:46:00 1272.7 1272.7 1272.7 1272.7 0 1272.7 0
3 2018-11-23 11:47:00 1272.7 1272.7 1272.7 1272.7 0 1272.7 0
4 2018-11-23 11:48:00 1272.7 1272.7 1272.7 1272.7 0 1272.7 0
python
1
df.tail()
date open high low close volume average barCount
119254 2020-02-28 16:55:00 1586.6 1589.0 1586.2 1586.8 82 1587.33 50
119255 2020-02-28 16:56:00 1586.9 1588.6 1586.2 1587.0 42 1587.39 32
119256 2020-02-28 16:57:00 1587.0 1588.7 1587.0 1587.4 104 1587.74 40
119257 2020-02-28 16:58:00 1587.7 1588.1 1587.4 1587.7 29 1587.71 20
119258 2020-02-28 16:59:00 1587.3 1587.5 1586.5 1587.3 43 1587.00 26
python
1
df.describe()
open high low close volume average barCount
count 119259.000000 119259.000000 119259.000000 119259.000000 119259.000000 119259.000000 119259.000000
mean 1452.039395 1452.075496 1452.000574 1452.037914 31.230398 1452.038183 13.755918
std 95.843262 95.894540 95.788182 95.841548 167.720980 95.841501 71.451877
min 1272.700000 1272.700000 1272.700000 1272.700000 0.000000 1272.700000 0.000000
25% 1352.000000 1352.000000 1352.000000 1352.000000 0.000000 1352.000000 0.000000
50% 1475.600000 1475.600000 1475.600000 1475.600000 0.000000 1475.600000 0.000000
75% 1524.600000 1524.600000 1524.600000 1524.600000 0.000000 1524.600000 0.000000
max 1684.800000 1686.600000 1683.800000 1684.300000 9591.000000 1685.380000 3716.000000
python
1
df.to_csv(contract_319684499.symbol + '.csv')

评论