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']? # 三大期貨指數(shù)
# IF_IH = ['IF','IH']
# IF_IC = ['IF','IC']
# IH_IC = ['IH','IC']
IF = 'IF'
IH = 'IH'
IC = 'IC'
# 定義函數(shù):得到投資組合x(chóng)從時(shí)間start到時(shí)間end的日收益率序列(x:group? start:20190101, end:20190401)
def get_returndaily(x,start,end):
#:step1:先用交易日日歷得到從時(shí)間start到時(shí)間end的交易日日期
? ? from CAL.PyCAL import *
? ? data=DataAPI.TradeCalGet(exchangeCD=u"XSHG",beginDate=str(start),endDate=str(end),field=['calendarDate','isOpen'])? ? ? ? ? ? ? ? ? ?
? ? # DataAPI.TradeCalGet即交易所交易日歷函數(shù)
? ? data = data[data['isOpen'] == 1]
? ? date= map(lambda x: x[0:4]+x[5:7]+x[8:10], data['calendarDate'].values.tolist())
? ? # 從時(shí)間start到時(shí)間end的每個(gè)交易日日期蝇刀,得到后存為列表date
# step2:調(diào)用投資組合x(chóng)每只股票每個(gè)交易日的市值以及收盤(pán)價(jià)
? ? 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列表里面依次定位取第幾個(gè)日子
? ? ? ? inf1=DataAPI.MktEqudAdjGet(tradeDate=date[i],ticker=x,field=u"ticker,closePrice").set_index('ticker')? # 前一個(gè)交易日的收盤(pán)價(jià)
? ? ? ? inf2=DataAPI.MktEqudAdjGet(tradeDate=date[i+1],ticker=x,field=u"ticker,marketValue,closePrice").set_index('ticker')? # 當(dāng)前交易日的收盤(pán)價(jià)和市值
? ? ? ? # 將以上兩個(gè)表橫向合并成一張有股票代碼惧财、市值甫何、上個(gè)交易日收盤(pán)價(jià)和當(dāng)前交易日收盤(pán)價(jià)組成的表Return
? ? ? ? Return=pd.concat([inf2,inf1],axis=1)
? ? ? ? # print date[i+1]
? ? ? ? # print Return
? ? # step3:計(jì)算每只股票收益率和市值加權(quán)的權(quán)重以及兩者的乘積
? ? ? ? # 每只股票權(quán)重不等
? ? ? ? """
? ? ? ? Return.columns=['Weight','Return','WReturn']? # 改下表的列名稱(chēng)(就是第一行的字段)浅浮,下面分別計(jì)算各列數(shù)據(jù)
? ? ? ? Return['Weight']=Return['Weight']/Return['Weight'].sum() # 按市值在該組總市值占比分配權(quán)重
? ? ? ? Return['Return']=Return['Return']/Return['WReturn']-1? ? # 即定義出三者邏輯運(yùn)算關(guān)系
? ? ? ? Return['WReturn']=Return['Weight']*Return['Return']? ? ? # 同上陷嘴,這個(gè)WReturn即我們需要的個(gè)股日收益率表
? ? ? ? returndaily[i]=Return['WReturn'].sum()? ? ? ? ? ? ? ? ? # 按日依次匯總得出組合的日收益率表returndaily
? ? ? ? #? ? Return['Return']=Return['Return']/Return['Return']-1? ? # 即定義出三者邏輯運(yùn)算關(guān)系? ? ? ?
? ? ? ? """
? ? ? ? # 每只股票等權(quán)重
? ? ? ? Return.columns=['Weight','Return','WReturn']
? ? ? ? Return['Weight'] = 1.0
? ? ? ? Return['Return']=Return['Return']/Return['WReturn']-1? ? # 即定義出三者邏輯運(yùn)算關(guān)系
? ? ? ? Return['WReturn']=Return['Weight']*Return['Return']? ? ? # 同上罕邀,這個(gè)WReturn即我們需要的個(gè)股日收益率表
? ? ? ? returndaily[i]=Return['WReturn'].sum()? ? ? ?
? ? return returndaily
# 定義函數(shù):得到期貨指數(shù)y從時(shí)間start到時(shí)間end的日收益率序列(y:IF,IH,IC? start:20190101, end:20190401)
def get_returnfutures_daily(y,start,end):
# step1:先用交易日日歷得到從時(shí)間start到時(shí)間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:調(diào)用指數(shù)y收盤(pán)價(jià)用來(lái)計(jì)算收益率
? ? 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列表里面依次定位取第幾個(gè)日子
? ? ? ? # 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')? # 這兩個(gè)返回空值玄呛,有時(shí)間再研究
? ? ? ? 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:計(jì)算每種期貨指數(shù)收益率和持倉(cāng)量加權(quán)的權(quán)重以及兩者的乘積
? ? ? ? # 如果對(duì)沖指數(shù)包含多個(gè)期貨指數(shù)
? ? ? ? if type(y) is list:?
? ? ? ? ? ? Return.columns=['Weight','Return','WReturn'] # 改下表的列名稱(chēng)(就是第一行的字段)诬留,下面分別計(jì)算各列數(shù)據(jù)
? ? ? ? ? ? Return['Weight']=Return['Weight']/Return['Weight'].sum() # 按市值在該組總市值占比分配權(quán)重
? ? ? ? ? ? Return['Return']=Return['Return']/Return['WReturn']-1? ? # 即定義出三者邏輯運(yùn)算關(guān)系
? ? ? ? ? ? Return['WReturn']=Return['Weight']*Return['Return']? ? ? # 同上揩环,這個(gè)WReturn即我們需要的個(gè)股日收益率表
? ? ? ? ? ? returndaily[i]=Return['WReturn'].sum()? ? ? ? ? ? ? ? ? # 按日依次匯總得出組合的日收益率表returndaily
? ? ? ? # 如果只用一種期貨指數(shù)對(duì)沖
? ? ? ? else:
? ? ? ? ? ? Return.columns = ['Weight','Return','WReturn']
? ? ? ? ? ? # Return['Weight'] = 1.0/(len(date)-1)? # 等權(quán)
? ? ? ? ? ? Return['Return'] = Return['Return']/Return['WReturn']-1
? ? ? ? ? ? # Return['WReturn'] = Return['Weight']*Return['Return']
? ? ? ? ? ? returndaily[i] = Return['Return'].sum()
? ? return returndaily? ?
# 定義函數(shù):填充ndarray中的nan值
def fill_ndarray(t1):
? ? nan_num = np.count_nonzero(t1==t1)
? ? if nan_num != 0: # 不為0,說(shuō)明當(dāng)前這一列中有nan
? ? ? ? temp_not_nan=t1[t1==t1] # 當(dāng)前不為nan的array
? ? ? ? # 選中當(dāng)前為nan的位置,把值賦值為該列除nan以外的數(shù)的均值
? ? ? ? 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
# 各個(gè)指數(shù)收益率
# IF_IH_IC_ret = get_returnfutures_daily(IF_IH_IC,20190101,20190401)? # 三大指數(shù)
# 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)
# 定義相關(guān)系數(shù)函數(shù)
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)
? ? # 計(jì)算相關(guān)系數(shù)搔弄,保留四位小數(shù)
? ? # 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)
? ? # 繪制散點(diǎn)圖
#? ? 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)? # 組合的各種相關(guān)系數(shù)
group2_corr = corr(group2_ret)
group3_corr = corr(group3_ret)
print group1_corr
print "*"*100
print group2_corr
print "*"*100
print group3_corr
# 結(jié)論:有結(jié)果可知,三組股票均與IC的相關(guān)性最高丰滑。當(dāng)然了顾犹,在與指數(shù)池做相關(guān)性分析時(shí),發(fā)現(xiàn):第二組用IH\IC混合對(duì)沖較好褒墨,由于相對(duì)復(fù)雜炫刷,時(shí)間關(guān)系,這里不深入研究郁妈,日后再探討浑玛。
# 下面是求貝塔的過(guò)程
cov_mat = np.cov(group3_ret,IC_ret)
print cov_mat
# 協(xié)方差
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? # 期指對(duì)沖的手?jǐn)?shù)
print 'N=', N