2019-04-17

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342