首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >利用熊猫数据实现随时间跳跃的股票价格月收益率

利用熊猫数据实现随时间跳跃的股票价格月收益率
EN

Stack Overflow用户
提问于 2018-09-28 07:43:19
回答 1查看 1.1K关注 0票数 1

我试着用熊猫数据从股票的日价格中计算每月的股票收益。

数据:

代码语言:javascript
运行
复制
permno          date           prc

Firm A          1995-01-02       30

Firm A          1995-01-03       30.3

...

Firm B          1996-01-03       10.1

到目前为止,我尝试的是:

代码语言:javascript
运行
复制
df = DATA
#date columns are consisted with datestamps
df.loc[:, 'month'] = df.loc[:, 'date'].apply(lambda x : x.strftime('%Y%m'))
# **<code1>** choose first date from that month for each permno
df_ = df.sort_values('date').groupby(['permno', 'month']).first().reset_index()
# **<code2>**  caclulate monthly_return by getting pct_change()
df_['monthly_return'] = df_.sort_values('month').groupby('permno').prc.pct_change()

不过,我刚发现有些证券有一段时间没有交换。

这导致了两个问题:

  1. 利用引线为某些证券选择假起点。例如,如果B公司的证券在1997年1月3日没有交易(假设这是第一天其他证券在1997年1月第一次交易)。选择1997年1月4日。因此,导致错误计算这种证券的月收益。
  2. 一些证券交易时间不超过一个月。假设B公司没有交易到1998.02英镑。~ 2001.12.然后,我们使用“2002.01的月收益率”=(价格2002.01-价格1998.01) /(1998.01)

有什么简单的方法来处理这类数据的周期跳跃吗?

EN

回答 1

Stack Overflow用户

发布于 2018-09-28 08:17:33

我认为最方便的方法是放弃可能产生误导性回报的值。

首先,创建一个以天数为索引的示例数据系列:

代码语言:javascript
运行
复制
periods = 10000
my_index = pd.date_range('2016-07-01', periods=periods, freq='D')
data = np.random.randint(100,1000,periods)
ts = pd.Series(data=data, index=my_index, name='Daily Returns')
print(ts.head())

示例系列如下:问题1:

代码语言:javascript
运行
复制
2016-07-01    348
2016-07-02    794
2016-07-03    650
2016-07-04    365
2016-07-05    291
Freq: D, Name: Monthly Returns, dtype: int64

在开始时分配一个nan值,

代码语言:javascript
运行
复制
ts.iloc[0]=np.nan

然后重新整理系列。‘BMS代表第一个营业日。“回填()”从前瞻偏倚中避开。

代码语言:javascript
运行
复制
ts=ts.resample('BMS').backfill().pct_change().dropna()

在结果序列中,没有观测到第一个月和第二个月,因为没有数据来计算回报。

代码语言:javascript
运行
复制
2016-09-01    0.257343
2016-10-03   -0.296997
2016-11-01    0.433544
2016-12-01   -0.552980
2017-01-02   -0.390123
Freq: BMS, Name: Monthly Returns, dtype: float64

问题2:插入更多nan并执行相同的操作:

代码语言:javascript
运行
复制
ts.iloc[500:9000]=np.nan
ts=ts.resample('BMS').backfill().pct_change().dropna()

它将跳过nan月及其相关的回报。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52550650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档