2016-01-14 27 views
0

我每天都有S & P 500價格和國債收益率。最終目標是確定美國國債在S & P的修正過程中如何以圖表和數學方式執行。修正值比最後一個峯值下降一個百分點,其中%爲可變參數。使用熊貓識別財務數據中的極值

import urllib2, pandas as pd, numpy as np, matplotlib.pyplot as plt, scipy as sp 

correction = 0.1 # define % decline from peak to constitute market correction 

sp_data = urllib2.urlopen('http://real-chart.finance.yahoo.com/table.csv?s=%5EGSPC&a=00&b=3&c=1950&d=00&e=14&f=2016&g=d&ignore=.csv') 
df1 = pd.read_csv(sp_data) 
df1 = df1[['Date','Close']] 
df1 = df1.rename(columns = {'Close':'S&P_500'}) 

t_bill_data = urllib2.urlopen('http://real-chart.finance.yahoo.com/table.csv?s=%5ETNX&a=00&b=2&c=1962&d=00&e=14&f=2016&g=d&ignore=.csv') 
df2 = pd.read_csv(t_bill_data) 
df2 = df2[['Date','Close']] 
df2 = df2.rename(columns = {'Close':'T_Bill'}) 

df3 = pd.merge(df1, df2, on='Date', how='outer') 

df3['Date'] = pd.to_datetime(df3['Date'], format='%Y-%m-%d') 
df3 = df3.set_index('Date') 

df3.describe() 
df3.plot(kind='line',title='S&P 500 vs. 10 yr T-Bill',subplots=True) 

如何識別和子集DF進入S & P修正不同的時期? (允許圖表和彙總統計數據專注於獨特的時間段,因此我可以確定S & P修正量和美國國債之間的相關性。)Scipy identifyingidentifying全局或局部最小值和最大值 - 是否有pythonic方法來量身定製這些確定修正的時期?

回答

2

我會回答你的問題,從純粹熊貓的立場(而不是使用urlib或numpy)熊貓是專門用於解決幾乎任何實際問題中檢索和蒐集和財務數據。

1.如何識別S校正的不同時期?

讓我們來定義修正爲20%以上的市場,降幅比最近的(比如90天)峯:

import pandas as pd 
from pandas_datareader import data 
import matplotlib.pyplot as plt 
%matplotlib inline 
plt.rcParams['figure.figsize'] = (15,5) 

def bear_market(symbol, window=90, correction = .2): 
    return pd.rolling_apply(symbol, window, lambda x: x[-1]/x.max() < (1-correction)) 

spx = data.get_data_yahoo('^GSPC', start = '1970-01-01') 
tnx = data.get_data_yahoo('^TNX', start = '1970-01-01') 
spx_bear = bear_market(spx['Close']) 

data_df = pd.DataFrame({'SP500': spx['Close'], 
         'Bonds': tnx['Close'], 
         'Bear market': spx_bear}) 

data_df.tail() 


    Bear market Bonds SP500 
Date    
2016-01-11 0 2.158 1923.670044 
2016-01-12 0 2.102 1938.680054 
2016-01-13 0 2.066 1890.280029 
2016-01-14 0 2.098 1921.839966 
2016-01-15 0 2.033 1880.329956 

您可以用windowcorrection參數發揮獲得修正的不同「版本」。

2.繪製

plot_df = data_df['2008':'2009'] 

_, ax = plt.subplots() 
ax2 = ax.twinx() 

plot_df['Bonds'].plot(ax=ax) 
plot_df['Bear market'].plot(ax=ax2, style='r--', ylim=[-.1, 1.1]) 
ax.set_title('Treasuries Performance during SP500 Corrections'); 

enter image description here

3子集和彙總統計

最後,會有發掘結果數據集有兩種方法:用熊貓.groupby()或直接子集。在這兩種情況下,我們都需要退貨,而不是價格:

ret_df = pd.DataFrame({'SP500': spx['Close'].pct_change(), 
         'Bonds': tnx['Close'].pct_change(), 
         'Bear market': spx_bear}) 

ret_df.groupby('Bear market').agg('mean') 

    Bonds SP500 
Bear market  
0 0.000042 0.000430 
1 -0.002679 -0.003261 


ret_df[ret_df['Bear market'] == 1][['Bonds','SP500']].corr() 
    Bonds SP500 
Bonds 1.000000 0.253068 
SP500 0.253068 1.000000 

這是否有助於解決您的問題?

編輯

你會看到在代碼中幾次 「熊」。原因是我從我的小型項目中借用了這段代碼來確定「熊市」的時間段,但是如果您忽略「熊」字和「-20%」的值,則此代碼適用於任何更正,這些定義是熊市。