利用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期权历史行情数据的方法。

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值