#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). Я думаю, я выясню следующие шаги. Еще раз спасибо.