Вывод из PCA (с использованием Python) о возврате запасов нефти

#python #pca

#python #pca

Вопрос:

Мне было интересно выяснить, есть ли несколько общих факторов, которые влияют на доходность отдельных акций в нефтяном секторе США, получая ежедневные цены закрытия от Yahoo!. Ниже приведен (довольно простой) Код Python, который я использовал, с конечным результатом (графиком), представленным полностью ниже, показывает верхние 2 ПК (поскольку они, похоже, объясняют большую часть различий). Проблема в том, что я не могу сделать выводы из сюжета. Не уверен, что вообще можно вывести из этого! Кто-нибудь хочет нанести удар и / или указать на уродство в моей реализации? 🙂

С уважением.

 import pandas as pd
from pandas_datareader import data as web
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
import statistics as st
%matplotlib inline

symbols=['XOM','CVX','SLB','PXD','EOG','OXY','HAL','KMI','SE','PSX','VLO','COP','APC','TSO','WMB','BHI','APA','COG','DVN','MPC','NBL','CXO','NOV','HES','MRO','EQT','XEC','FTI','RRC','OKE','SWN','NFX','HP','MUR','CHK','RIG','DO']
try:
   h13 = pd.HDFStore('port.h13')
   data = h13['norm']
   h13.close()
except:
   data = pd.DataFrame()
   for sym in symbols:
       data[sym] = web.DataReader(sym, data_source='yahoo', start='01/01/2016')['Adj Close']
   data = data.dropna()
   h13 = pd.HDFStore('port.h13')
   h13['norm'] = data
   h13.close()

(data / data.ix[0] * 100).plot(figsize=(8,6), grid = True)

log_returns = np.log(data / data.shift(1))
log_returns.hist(bins=50, figsize=(9,6))
lr = log_returns.iloc[1:]
sigma = np.cov(lr, rowvar = False)

lr_list = lr.T.values
myu_list=[sum(elem)/len(elem) for elem in zip(*lr_list.T)]  
std_list=[st.stdev(elem) for elem in zip(*lr_list.T)]  
lr_norm = (lr.as_matrix() - myu_list)/std_list
lr_cov = np.cov(lr_norm, rowvar = False, ddof = 0)
eig_val, eig_vec = np.linalg.eig(lr_cov)
plt.plot(eig_vec[0:3].dot(lr_norm.T).T)
  

График ПК

Комментарии:

1. Этот вопрос не по теме, потому что речь идет об интерпретации статистики, а не о программировании.

2. Похоже, что вы берете комплексный собственный вектор, умножаете его на свою ковариационную матрицу и строите результат. Я не совсем уверен в интерпретационной ценности этого. Я думаю, что вы действительно хотели бы сделать (возможно), это спроецировать все ваши фактические данные на подпространство вашего собственного вектора (ов), а затем построить график, чтобы увидеть, где ваши данные лежат по каждому фактору

3. @ Josh Caswell — Спасибо и отметил. Я буду осторожен, чтобы публиковать только технически значимые вопросы.

4. @ Simon — Спасибо! Действительно, я думаю, что я уже делаю это через plt.plot(eig_vec[0:2].dot(lr_norm.T).T) , где eig_vec — собственные векторы, а lr_norm — исходная нормализованная (стандартизированная) выборка. Я определенно не умножаю eig_vec на ковариационную матрицу (lr_cov). Я думаю, я выясню следующие шаги. Еще раз спасибо.