美文网首页
2019-04-17

2019-04-17

作者: 思过崖阿阳 | 来源:发表于2019-04-17 16:37 被阅读0次

    NSLog(@"hello world");        

    # -*- coding: utf-8 -*-

    import numpy as np

    import pandas as pd

    from matplotlib import pylab as plt

    import math

    group1 = ['300460', '002619', '603809','000426','002600','000008','002217','300652','600505','002078']

    group2 =['603533','603928','600693','603811','300613','300621','000988','600839','300502','000933','600685','002907','002922',

            '600284','601998','000505','600726','000591','002798','601127']

    group3 = ['300697', '300035', '603322','601229','002681','002121','600615','600367','002695','002301','300130','603920','300325',

              '300468','002061','002897','002014','000628','300034','002023','002199','000882','000401','002598','300558','600691',

              '300392','601901','300353','002077']

    # IF_IH_IC = ['IF','IH','IC']  # 三大期货指数

    # IF_IH = ['IF','IH']

    # IF_IC = ['IF','IC']

    # IH_IC = ['IH','IC']

    IF = 'IF'

    IH = 'IH'

    IC = 'IC'

    # 定义函数:得到投资组合x从时间start到时间end的日收益率序列(x:group  start:20190101, end:20190401)

    def get_returndaily(x,start,end):

    #:step1:先用交易日日历得到从时间start到时间end的交易日日期

        from CAL.PyCAL import *

        data=DataAPI.TradeCalGet(exchangeCD=u"XSHG",beginDate=str(start),endDate=str(end),field=['calendarDate','isOpen'])                   

        # DataAPI.TradeCalGet即交易所交易日历函数

        data = data[data['isOpen'] == 1]

        date= map(lambda x: x[0:4]+x[5:7]+x[8:10], data['calendarDate'].values.tolist())

        # 从时间start到时间end的每个交易日日期,得到后存为列表date

    # step2:调用投资组合x每只股票每个交易日的市值以及收盘价

        returndaily=np.zeros(len(date)-1)

        for i in range(len(date)-1):    # 即 i=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11...]为了从date列表里面依次定位取第几个日子

            inf1=DataAPI.MktEqudAdjGet(tradeDate=date[i],ticker=x,field=u"ticker,closePrice").set_index('ticker')  # 前一个交易日的收盘价

            inf2=DataAPI.MktEqudAdjGet(tradeDate=date[i+1],ticker=x,field=u"ticker,marketValue,closePrice").set_index('ticker')  # 当前交易日的收盘价和市值

            # 将以上两个表横向合并成一张有股票代码、市值、上个交易日收盘价和当前交易日收盘价组成的表Return

            Return=pd.concat([inf2,inf1],axis=1)

            # print date[i+1]

            # print Return

        # step3:计算每只股票收益率和市值加权的权重以及两者的乘积

            # 每只股票权重不等

            """

            Return.columns=['Weight','Return','WReturn']  # 改下表的列名称(就是第一行的字段),下面分别计算各列数据

            Return['Weight']=Return['Weight']/Return['Weight'].sum() # 按市值在该组总市值占比分配权重

            Return['Return']=Return['Return']/Return['WReturn']-1    # 即定义出三者逻辑运算关系

            Return['WReturn']=Return['Weight']*Return['Return']      # 同上,这个WReturn即我们需要的个股日收益率表

            returndaily[i]=Return['WReturn'].sum()                  # 按日依次汇总得出组合的日收益率表returndaily

            #    Return['Return']=Return['Return']/Return['Return']-1    # 即定义出三者逻辑运算关系       

            """

            # 每只股票等权重

            Return.columns=['Weight','Return','WReturn']

            Return['Weight'] = 1.0

            Return['Return']=Return['Return']/Return['WReturn']-1    # 即定义出三者逻辑运算关系

            Return['WReturn']=Return['Weight']*Return['Return']      # 同上,这个WReturn即我们需要的个股日收益率表

            returndaily[i]=Return['WReturn'].sum()       

        return returndaily

    # 定义函数:得到期货指数y从时间start到时间end的日收益率序列(y:IF,IH,IC  start:20190101, end:20190401)

    def get_returnfutures_daily(y,start,end):

    # step1:先用交易日日历得到从时间start到时间end的交易日日期

        from CAL.PyCAL import *

        data=DataAPI.TradeCalGet(exchangeCD=u"XSHG",beginDate=str(start),endDate=str(end),field=['calendarDate','isOpen'])                   

        data = data[data['isOpen'] == 1]

        date= map(lambda x: x[0:4]+x[5:7]+x[8:10], data['calendarDate'].values.tolist())

        # step2:调用指数y收盘价用来计算收益率

        returndaily=np.zeros(len(date)-1)

        for i in range(len(date)-1):  # 即 i=[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11...]为了从date列表里面依次定位取第几个日子

            # inf1= DataAPI.MktFutdGet(tradeDate=date[i],ticker=y,field=u"ticker,closePrice",pandas="1").set_index('ticker')   

            # inf2= DataAPI.MktFutdGet(tradeDate=date[i+1],ticker=y,field=u"ticker,openInt,closePrice",pandas="1").set_index('ticker')  # 这两个返回空值,有时间再研究

            inf1 = DataAPI.MktMFutdGet(tradeDate=date[i],mainCon=u"1",contractMark=u"",contractObject=y,field=u"ticker,closePrice",pandas="1").set_index('ticker')

            inf2 = DataAPI.MktMFutdGet(tradeDate=date[i+1],mainCon=u"1",contractMark=u"",contractObject=y,field=u"ticker,openInt,closePrice",pandas="1").set_index('ticker')

            Return=pd.concat([inf2,inf1],axis=1)

            # step3:计算每种期货指数收益率和持仓量加权的权重以及两者的乘积

            # 如果对冲指数包含多个期货指数

            if type(y) is list: 

                Return.columns=['Weight','Return','WReturn'] # 改下表的列名称(就是第一行的字段),下面分别计算各列数据

                Return['Weight']=Return['Weight']/Return['Weight'].sum() # 按市值在该组总市值占比分配权重

                Return['Return']=Return['Return']/Return['WReturn']-1    # 即定义出三者逻辑运算关系

                Return['WReturn']=Return['Weight']*Return['Return']      # 同上,这个WReturn即我们需要的个股日收益率表

                returndaily[i]=Return['WReturn'].sum()                  # 按日依次汇总得出组合的日收益率表returndaily

            # 如果只用一种期货指数对冲

            else:

                Return.columns = ['Weight','Return','WReturn']

                # Return['Weight'] = 1.0/(len(date)-1)  # 等权

                Return['Return'] = Return['Return']/Return['WReturn']-1

                # Return['WReturn'] = Return['Weight']*Return['Return']

                returndaily[i] = Return['Return'].sum()

        return returndaily   

    # 定义函数:填充ndarray中的nan值

    def fill_ndarray(t1):

        nan_num = np.count_nonzero(t1==t1)

        if nan_num != 0: # 不为0,说明当前这一列中有nan

            temp_not_nan=t1[t1==t1] # 当前不为nan的array

            # 选中当前为nan的位置,把值赋值为该列除nan以外的数的均值

            t1[np.isnan(t1)] = temp_not_nan.mean()

        return t1

    # 股票组合收益率       

    group1_ret = get_returndaily(group1,20190101,20190401)

    group2_ret = get_returndaily(group2,20190101,20190401)

    group3_ret = get_returndaily(group3,20190101,20190401)

    print group3_ret

    print "*"*100

    # 各个指数收益率

    # IF_IH_IC_ret = get_returnfutures_daily(IF_IH_IC,20190101,20190401)  # 三大指数

    # IF_IH_ret = get_returnfutures_daily(IF_IH,20190101,20190401)

    # IF_IC_ret = get_returnfutures_daily(IF_IC,20190101,20190401)

    # IH_IC_ret = get_returnfutures_daily(IH_IC,20190101,20190401)

    IF_ret = get_returnfutures_daily(IF,20190101,20190401)

    IF_ret = fill_ndarray(IF_ret)

    IH_ret = get_returnfutures_daily(IH,20190101,20190401)

    IH_ret = fill_ndarray(IH_ret)

    IC_ret = get_returnfutures_daily(IC,20190101,20190401)

    IC_ret = fill_ndarray(IC_ret)

    print IC_ret

    print type(IC_ret)

    # 定义相关系数函数

    def corr(stock_list):    # stock_list:股票组合收益率

        # 期货收益率序列

        # IF_IH_IC_series = pd.Series(IF_IH_IC_ret)

        # IF_IH_series = pd.Series(IF_IH_ret)

        # IF_IC_series = pd.Series(IF_IC_ret)

        # IH_IC_series = pd.Series(IH_IC_ret)

        IF_ret_series = pd.Series(IF_ret)

        IH_ret_series = pd.Series(IH_ret)

        IC_ret_series = pd.Series(IC_ret)

        # 股票收益率序列

        stock_group = pd.Series(stock_list)

        # 计算相关系数,保留四位小数

        # corr_IF_IH_IC = round(stock_group.corr(IF_IH_IC_series), 4)

        # corr_IF_IH = round(stock_group.corr(IF_IH_series), 4)

        # corr_IF_IC = round(stock_group.corr(IF_IC_series), 4)

        # corr_IH_IC = round(stock_group.corr(IH_IC_series), 4)

        corr_IF = round(stock_group.corr(IF_ret_series), 4)

        corr_IH = round(stock_group.corr(IH_ret_series), 4)

        corr_IC = round(stock_group.corr(IC_ret_series), 4)

        # 绘制散点图

    #    plt.scatter(stock_list, IF_IH_IC_ret)

    #    plt.title('corr_IF_IH_IC :' + str(corr_IF_IH_IC), fontproperties='SimHei')

    #    print('corr_IF_IH_IC :', corr_IF_IH_IC)

    #    plt.show()

    #    plt.scatter(stock_list, IF_IH_ret)

    #    plt.title('corr_IF_IH :' + str(corr_IF_IH), fontproperties='SimHei')

    #    print('corr_IF_IH :', corr_IF_IH)

    #    plt.show()

    #    plt.scatter(stock_list, IF_IC_ret)

    #    plt.title('corr_IF_IC :' + str(corr_IF_IC), fontproperties='SimHei')

    #    print('corr_IF_IC :', corr_IF_IC)

    #    plt.show()

    #    plt.scatter(stock_list, IH_IC_ret)

    #    plt.title('corr_IH_IC :' + str(corr_IH_IC), fontproperties='SimHei')

    #    print('corr_IH_IC :', corr_IH_IC)

    #    plt.show()

        plt.scatter(stock_list, IF_ret)

        plt.title('corr_IF :' + str(corr_IF), fontproperties='SimHei')

        print('corr_IF :', corr_IF)

        plt.show()

        plt.scatter(stock_list, IH_ret)

        plt.title('corr_IH :' + str(corr_IH), fontproperties='SimHei')

        print('corr_IH :', corr_IH)

        plt.show()

        plt.scatter(stock_list, IC_ret)

        plt.title('corr_IC :' + str(corr_IC), fontproperties='SimHei')

        print('corr_IC :', corr_IC)

        plt.show()   

        return corr_IF,corr_IH,corr_IC

    group1_corr = corr(group1_ret)  # 组合的各种相关系数

    group2_corr = corr(group2_ret)

    group3_corr = corr(group3_ret)

    print group1_corr

    print "*"*100

    print group2_corr

    print "*"*100

    print group3_corr

    # 结论:有结果可知,三组股票均与IC的相关性最高。当然了,在与指数池做相关性分析时,发现:第二组用IH\IC混合对冲较好,由于相对复杂,时间关系,这里不深入研究,日后再探讨。

    # 下面是求贝塔的过程

    cov_mat = np.cov(group3_ret,IC_ret)

    print cov_mat

    # 协方差

    cov = cov_mat[1,1]

    print 'cov(group3_ret,IC_ret) =', cov

    print "var =", IC_ret.var()  # 方差

    # 得出贝塔

    B=cov/IC_ret.var()

    print 'β =', B

    # 期指总市值

    def matketValue(y, date):

        inf = DataAPI.MktMFutdGet(tradeDate=date,mainCon=u"1",contractMark=u"",contractObject=y,field=u"ticker,closePrice",pandas="1").set_index('ticker')

        closeprice = inf.values

        tol_index_equd = closeprice * 300

        return tol_index_equd

    # 股票组合总市值(废弃)

    # def group_matketValue(group, date):

    #    group_equd = 0

    #    for stock in group:

    #        equd=DataAPI.MktEqudAdjGet(tradeDate=date,ticker=stock,field=u"ticker,marketValue").set_index('ticker')

    #        equd = equd["marketValue"].values

    #        # print equd

    #        group_equd += equd

    #    return group_equd

    Vs = len(group3)*1000000

    Vf = matketValue(IC, '20190401')

    print 'Vs=', Vs  # 股票组合市值

    print 'Vf=', Vf  # 一手期指市值

    N = B*Vs/Vf  # 期指对冲的手数

    print 'N=', N

    相关文章

      网友评论

          本文标题:2019-04-17

          本文链接:https://www.haomeiwen.com/subject/xibnwqtx.html