2017-09-12 10 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つのベクトルのかを決定するためにその正確な機能を使用することができますか?

答えて

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()) 

はOUT:

  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

あなたはパンダのルートを移動しないようにしたい場合は、Pythonツールを使用して、それを自分で行うことができます:

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])) 

最初のステップは、すべてのペアごとの組み合わせを作成します。 次に、ペアごとの組み合わせとそれぞれの係数の辞書を作成し、最大値を返します。

パンダの答えはいいですが、あなたは、その後も、物事の罰金の方法である右の値を、見つけるために、そのデータフレームを解析する必要があります:)

1

先に指摘したように、あなたは組み込みの計算を使用することができますあなたが最も可能性の高い関心を持っているどのような株式、すなわち、それぞれの日々の変化率の毎日リターンの相関があることを

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

注:データフレームのピアソンのRの、corr()関数を呼び出すことにより、シンボル。実際の値の相関を計算すると、異なる価格レベルによる歪みの影響が表示されることがあります。毎日のリターンは、パンダのpct_change()機能で計算できます。

たとえば、df.corr()['AAPL'].nlargest(2)を呼び出すことで、特定のシンボルの最大相関を得ることができます(ただし、df.corr().max()は各シンボルの1.0相関を自明に返します)。多くの場合、ある特定の値以上の値を選択することができます閾値、たとえば

df.corr() > 0.85 
関連する問題