本文所用文件的百度云链接:

链接:https://pan.baidu.com/s/15-qbrbtRs4frup24Y1i5og 
提取码:pm2c 

协方差、相关矩阵、相关系数

通过两组统计数据计算而得的协方差可以评估这两组统计数据的相似程度.

样本:

A = [a1, a2, a3 ... an]
B = [b1, b2, b3 ... bn]

求均值:

ave_A = np.mean(A)
ave_B = np.mean(B)

求离差:

dev_A = [a1, a2, a3 .. an] - ave_A
dev_B = [b1, b2, b3 .. bn] - ave_B

协方差:

cov_ab = np.mean(dev_A * dev_B)
cov_ba = np.mean(dev_B * dev_A)

协方差可以简单的反应两组统计样本的相关性. 协方差值为正, 则为正相关; 若值为负, 则为负相关. 绝对值越大相关性越强.

案例: 统计两只股票的相关程度. vale.csv bhp.csv

# 计算两组数据的协方差
vale_mean = np.mean(vale_closing_prices)
bhp_mean = np.mean(bhp_closing_prices)
dev_vale = vale_closing_prices - vale_mean
dev_bhp = bhp_closing_prices - bhp_mean
cov = np.mean(dev_vale * dev_bhp)
print(cov)

相关系数

相关系数是一个[-1, 1]之间的数. 若相关系数越接近于1, 则表示两组样本越正相关. 若相关系数越接近于-1, 则表示两组样本越负相关. 若相关系数越接近于0, 则表示两组样本没啥大关系.

相关系数的计算方式 (协方差除以两组样本标准差之积):

cov_ab / (std_a * std_b)  a对于b的相关系数
cov_ba / (std_b * std_a)  b对于a的相关系数

案例:

# 计算两支股票的相关系数
k = cov / (np.std(vale_closing_prices) * \
			np.std(bhp_closing_prices))
print('K:', k)

相关矩阵

# 获取相关矩阵, 该矩阵中包含相关系数
# 所以,当需要获取两组数据的相关系数时,
# 可以通过该矩阵得到相关系数的值.
m = np.corrcoef(vale_prices, bhp_prices)
# 获取相关矩阵的分子矩阵 (协方差矩阵)
cm = np.cov(a, b)
"""
协方差示例
"""
import numpy as np
import matplotlib.pyplot as mp
import datetime as dt
import matplotlib.dates as md

# 当numpy解析文本时,将会把第一列中的每个字符串
# 都传给函数进行处理, 将处理完毕后的返回值
# 转成需要的M8[D]类型
def dmy2ymd(dmy):
	dmy = str(dmy, encoding='utf-8')
	# 把dmy转成日期对象
	d = dt.datetime.strptime(dmy, '%d-%m-%Y')
	t = d.date()
	s = t.strftime('%Y-%m-%d')
	return s

# 加载文件
dates, vale_closing_prices = np.loadtxt(
	'../da_data/vale.csv', delimiter=',', 
	usecols=(1,6), unpack=True, 
	dtype='M8[D], f8' , 
	converters={1:dmy2ymd})

bhp_closing_prices = np.loadtxt(
	'../da_data/bhp.csv', delimiter=',', 
	usecols=(6,), unpack=True)


# 绘制收盘价
mp.figure('COV DEMO', facecolor='lightgray')
mp.title('COV DEMO', fontsize=18)
mp.xlabel('Date', fontsize=14)
mp.ylabel('Price', fontsize=14)
mp.tick_params(labelsize=10)
mp.grid(linestyle=':')
# 设置主刻度定位器为每周一
ax = mp.gca()
ax.xaxis.set_major_locator(
	md.WeekdayLocator(byweekday=md.MO))
ax.xaxis.set_major_formatter(
	md.DateFormatter('%Y/%m/%d'))

# 把M8[D]转为matplotlib识别的date类型
dates = dates.astype(md.datetime.datetime)
mp.plot(dates, vale_closing_prices, 
	color='dodgerblue', linewidth=1,
	linestyle='--', label='vale prices')
mp.plot(dates, bhp_closing_prices, 
	color='orangered', linewidth=1,
	linestyle='--', label='bhp prices')

# 计算两组数据的协方差
vale_mean = np.mean(vale_closing_prices)
bhp_mean = np.mean(bhp_closing_prices)
dev_vale = vale_closing_prices - vale_mean
dev_bhp = bhp_closing_prices - bhp_mean
cov = np.mean(dev_vale * dev_bhp)
print('COV:', cov)

# 计算两支股票的相关系数
k = cov / (np.std(vale_closing_prices) * \
			np.std(bhp_closing_prices))
print('K:', k)

# 相关矩阵
m = np.corrcoef(vale_closing_prices, 
				bhp_closing_prices)
print(m)
print(np.cov(vale_closing_prices, bhp_closing_prices))

mp.legend()
# 自动格式化x轴的日期输出
mp.gcf().autofmt_xdate()
mp.show()

在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐