【问题标题】:Identifying Extrema in Financial Data using Pandas使用 Pandas 识别财务数据中的极值
【发布时间】:2016-04-20 08:36:29
【问题描述】:

我有标准普尔 500 指数的每日价格和国债收益率。最终目标是确定美国国债在标准普尔修正期间的图形和数学表现如何。修正是从最后一个峰值下降一些 %,其中 % 是一个可变参数。

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 修正周期? (允许图表和汇总统计数据关注独特的时间段。所以我可以确定标准普尔修正和国债之间的相关性。)Scipy 有tools 用于identifying 全局或局部最小值和最大值——是否有pythonic 方法调整这些以识别修正期?

【问题讨论】:

    标签: python numpy pandas matplotlib scipy


    【解决方案1】:

    我将纯粹从 Pandas 的角度(而不是使用 urlib 或 numpy)回答您的问题,因为 Pandas 专门用于解决检索和处理财务数据中出现的几乎所有实际问题。

    1.如何识别标普修正的不同时期?

    让我们将修正定义为市场在最近(比如 90 天)峰值后下跌 20% 或更多:

    import pandas as pd
    from pandas_datareader import data
    import matplotlib.pyplot as plt
    %matplotlib inline
    plt.rcParams['figure.figsize'] = (15,5)
    
    spx = data.get_data_yahoo('^GSPC', start = '1970-01-01')
    tnx = data.get_data_yahoo('^TNX', start = '1970-01-01')
    
    WINDOW = 90
    CORRECTION = .2
    spx_bear = spx['Close'].rolling(WINDOW).apply(lambda x: x[-1]/x.max() < (1-CORRECTION))
    
    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');
    

    3。子集和汇总统计数据

    最后,将有两种方法来探索生成的数据集:使用 pandas .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%”,这个代码适用于任何修正,这是定义熊市。

    【讨论】:

    • 嗨 @Sergey Bushmanov 从 5 年前开始经历你的工作,并且似乎 rolling_apply 被 python 中的滚动所取代 - 那么你的函数“bear_market”返回值的代码将如何变化?
    猜你喜欢
    • 2015-02-16
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    相关资源
    最近更新 更多