近期的市场表现是真的差啊,我想着利用业余时间把市场的指数给抓下来,并分析一下相关性,看看沪深指数之间是否存在某种关联。获取指数数据的方法有很多种,可以借由一些第三方平台获取,比如新浪财经,腾讯财经接口等等,也可以通过聚宽之类平台提供的API来获取。我这次就先通过网页来抓取一下。
python非常适合从网页抓取数据,最简单的方法就是使用requests包。
首先找到上证指数历史数据网页,我这里是在搜狐网上找到了一个链接:上证指数(000001) - 历史行情 - 股票行情中心 - 搜狐证券 (sohu.com)
通过浏览器的网络分析功能,可以看到查询请求的完整地址:
其中,对我而言,只有三个参数需要修改,code,start和end,分别代表指数的代码以及查新的起止时间,我在程序中只要修改成我自己需要的就行了,代码如下:
# 抓取指数历史数据
def get_index_history(index_code, start, end):
"""从搜狐网上抓取的指数数据"""
url = 'https://q.stock.sohu.com/hisHq?code=zs_{}&start={}&end={}&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp&r=0.7795196987720288&0.6939581161974786'.format(
index_code, start, end
)
import requests
response = requests.get(url)
response.encoding = 'gbk'
data = response.text.replace('historySearchHandler(','')
return data[:-2] # 过滤掉最后一个')'
if __name__ == '__main__':
data = get_index_history('000001', '20210615', '20231017')
print(data)
可以看到,数据已经被取到了,我们去除掉源数据的前后的字符串,获取到其中的JSON部分。
接下来,我获取到上证指数,深成指数和创业板指数,并转成pandas DataFrame,使用numpy的corrcoef方法获取对应指数的相关性,代码如下:
def analysis():
df_h = [] # 沪指历史
df_s = [] # 深指历史
df_c = [] # 创业板指历史
h_data = get_index_history('000001', '20210615', '20231017')
df_h = convert(h_data)
s_data = get_index_history('399001', '20210615', '20231017')
df_s = convert(s_data)
c_data = get_index_history('399006', '20210615', '20231017')
df_c = convert(c_data)
# 沪指和深指的相关性计算
r_hs = np.corrcoef(df_h['close'].astype('float'), df_s['close'].astype('float'))
print(r_hs)
# 沪指和创业板指的相关性计算
r_hc = np.corrcoef(df_h['close'].astype('float'), df_c['close'].astype('float'))
print(r_hc)
# 深指和创业板指的相关性计算
r_sc = np.corrcoef(df_s['close'].astype('float'), df_c['close'].astype('float'))
print(r_sc)
h_list = convert_list(h_data)
s_list = convert_list(s_data)
c_list = convert_list(c_data)
df = pd.DataFrame({'h':h_list, 's':s_list, 'c':c_list})
print(df)
r2 = np.corrcoef(df)
print(r2)
fig = sns.pairplot(df)
plt.show()
fig.savefig('test.png', dpi = 400) # seaborn保存图片
沪指和深指的相关性矩阵为:
[[1. 0.93048987]
[0.93048987 1. ]]
可见,沪深指数之间的相关性是比较高的。
沪指和创业板指数的相关性矩阵为:
[[1. 0.8779242]
[0.8779242 1. ]]
可见,沪指和创业板指数之间的相关性并不如沪深指数之间高。
而深成指和创业板指数的相关性矩阵为:
[[1. 0.98847916]
[0.98847916 1. ]]
这个就太高了,快接近1了,说明深成指和创业板指数高度相关的,换成人话就是,要涨一起涨,要跌一起跌。
用seaborn画出三个指数的相关性图:
可以看到,沪指和创业板指数之间是比较松散,而深成指和创业板几乎都成一条直线了,可见他们之间具有高度的相关性。从热力图上也看出来:
这个结论说明什么呢?它告诉我们,如果买了深成指的话,就不需要再去购买创业板了,因为他们同涨同跌,具有高度的相关性,达不到分散风险的目的,相当于把鸡蛋都放到了一个篮子里。
下面我做一个简单的实验,由于指数不能直接买卖,我用相对应的ETF来进行操作。
首先我找出了两个负相关的指数,沪深300指数和沪企债30指数。并获取到他们的最近400个交易日的价格指数,并计算了这两个指数的相关性矩阵:
[[1.0 -0.6161445857427094]
[-0.6161445857427094 1.0]]
可以看到,这两个指数是负相关的,而且负相关程度还不小,跟我们的常识还是有点接近的,一般来说,股市下跌的时候,债市会好一些。
我选择了510300作为沪深指数的代表ETF,至于沪企债30指数对应的ETF,我不是很了解,问了一下百度新推出的文心一言,告诉我是511020:)
下面就是我的实验过程:
可以看到,我的如果只买沪深300的话,这一两年来,亏损接近20%,而我如果一直买上证企业债ETF的话,收益大约4.4%,而如果我各买一半的话,大约亏损7%。
沪深指数ETF的收益
企业债ETF的收益
组合后的收益
同时放在一起比较,可以明显看出三者的区别
这就是组合投资,也就是风险对冲,在牛市中这种方法会降低我们的收益,但是在熊市中,也会同样分散我们的风险,使得我们在市场中生存得更久,
当然,通过有效的组合和择时,还可以得到更小的亏损,甚至盈利,至于组合或者什么时候择时,就是八仙过海各显神通了,但至少不要都把鸡蛋放一个篮子里,都放沪深指数,分散不了风险。