''' 協方差、相關矩陣、相關系數----評估兩組樣本相似度 協方差:通過兩組統計數據計算而得到的協方差可以評估這兩組統計數據的相似程度,值為正,則正相關,值為負,則負相關,絕對值越大則相關性越強 相關系數:協方差除以兩組統計樣本標准差之積,是一個[-1,1]之間的數,該結果稱為兩組統計樣本的相關系數。 ---若相關系數越接近於1,表示兩組樣本正相關性越強; ---若相關系數越接近於-1,表示兩組樣本負相關性越強; ---若相關系數越接近於0,表示兩組樣本越不相關; 相關矩陣:相關系數矩陣,numpy提供了相關API,可以方便的獲取兩組數據的相關系數 ---np.corrcoef(A,B):可以計算兩組樣本的相關系數,但是返回的是2*2的矩陣 ''' import matplotlib.pyplot as mp import numpy as np import datetime as dt import matplotlib.dates as md # 日期轉化函數 def dmy2ymd(dmy): # 把dmy格式的字符串轉化成ymd格式的字符串 dmy = str(dmy, encoding='utf-8') d = dt.datetime.strptime(dmy, '%d-%m-%Y') d = d.date() ymd = d.strftime('%Y-%m-%d') return ymd dates, bhp_closing_prices = \ np.loadtxt('./da_data/bhp.csv', delimiter=',', usecols=(1, 6), unpack=True, dtype='M8[D], f8', converters={1: dmy2ymd}) # converters為轉換器,運行時先執行,其中1表示時間所在的列索引號 vale_closing_prices = \ np.loadtxt('./da_data/vale.csv', delimiter=',', usecols=(6,), unpack=True, dtype='f8') # 繪制收盤價折線圖 mp.figure('COV', facecolor='lightgray') mp.title('COV', fontsize=18) mp.xlabel('date', fontsize=12) mp.ylabel('Closing Price', fontsize=12) mp.tick_params(labelsize=10) mp.grid(linestyle=':') # 設置x軸的刻度定位器,使之更適合顯示日期數據 ax = mp.gca() # 以周一作為主刻度 ma_loc = md.WeekdayLocator(byweekday=md.MO) # 次刻度,除周一外的日期 mi_loc = md.DayLocator() ax.xaxis.set_major_locator(ma_loc) ax.xaxis.set_major_formatter(md.DateFormatter('%Y-%m-%d')) ax.xaxis.set_minor_locator(mi_loc) # 日期數據類型轉換,更適合繪圖 dates = dates.astype(md.datetime.datetime) # 繪制兩支股票的價格曲線 mp.plot(dates, bhp_closing_prices, color='dodgerblue', label='BHP') mp.plot(dates, vale_closing_prices, color='orangered', label='VALE') # 通過計算協方差,輸出兩支股票的相似情況 bhp_mean = np.mean(bhp_closing_prices) vale_mean = np.mean(vale_closing_prices) bhp_dev = bhp_closing_prices - bhp_mean vale_dev = vale_closing_prices - vale_mean cov_ab = np.mean(bhp_dev * vale_dev) print(cov_ab.round(2)) # 輸出兩組樣本的相關系數 k = cov_ab / (np.std(bhp_closing_prices) * np.std(vale_closing_prices)) print(k.round(4)) # 輸出相關矩陣 m = np.corrcoef(bhp_closing_prices,vale_closing_prices) print(m.round(4)) # 輸出協方差陣 covm = np.cov(bhp_closing_prices,vale_closing_prices) print(covm.round(2)) mp.tight_layout() mp.legend() # 自動格式化x軸日期的顯示格式(以最合適的方式顯示) mp.gcf().autofmt_xdate() mp.show()