1、获得当前有哪几个月份的合约
(50ETF)http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getStockName?exchange=null&cate=50ETF
(上交所300ETF)http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getStockName?exchange=null&cate=300ETF
返回结果示例如下,contractMonth字段就是我们想要的数据
{ "result": { "status": { "code": 0 }, "data": { "cateList": [ "300ETF", "50ETF", "300ETF" ], "contractMonth": [ "2020-01", "2020-01", "2020-02", "2020-03", "2020-06" ], "stockId": "510300", "cateId": "510300C2001" } } }
2、获得某个月份合约的到期日和剩余天数
非除权日http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay?exchange=null&cate=50ETF&date=2020-06
除权日http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay?exchange=null&cate=XD50ETF&date=2020-06
上交所300ETF的需要将上面url中的50ETF改为300ETF
大家调用的时候把年和月改成上面第一个接口返回的年和月,例如2019年4月就是date=2019-04,结果示例如下,expireDay字段为到期日,remainderDays字段为剩余天数
{ "result": { "status": { "code": 0 }, "data": { "expireDay": "2020-06-24", "remainderDays": 180, "stockId": "510300", "cateId": "510300C2006", "zhulikanzhang": "", "zhulikandie": "", "other": { "name": "华泰柏瑞沪深300ETF", "type": 10, "symbol": "s_sh510300", "url": "http://finance.sina.com.cn/fund/quotes/510300/bc.shtml" } } } }
3、获得某月到期的看涨期权代码列表http://hq.sinajs.cn/list=OP_UP_5100502006,510050为标的代码,2006代表到期年月。
上交所300ETFhttp://hq.sinajs.cn/list=OP_UP_5103002006
结果示例如下
var hq_str_OP_UP_5100502006="CON_OP_10002083,CON_OP_10002009,CON_OP_10002084,
CON_OP_10001989,CON_OP_10002085,CON_OP_10001990,CON_OP_10002086,CON_OP_10001991,
CON_OP_10002087,CON_OP_10001992,CON_OP_10002088,CON_OP_10001993,CON_OP_10002089,
CON_OP_10001994,CON_OP_10002090,CON_OP_10001995,CON_OP_10002091,CON_OP_10001996,
CON_OP_10002107,CON_OP_10001997,CON_OP_10002115,CON_OP_10002007,";
4、获得某月到期的看跌期权代码列表http://hq.sinajs.cn/list=OP_DOWN_5103002006,同上
5、根据合约代码获得实时期权行情http://hq.sinajs.cn/list=CON_OP_10002180,结果示例如下
var hq_str_CON_OP_10002176="1,0.2822,0.2849,0.2852,1,4096,-0.38,4.1000,0.2860,
0.2987,0.7018,0.0001,0.2920,10,0.2894,1,0.2888,1,0.2881,10,0.2852,1,0.2822,1,0.2768,
15,0.2689,1,0.2683,1,0.2661,1,2020-01-10 14:55:35,0,E 01,EBS,510300,300ETF购6月4100,
7.10,0.2987,0.2784,521,1485322.00,M,0.2860,C,2020-06-24,166,2,0.057,0.2279";
各个字段的意思
var hq_str_CON_OP_代码=“买量(0),买价,最新价,卖价,卖量,持仓量,涨幅,行权价,昨收价,开盘价,涨停价,跌停价(11),
申卖 价五,申卖量五,申卖价四,申卖量四,申卖价三,申卖量三,申卖价二,申卖量二,申卖价一,申卖量一,申买价一,
申买量一 ,申买价二,申买量二,申买价三,申买量三,申买价四,申买量四,申买价五,申买量五,行情时间,主力合约标识,状态码,
标的证券类型,标的股票,期权合约简称,振幅(38),最高价,最低价,成交量,成交额,分红调整标志,昨结算价,认购认沽标志,
到期日,剩余天数,虚实值标志,内在价值,时间价值
6、50ETF实时行情http://hq.sinajs.cn/list=sh510050,结果示例如下
上交所300ETF实时行情http://hq.sinajs.cn/list=sh510300
var hq_str_sh510050="
50ETF,2.715,2.690,2.701,2.744,2.687,2.700,2.701,1323173371,3593093810.000,2134800,
2.700,1175600,2.699,466500,2.698,154000,2.697,1451100,2.696,257800,2.701,525100,2.702,
299500,2.703,233800,2.704,1286100,2.705,2019-03-12,15:00:05,00";
各个字段意义
var hq_str_sh510050=证券简称,今日开盘价,昨日收盘价,最近成交价,最高成交价,最低成交价,买入价,
卖出价,成交数量,成交金额,买数量一,买价位一,买数量二,买价位二,买数量三 ,买价位三,买数量四,
买价位四,买数量五,买价位五,卖数量一,卖价位一,卖数量二,卖价位二,卖数量三,卖价位三,卖数量四,
卖价位四,卖数量五,卖价位五,行情日期,行情时间,停牌状态
简版的接口http://hq.sinajs.cn/list=s_sh510300
var hq_str_s_sh510300="300ETF,4.017,-0.004,-0.10,4368130,176618";
var hq_str_s_sh510300=证券简称,最新价,涨跌额,涨跌幅,成交量,成交额
7、期权隐含波动率,希腊字母等信息http://hq.sinajs.cn/list=CON_SO_10002180,结果示例如下
var hq_str_CON_SO_10002180="300ETF沽6月3600,,,,4204,-0.0595,0.3455,-0.0312,0.3339,0.1549,0.0235,0.0192,
510300P2006M03600,3.6000,0.0235,0.0091,M";
各个字段意思
期权合约简称,,,,成交量,Delta,Gamma,Theta,Vega,隐含波动率,最高价,最低价,交易代码,行权价,最新价,理论价值
8、期权分时线数据接口
https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionDaylineService.getOptionMinline?symbol=CON_OP_10002180
{"result":{"status":{"code":0},"data":[
{"i":"09:26:00","p":"0.0000","v":"0","t":"0","a":"0.0000","d":"2019-12-27"},{"i":"09:27:00","p":"0.0000","v":"0","t":"0","a":"0.0000"},
{"i":"09:28:00","p":"0.0000","v":"0","t":"0","a":"0.0000"},{"i":"09:29:00","p":"0.0000","v":"0","t":"0","a":"0.0000"},
{"i":"09:30:00","p":"0.0000","v":"0","t":"2247","a":"0.0000"},{"i":"09:31:00","p":"0.0000","v":"0","t":"2247","a":"0.0000"},
{"i":"09:32:00","p":"0.0200","v":"0","t":"2247","a":"0.0200"},{"i":"09:33:00","p":"0.0200","v":"0","t":"2247","a":"0.0200"},
{"i":"09:34:00","p":"0.0197","v":"0","t":"2269","a":"0.0196"},{"i":"09:35:00","p":"0.0198","v":"12","t":"2281","a":"0.0197"},
{"i":"09:36:00","p":"0.0194","v":"66","t":"2324","a":"0.0197"},{"i":"09:37:00","p":"0.0194","v":"0","t":"2324","a":"0.0197"},
{"i":"09:38:00","p":"0.0200","v":"6","t":"2330","a":"0.0197"},{"i":"09:39:00","p":"0.0200","v":"1","t":"2331","a":"0.0197"},
各字段意义:i时间,p价格,v成交,t持仓,a均价
9、期权日K线数据接口
http://stock.finance.sina.com.cn/futures/api/jsonp_v2.php//StockOptionDaylineService.getSymbolInfo?symbol=CON_OP_10002180
/**/
([{"d":"2019-12-23","o":"0.0310","h":"0.0378","l":"0.0218","c":"0.0307","v":"9546855"},
{"d":"2019-12-24","o":"0.0312","h":"0.0312","l":"0.0243","c":"0.0252","v":"1379181"},
{"d":"2019-12-25","o":"0.0249","h":"0.0276","l":"0.0234","c":"0.0252","v":"2920675"},
{"d":"2019-12-26","o":"0.0252","h":"0.0252","l":"0.0210","c":"0.0210","v":"3132585"},
{"d":"2019-12-27","o":"0.0200","h":"0.0235","l":"0.0192","c":"0.0235","v":"7747007"}]);
各字段意义:d日期,o开盘,h最高,l最低,c收盘,v成交
10、期权最近5个交易日的分时线数据接口
https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionDaylineService.getFiveDayLine?symbol=CON_OP_10002180
11、另外我还在js代码里发现了其它一些行情接口,与以上接口有些功能是重合的
http://hq.sinajs.cn/list=CON_ZL_10002122
这些接口可以一次传入多个参数来获取多条数据,多个参数用逗号连接,例如http://hq.sinajs.cn/list=CON_SO_10001585,CON_SO_10001727,CON_SO_10001619一次获取了3个合约的数据。
以下是我写的用于获取数据的python代码:
# python3 from json import loads from requests import get def get_option_dates(cate='50ETF', exchange='null'): url = f"http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getStockName?" \ f"exchange={exchange}&cate={cate}" dates = get(url).json()['result']['data']['contractMonth'] return [''.join(i.split('-')) for i in dates][1:] def get_option_expire_day(date, cate='50ETF', exchange='null'): url = "http://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionService.getRemainderDay?" \ "exchange={exchange}&cate={cate}&date={year}-{month}" url2 = url.format(year=date[:4], month=date[4:], cate=cate, exchange=exchange) data = get(url2).json()['result']['data'] if int(data['remainderDays']) < 0: url2 = url.format(year=date[:4], month=date[4:], cate='XD' + cate, exchange=exchange) data = get(url2).json()['result']['data'] return data['expireDay'], int(data['remainderDays']) def get_option_codes(date, underlying='510050'): url_up = ''.join(["http://hq.sinajs.cn/list=OP_UP_", underlying, str(date)[-4:]]) url_down = ''.join(["http://hq.sinajs.cn/list=OP_DOWN_", underlying, str(date)[-4:]]) data_up = str(get(url_up).content).replace('"', ',').split(',') codes_up = [i[7:] for i in data_up if i.startswith('CON_OP_')] data_down = str(get(url_down).content).replace('"', ',').split(',') codes_down = [i[7:] for i in data_down if i.startswith('CON_OP_')] return codes_up, codes_down def get_option_price(code): url = "http://hq.sinajs.cn/list=CON_OP_{code}".format(code=code) data = get(url).content.decode('gbk') data = data[data.find('"') + 1: data.rfind('"')].split(',') fields = ['买量', '买价', '最新价', '卖价', '卖量', '持仓量', '涨幅', '行权价', '昨收价', '开盘价', '涨停价', '跌停价', '申卖价五', '申卖量五', '申卖价四', '申卖量四', '申卖价三', '申卖量三', '申卖价二', '申卖量二', '申卖价一', '申卖量一', '申买价一', '申买量一 ', '申买价二', '申买量二', '申买价三', '申买量三', '申买价四', '申买量四', '申买价五', '申买量五', '行情时间', '主力合约标识', '状态码', '标的证券类型', '标的股票', '期权合约简称', '振幅', '最高价', '最低价', '成交量', '成交额', '分红调整标志', '昨结算价', '认购认沽标志', '到期日', '剩余天数', '虚实值标志', '内在价值', '时间价值'] result = list(zip(fields, data)) return result def get_underlying_security_price(code='sh510050'): url = "http://hq.sinajs.cn/list=" + code data = get(url).content.decode('gbk') data = data[data.find('"') + 1: data.rfind('"')].split(',') fields = ['证券简称', '今日开盘价', '昨日收盘价', '最近成交价', '最高成交价', '最低成交价', '买入价', '卖出价', '成交数量', '成交金额', '买数量一', '买价位一', '买数量二', '买价位二', '买数量三', '买价位三', '买数量四', '买价位四', '买数量五', '买价位五', '卖数量一', '卖价位一', '卖数量二', '卖价位二', '卖数量三', '卖价位三', '卖数量四', '卖价位四', '卖数量五', '卖价位五', '行情日期', '行情时间', '停牌状态'] return list(zip(fields, data)) def get_option_greek_alphabet(code): url = "http://hq.sinajs.cn/list=CON_SO_{code}".format(code=code) data = get(url).content.decode('gbk') data = data[data.find('"') + 1: data.rfind('"')].split(',') fields = ['期权合约简称', '成交量', 'Delta', 'Gamma', 'Theta', 'Vega', '隐含波动率', '最高价', '最低价', '交易代码', '行权价', '最新价', '理论价值'] return list(zip(fields, [data[0]] + data[4:])) def get_option_time_line(code): url = f"https://stock.finance.sina.com.cn/futures/api/openapi.php/StockOptionDaylineService.getOptionMinline?" \ f"symbol=CON_OP_{code}" data = get(url).json()['result']['data'] return data def get_option_day_kline(code): url = f"http://stock.finance.sina.com.cn/futures/api/jsonp_v2.php//StockOptionDaylineService.getSymbolInfo?" \ f"symbol=CON_OP_{code}" data = get(url).content data = loads(data[data.find(b'(') + 1: data.rfind(b')')]) return data def my_test(): dates = get_option_dates(cate='300ETF') print('期权合约月份:{}'.format(dates)) for date in dates: print('期权月份{}:到期日{} 剩余天数{}'.format(date, *get_option_expire_day(date, cate='300ETF'))) demo_code = '10002180' for date in dates: call_codes, put_codes = get_option_codes(date, underlying='510300') print('期权月份{} 看涨期权代码:{}\n期权月份{} 看跌期权代码:{}'.format(date, call_codes, date, put_codes)) demo_code = call_codes[0] for index, i in enumerate(get_option_price(demo_code)): print('期权' + demo_code, index, *i) for index, i in enumerate(get_underlying_security_price(code='sh510300')): print(index, *i) for index, i in enumerate(get_option_greek_alphabet(demo_code)): print('期权' + demo_code, index, *i) time_line = get_option_time_line(demo_code) for i in time_line[-10:]: print('时间:{i}, 价格:{p}, 成交:{v}, 持仓:{t}, 均价:{a}'.format(**i)) day_kline = get_option_day_kline(demo_code) for i in day_kline: print('日期:{d}, 开盘:{o}, 最高:{h}, 最低:{l}, 收盘:{c}, 成交:{v}'.format(**i)) if __name__ == '__main__': my_test()