2017-09-12 7 views
0

주식의 종가가있는 데이터 세트를 작성 중입니다.데이터 세트에서 선형 상관 관계를 수행하고 가장 상관이 높은 컬럼 이름을 리턴하는 방법은 무엇입니까?

'GOOG' : [ 
     742.66, 738.40, 738.22, 741.16, 
     739.98, 747.28, 746.22, 741.80, 
     745.33, 741.29, 742.83, 750.50 
    ], 
    'FB' : [ 
     108.40, 107.92, 109.64, 112.22, 
     109.57, 113.82, 114.03, 112.24, 
     114.68, 112.92, 113.28, 115.40 
    ], 
    'MSFT' : [ 
     55.40, 54.63, 54.98, 55.88, 
     54.12, 59.16, 58.14, 55.97, 
     61.20, 57.14, 56.62, 59.25 
    ], 
    'AAPL' : [ 
     106.00, 104.66, 104.87, 105.69, 
     104.22, 110.16, 109.84, 108.86, 
     110.14, 107.66, 108.08, 109.90 
    ] 

지난 12 일 동안의 마감 가격입니다. 주어진 회사의 어느 주식 쌍이 가장 높은 상관 관계가있는 일일 종가 변동률을 결정하고이를 배열로 반환 할 것인지를 결정해야합니다.

import pandas as pd 
import numpy as np 

class StockPrices: 
    # param prices dict of string to list. A dictionary containing the tickers of the stocks, and each tickers daily prices. 
    # returns list of strings. A list containing the tickers of the two most correlated stocks. 
    @staticmethod 
    def most_corr(prices): 
     return 


#For example, with the parameters below the function should return ['FB', 'MSFT']. 
prices = { 
    'GOOG' : [ 
     742.66, 738.40, 738.22, 741.16, 
     739.98, 747.28, 746.22, 741.80, 
     745.33, 741.29, 742.83, 750.50 
    ], 
    'FB' : [ 
     108.40, 107.92, 109.64, 112.22, 
     109.57, 113.82, 114.03, 112.24, 
     114.68, 112.92, 113.28, 115.40 
    ], 
    'MSFT' : [ 
     55.40, 54.63, 54.98, 55.88, 
     54.12, 59.16, 58.14, 55.97, 
     61.20, 57.14, 56.62, 59.25 
    ], 
    'AAPL' : [ 
     106.00, 104.66, 104.87, 105.69, 
     104.22, 110.16, 109.84, 108.86, 
     110.14, 107.66, 108.08, 109.90 
    ] 
} 

print(StockPrices.most_corr(prices)) 

나는 NumPy와 상관 함수를 통과했지만 어떻게 최대의 상관 관계를 가지고 다음과 같은 두 벡터를 결정하는 그 정확한 기능을 사용할 수 있을까?

답변

2

사전을 데이터 프레임으로 변환하여 팬더 corr의 기능을 사용할 수 있습니다. 이 함수는 데이터 프레임의 숫자 열에 대한 상관 행렬을 반환합니다.

import pandas as pd 

prices = { 
    'GOOG' : [ 
     742.66, 738.40, 738.22, 741.16, 
     739.98, 747.28, 746.22, 741.80, 
     745.33, 741.29, 742.83, 750.50 
    ], 
    'FB' : [ 
     108.40, 107.92, 109.64, 112.22, 
     109.57, 113.82, 114.03, 112.24, 
     114.68, 112.92, 113.28, 115.40 
    ], 
    'MSFT' : [ 
     55.40, 54.63, 54.98, 55.88, 
     54.12, 59.16, 58.14, 55.97, 
     61.20, 57.14, 56.62, 59.25 
    ], 
    'AAPL' : [ 
     106.00, 104.66, 104.87, 105.69, 
     104.22, 110.16, 109.84, 108.86, 
     110.14, 107.66, 108.08, 109.90 
    ] 
} 

df = pd.DataFrame.from_dict(prices) 
print(df.corr()) 

은 아웃 :

  AAPL  FB  GOOG  MSFT 
AAPL 1.000000 0.886750 0.853015 0.894846 
FB 0.886750 1.000000 0.799421 0.858784 
GOOG 0.853015 0.799421 1.000000 0.820544 
MSFT 0.894846 0.858784 0.820544 1.000000 

피어슨 상관 관계는 다른 방법 켄달을 필요로하는 경우,스피어도 사용할 수 있습니다 (표준 인) 기본적으로 계산됩니다. 당신은 팬더 경로를 이동하지하려면

1

, 당신은 파이썬 도구를 사용하여 직접 할 수있는 :

import itertools 
import operator 

tuples = list(itertools.combinations(prices.keys(), 2)) 

correlations = {} 
for pair in tuples: 
    correlations.update({pair: np.corrcoef(prices[pair[0]],prices[pair[1]])[1,0]}) 

max(correlations.keys(), key=(lambda key: correlations[key])) 

첫 번째 단계는 모든 페어 조합을 만듭니다. 그런 다음 각 pairwise 조합 및 해당 계수에 대한 사전을 만든 다음 최대 값을 반환합니다.

팬더의 대답은 좋은,하지만 당신은 당신이 내장 계산을 사용할 수 일 : 위에서 지적한 바와 같이

1

을하는 좋은 방법도 올바른 값을 찾기 위해 그 dataframe을 구문 분석 할 필요가 당신이 가장 가능성이 관심이 무엇 주식, 즉, 각각의 일상 비율 변경의 일상 반환의 상관 관계가 있음을

df = pd.DataFrame(prices) 
df = df.pct_change() 
df.corr() 

참고 : dataframe에 피어슨의 R의의 corr() 함수를 호출하여 상징. 실제 값의 상관 관계를 계산하면 다른 가격 수준으로 인한 왜곡 효과가 나타날 수 있습니다. 팬더의 pct_change() 기능으로 일일 수익을 계산할 수 있습니다.

df.corr()['AAPL'].nlargest(2) (예 : df.corr().max()은 각 기호의 1.0 상관 관계를 자주 나타냄)을 호출하여 주어진 기호에 대한 최대 상관 관계를 얻을 수 있지만 대부분의 경우 특정 값 이상의 값을 선택하는 데 관심이있을 수 있습니다. 임계 값, 예 :

df.corr() > 0.85