用Python分析美股实际收益率
这次的美股例子就选择了美国显卡制造商英伟达,其股票代码是NVDA
首先还是导入各种库。
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import yfinance as yf
这里有一个不太常见的库是yfinance
,这是从Yahoo网站获取数据的一个库,其使用非常简单,不需要相关api
,同时也是免费
的。yfinance
直接用pip
安装即可。
接下来是获取数据
df = yf.download('NVDA', start='2015-01-02', end='2020-01-01', progress=False)
yfinance
下载的数据直接是pandas
的dataframe
格式,这里我们只要输入股票代码以及起止时间就可以了,后面的progress
是进度条选项,最好关闭,否则下载好之后结果中会有一个进度条(影响也不大)。这里我们下载英伟达过去5年
的股票数据,从2015年1月1日到2019年12月31日
。这里有一个问题要注意,就是yfinance的数据获取时间是提前1天
的,比如设置起始时间start='2015-01-02'
,但最终得到的股票数据时间是从2015年1月1日
开始的, 同样截止时间end='2020-01-01'
也就意味着数据的截止时间是2019年12月31日
。下载之后的数据如下图所示。
然后是数据处理。
df = df[['Adj Close']] #这里要用两个[],否则是一个series而不是df
df.rename(columns={'Adj Close':'adj_close'},inplace=True) #改名
df['s_r'] = df/df.shift(1)-1 #计算会计收益率
从下载得到的数据中,我们选取
Adj Close
这一列,其全称是adjusted close
,意思是调整收盘价
,这就是我们要用到的数据,将其改名为adj_close
,然后用adj_close
计算会计收益率
(也称简单收益率
),即simple returns
,将其命名为s_r
,方法是用后一天数据除以前一天数据,再减一,当然这里用dataframe
的pct_change
方法也可以,得到的结果是一样的。补充
pandas.DataFrame.pct_change当前元素与先前元素之间的百分比变化。
pandas DataFrame.shift按期望的周期数移动索引,并带有可选的时间频率。
df_dates = pd.DataFrame(index=pd.date_range(start='2015-1-1', end='2019-12-31'))
df = df_dates.join(df) #生成新的dataframe
从前面看到得到的数据的时间是以天为单位的,但这些日期并不连续,中间有部分间断,这是因为股票市场在周末等节假日不开盘,而这里我们为了利用cpi来计算会计收益率,要设计一个连续时间范围,所以这里生成了一个名为df_dates的变量,其时间范围是连续的,从2015年1月1日到2019年12月31日,让其和df合并,得到的数据如下图所示。这里面NaN(not a number)都是节假日不开盘的日期
df=df.fillna(method='ffill').asfreq('M') #填充nan数据,并得出每月最后一个交易日的数据
因为要计算实际收益率,其中使用的cpi(onsumer price index,消费者物价指数)
是以月
为单位的,所以我们也要把df转换成以月为单位,为了避免在每月最后一天是非开盘日,所以首先用了fillna方法,方式是'ffill'
,即按照前一日数据来填充,然后用asfreq('M')
方法来得出每月最后一日的数据。
很多人会问,这个每月最后一日的数据有什么用,因为我们用到的cpi数据都是按月份来公布的,每月只有一个cpi数据,所以我们计算会计收益率时也要按照月份来算,而每月会计收益率就是用这个月的最后一个交易日的调整收盘价除以上个月的最后一个交易日的调整收盘价,然后再减一,和前面每日会计收益率的计算方法一样。然后用月份会计收益率和cpi来计算实际收益率。而我们这次所用到的cpi数据,其时间范围从2015年1月至2019年12月,总共5年,这个数据可以从很多网站下载,直接到网上搜索就行了,放在一个Excel文件中,文件名为cpi_data.xlsx。这个cpi数据的大致内容如下图所示。
cpi = pd.read_excel('cpi_data.xlsx').values #读取美国cpi数据
cpi = cpi[:, 1:].flatten() #把cpi数据从二维降为一维
df['cpi'] = cpi #生成新的列
df['inf_rate'] = df.cpi.pct_change() #计算通货膨胀率
df['r_r']=(df.s_r+1)/(df.inf_rate+1)-1 #计算实际收益率
读取cpi数据之后通过cpi数据计算通货膨胀率
,即inflation rate
,我们把这一列命名为inf_rate
,方法和会计收益率一样,接着再用通货膨胀率计算实际收益率(Real Rate of Return)
,方法是(1+会计收益率)/(1+通货膨胀率)-1
,我们将其命名为r_r
。最后得到的df数据如下图所示。
最后就是数据可视化。
plt.style.use('ggplot') #选用ggplot主题
fig, ax = plt.subplots(4, 1, figsize=(12, 10), sharex=True) #共享x轴
df.adj_close.plot(ax=ax[0])
ax[0].set(title = 'Nvidia data analysis', ylabel = 'Stock price')
df.s_r.plot(ax=ax[1])
ax[1].set(ylabel = 'Simple returns')
df.inf_rate.plot(ax=ax[2])
ax[2].set(ylabel = 'Inflation rate')
df.r_r.plot(ax=ax[3])
ax[3].set(xlabel = 'Date', ylabel = 'Real Rate of Returns')
这里我们只要4列数据,即除了cpi之外的其他4列数据。将其置于4个子图中,绘图直接用dataframe
的plot
方法即可,在这里我们选用了ggplot
的绘图主题。得到的结果如下图所示。
从这里我们也可以看到用pandas分析美股数据非常方便,但是只掌握pandas的使用方法还是不够的,我们还要具备相关的金融基础知识,尤其是计量经济学的相关基础,因此在分析股票数据时最好还要有一定的经济学基础。所以在我们平时的业务工作当中,除了必要的编程技能以外,掌握相关的理论知识也是很重要的。