利用akshare读取50EFF期权1
Posted 最老程序员闫涛
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用akshare读取50EFF期权1相关的知识,希望对你有一定的参考价值。
目前国内期权市场比较活跃的期权产品,当属上证的50ETF期权,下面我们将通过akshare库,来获取50ETF期权数据。
获取合约到期月份列表
def demo(self):
# 获取合约到期月份列表
option_sina_sse_list_df = ak.option_sina_sse_list(
symbol="50ETF", exchange="null")
print(option_sina_sse_list_df)
我们通过symbol来指定查询50ETF期权,其返回值如下所示:
['202008', '202009', '202012', '202103']
这是我在2020年8月17日执行上面代码返回的结果,可以看到到期月份为8、9、12和2021年3月。
其实期权产品中还有300ETF,如果要获取300ETF合约到期月份列表,可以通过将上面代码中symbol设置为300ETF来实现。
到期月份合约数
下面我们来获取到期月份的合约数量:
def demo(self):
#
option_sina_sse_expire_day_df = ak.option_sina_sse_expire_day(
trade_date="202012", symbol="50ETF", exchange="null")
print(option_sina_sse_expire_day_df)
我们查询的是12月到期的50ETF合约情况,其运行结果为:
('2020-12-23', 128)
表明其到期时间为2020年12月23日,共有128个。
获取所有合约列表
我们可以获取指定品种在指定月份所有合约列表,例如,我们要获取2020年12月份50ETF合约列表:
def demo(self):
#
option_sina_sse_codes_df = ak.option_sina_sse_codes(
trade_date="202012", underlying="510050")
print(option_sina_sse_codes_df)
注意:如果我们想查询300ETF时,underlying的值就是510300。
运行结果如下所示:
(['10002513', '10002477', '10002478', '10002479', '10002480',
'10002481', '10002482', '10002483', '10002484', '10002485',
'10002517', '10002571', '10002579', '10002627', '10002643',
'10002659', '10002687', '10002688', '10002689'],
['10002514', '10002486', '10002487', '10002488', '10002489',
'10002490', '10002491', '10002492', '10002493', '10002494',
'10002518', '10002572', '10002580', '10002628', '10002644',
'10002660', '10002690', '10002691', '10002692'])
我们看到结果由两个列表组成,第一个列表为认购(看涨)期权,第二个列表为认沽(看跌)期权。
获取期权合约内容
对于上面认购或认沽期权,我们需要获取期权合约的详细信息:
def demo(self):
#
calls, puts = ak.option_sina_sse_codes(
trade_date="202012", underlying="510050")
print('认购期权列表:')
for i in range(len(calls)):
oc = ak.option_sina_sse_spot_price(
code=calls[i])
keys = oc['字段']
vals = oc['值']
print('0: 1:2=3;'.format(i, calls[i],
keys[Sz50ETF.OCF_BUY_PRICE], vals[Sz50ETF.OCF_BUY_PRICE]
))
print('认沽期权列表:')
for i in range(len(puts)):
oc = ak.option_sina_sse_spot_price(
code=puts[i])
keys = oc['字段']
vals = oc['值']
print('0: 1:2=3;'.format(i, calls[i],
keys[Sz50ETF.OCF_BUY_PRICE], vals[Sz50ETF.OCF_BUY_PRICE]
))
print('完整合约:')
oc = ak.option_sina_sse_spot_price(
code=calls[0])
keys = oc['字段']
vals = oc['值']
for i in range(len(keys)):
print('0: 1;'.format(keys[i], vals[i]))
- 第3、4行:获取认购和认沽期权列表;
- 第6~13行:打印认购期权列表,认购期权价格从高到低进行排列;
- 第15~22行:打印认沽期权列表,认沽期权价格从低到高进行排列;
- 第24~29行:打印一个期权合约的全部内容,期权合约共有42个字段,类型为DataFrame,每个字段是DataFrame的一行;
运行结果如下所示:
认购期权列表:
0: 10002513:买价=0.8574;
1: 10002477:买价=0.8095;
2: 10002478:买价=0.7624;
3: 10002479:买价=0.7220;
4: 10002480:买价=0.6708;
5: 10002481:买价=0.6281;
6: 10002482:买价=0.5822;
7: 10002483:买价=0.5396;
8: 10002484:买价=0.4999;
9: 10002485:买价=0.4654;
10: 10002517:买价=0.3867;
11: 10002571:买价=0.3194;
12: 10002579:买价=0.2655;
13: 10002627:买价=0.2141;
14: 10002643:买价=0.1720;
15: 10002659:买价=0.1408;
16: 10002687:买价=0.1117;
17: 10002688:买价=0.0905;
18: 10002689:买价=0.0738;
认沽期权列表:
0: 10002513:买价=0.0107;
1: 10002477:买价=0.0122;
2: 10002478:买价=0.0151;
3: 10002479:买价=0.0179;
4: 10002480:买价=0.0218;
5: 10002481:买价=0.0263;
6: 10002482:买价=0.0318;
7: 10002483:买价=0.0387;
8: 10002484:买价=0.0469;
9: 10002485:买价=0.0575;
10: 10002517:买价=0.0817;
11: 10002571:买价=0.1125;
12: 10002579:买价=0.1522;
13: 10002627:买价=0.2030;
14: 10002643:买价=0.2581;
15: 10002659:买价=0.3229;
16: 10002687:买价=0.3939;
17: 10002688:买价=0.4710;
18: 10002689:买价=0.5528;
完整合约:
买量: 1;
买价: 0.8574;
最新价: 0.8600;
卖价: 0.8575;
卖量: 15;
持仓量: 5522;
涨幅: 8.45;
行权价: 2.5500;
昨收价: 0.7780;
开盘价: 0.8000;
涨停价: 1.1273;
跌停价: 0.4587;
申卖价五: 0.8714;
申卖量五: 1;
申卖价四: 0.8691;
申卖量四: 1;
申卖价三: 0.8680;
申卖量三: 3;
申卖价二: 0.8600;
申卖量二: 50;
申卖价一: 0.8575;
申卖量一: 15;
申买价一: 0.8574;
申买量一 : 1;
申买价二: 0.8500;
申买量二: 19;
申买价三: 0.8490;
申买量三: 15;
申买价四: 0.8415;
申买量四: 15;
申买价五: 0.8410;
申买量五: 5;
行情时间: 2020-08-17 14:56:59;
主力合约标识: 0;
状态码: E 01;
标的证券类型: EBS;
标的股票: 510050;
期权合约简称: 50ETF购12月2550;
振幅: 12.60;
最高价: 0.8980;
最低价: 0.8000;
成交量: 1186;
成交额: 10189200.00;
我们要想获取如最高价内容,我们必须记住最高价对应的索引值为39,这非常容易出错,因此我们可以在类中定义常量将其与索引值联系起来,如下所示:
# 期权合约字段定义
OCF_Buy_Amount = 0 ###_0 买量: 1;
OCF_BUY_PRICE = 1 ###_1 买价: 0.7877;
OCF_LATEST_PRICE = 2 ###_2 最新价: 0.7888;
OCF_SELL_PRICE = 3 ###_3 卖价: 0.7935;
OCF_SELL_AMOUNT = 4 ###_4 卖量: 25;
OCF_POSITION = 5 ###_5 持仓量: 1855;
OCF_INCREASE_PERCENT = 6 ###_6 涨幅: 13.82;
OCF_EXCERCISE_PRICE = 7 ###_7 行权价: 2.6500;
OCF_PREV_CLOSE = 8 ###_8 昨收价: 0.6695;
OCF_OPEN = 9 ###_9 开盘价: 0.7126;
OCF_LIMIT_UP = 10 ###_10 涨停价: 1.0273;
OCF_LIMIT_DOWN = 11 ###_11 跌停价: 0.3587;
OCF_SELL_PRICE_5 = 12 ###_12 申卖价五: 0.8029;
OCF_SELL_AMOUNT_5 = 13 ###_13 申卖量五: 10;
OCF_SELL_PRICE_4 = 14 ###_14 申卖价四: 0.7993;
OCF_SELL_AMOUNT_4 = 15 ###_15 申卖量四: 10;
OCF_SELL_PRICE_3 = 16 ###_16 申卖价三: 0.7977;
OCF_SELL_AMOUNT_3 = 17 ###_17 申卖量三: 10;
OCF_SELL_PRICE_2 = 18 ###_18 申卖价二: 0.7951;
OCF_SELL_AMOUNT_2 = 19 ###_19 申卖量二: 15;
OCF_SELL_PRICE_1 = 20 ###_20 申卖价一: 0.7935;
OCF_SELL_AMOUNT_1 = 21 ###_21 申卖量一: 25;
OCF_BUY_PRICE_1 = 22 ###_22 申买价一: 0.7877;
OCF_BUY_AMOUNT_1 = 23 ###_23 申买量一 : 1;
OCF_BUY_PRICE_2 = 24 ###_24 申买价二: 0.7875;
OCF_BUY_AMOUNT_2 = 25 ###_25 申买量二: 1;
OCF_BUY_PRICE_3 = 26 ###_26 申买价三: 0.7868;
OCF_BUY_AMOUNT_3 = 27 ###_27 申买量三: 15;
OCF_BUY_PRICE_4 = 28 ###_28 申买价四: 0.7867;
OCF_BUY_AMOUNT_4 = 29 ###_29 申买量四: 10;
OCF_BUY_PRICE_5 = 30 ###_30 申买价五: 0.7862;
OCF_BUY_AMOUNT_5 = 31 ###_31 申买量五: 10;
OCF_QUOTATION_TIME = 32 ###_32 行情时间: 2020-08-17 13:14:46;
OCF_MAIN_CONTRACT_ID = 33 ###_33 主力合约标识: 0;
OCF_STATE_CODE = 34 ###_34 状态码: T 01;
OCF_ASSET_BOND_TYPE = 35 ###_35 标的证券类型: EBS;
OCF_ASSET_STOCK = 36 ###_36 标的股票: 510050;
OCF_ABSTRACT = 37 ###_37 期权合约简称: 50ETF购12月2650;
OCF_AMPLITUDE = 38 ###_38 振幅: 11.38;
OCF_HIGHEST_PRICE = 39 ###_39 最高价: 0.7888;
OCF_LOWEST_PRICE = 40 ###_40 最低价: 0.7126;
OCF_VOLUME = 41 ###_41 成交量: 22;
OCF_AMOUNT = 42 ###_42 成交额: 162450.00;
获取期权标的实时行情
50ETF期权的标的物就是50ETF,我们可以通过如下方式获取其行情数据:
def demo(self):
option_sina_sse_underlying_spot_price_df = \\
ak.option_sina_sse_underlying_spot_price(code="sh510050")
keys = option_sina_sse_underlying_spot_price_df['字段']
vals = option_sina_sse_underlying_spot_price_df['值']
for i in range(len(keys)):
print('###0: 1=2;'.format(i, keys[i], vals[i]))
# 标的物字段
AF_BOND_ABST = 0 ###0: 证券简称=50ETF;
AF_OPEN = 1 ###1: 今日开盘价=3.352;
AF_PREV_CLOSE = 2 ###2: 昨日收盘价=3.343;
AF_LATEST_PRICE = 3 ###3: 最近成交价=3.419;
AF_HIGHEST_PRICE = 4 ###4: 最高成交价=3.451;
AF_LOWEST_PRICE = 5 ###5: 最低成交价=3.348;
AF_BUY_PRICE = 6 ###6: 买入价=3.417;
AF_SELL_PRICE = 7 ###7: 卖出价=3.418;
AF_VOLUME = 8 ###8: 成交数量=995788481;
AF_AMOUNT = 9 ###9: 成交金额=3390289098.000;
AF_BUY_1_VOLUME = 10 ###10: 买数量一=7100;
AF_BUY_1_PRICE = 11 ###11: 买价位一=3.417;
AF_BUY_2_VOLUME = 12 ###12: 买数量二=171200;
AF_BUY_2_PRICE = 13 ###13: 买价位二=3.416;
AF_BUY_3_VOLUME = 14 ###14: 买数量三=700900;
AF_BUY_3_PRICE = 15 ###15: 买价位三=3.415;
AF_BUY_4_VOLUME = 16 ###16: 买数量四=947100;
AF_BUY_4_PRICE = 17 ###17: 买价位四=3.414;
AF_BUY_5_VOLUME = 18 ###18: 买数量五=203600;
AF_BUY_5_PRICE = 19 ###19: 买价位五=3.413;
AF_SELL_1_VOLUME = 20 ###20: 卖数量一=225000;
AF_SELL_1_PRICE = 21 ###21: 卖价位一=3.418;
AF_SELL_2_VOLUME = 22 ###22: 卖数量二=1251500;
AF_SELL_2_PRICE = 23 ###23: 卖价位二=3.420;
AF_SELL_3_VOLUME = 24 ###24: 卖数量三=280500;
AF_SELL_3_PRICE = 25 ###25: 卖价位三=3.421;
AF_SELL_4_VOLUME = 26 ###26: 卖数量四=75400;
AF_SELL_4_PRICE = 27 ###27: 卖价位四=3.422;
AF_SELL_5_VOLUME = 28 ###28: 卖数量五=249400;
AF_SELL_5_PRICE = 29 ###29: 卖价位五=3.423;
AF_QUOTATION_DATE = 30 ###30: 行情日期=2020-08-17;
AF_QUOTATION_TIME = 31###31: 行情时间=14:59:17;
AF_STOP_STATE = 32 ###32: 停牌状态=00;
其运行结果如下所示:
###0: 证券简称=50ETF;
###1: 今日开盘价=3.352;
###2: 昨日收盘价=3.343;
###3: 最近成交价=3.418;
###4: 最高成交价=3.451;
###5: 最低成交价=3.348;
###6: 买入价=3.419;
###7: 卖出价=3.420;
###8: 成交数量=998561281;
###9: 成交金额=3399768663.000;
###10: 买数量一=55600;
###11: 买价位一=3.419;
###12: 买数量二=494600;
###13: 买价位二=3.418;
###14: 买数量三=411800;
###15: 买价位三=3.417;
###16: 买数量四=812000;
###17: 买价位四=3.416;
###18: 买数量五=672900;
###19: 买价位五=3.415;
###20: 卖数量一=630900;
###21: 卖价位一=3.420;
###22: 卖数量二=55000;
###23: 卖价位二=3.421;
###24: 卖数量三=174000;
###25: 卖价位三=3.422;
###26: 卖数量四=834600;
###27: 卖价位四=3.423;
###28: 卖数量五=26800;
###29: 卖价位五=3.424;
###30: 行情日期=2020-08-17;
###31: 行情时间=15:00:23;
###32: 停牌状态=00;
获取Greeks信息
代码如下所示:
def demo(self):
greeks = ak.option_sina_sse_greeks(
code="10002513")
keys = greeks['字段']
vals = greeks['值']
for i in range(len(keys)):
print('# 0: 1=2;'.format(i, keys[i], vals[i]))
注意:在上面的代码中,code='10002513’要取一个市场上有的期权编号。运行结果如下所示:
# 0: 期权合约简称=50ETF购12月2550;
# 1: 成交量=1186;
# 2: Delta=0.9746;
# 3: Gamma=0.1057;
# 4: Theta=-0.1443;
# 5: Vega=0.12;
# 6: 隐含波动率=0.0008;
# 7: 最高价=0.8980;
# 8: 最低价=0.8000;
# 9: 交易代码=510050C2012M02550;
# 10: 行权价=2.5500;
# 11: 最新价=0.8600;
# 12: 理论价值=0.9092;
同样,为了使用方便,我们定义如下Geeks的字段:
# 期权Greeks字段定义
GK_ABST = 0 # 0: 期权合约简称=50ETF购12月2550;
GK_VOLUME = 1# 1: 成交量=1186;
GK_DELTA = 2 # 2: Delta=0.9746;
GK_GAMMA = 3 # 3: Gamma=0.1057;
GK_THETA = 4 # 4: Theta=-0.1443;
GK_VEGA = 5 # 5: Vega=0.12;
GK_LATENT_VOLALITY = 6 # 6: 隐含波动率=0.0008;
GK_HIGHEST_PRICE = 7 # 7: 最高价=0.8980;
GK_LOWEST_PRICE = 8 # 8: 最低价=0.8000;
GK_TRADE_CODE = 9 # 9: 交易代码=510050C2012M02550;
GK_EXERCISE_PRICE = 10 # 10: 行权价=2.5500;
GK_LATEST_PRICE = 11 # 11: 最新价=0.8600;
GK_THEORY_PRICE = 12 # 12: 理论价值=0.9092;
有了上述的API调用,我们就可以获取50ETF期权的各种信息了。但是如果我们想使用机器学习或深度学习算法,我们就必须获取历史行情数据,在下一篇博文中,我们将介绍获取50ETF期权历史行情数据的方法。
以上是关于利用akshare读取50EFF期权1的主要内容,如果未能解决你的问题,请参考以下文章