pandas计算周收益率
时间: 2023-12-19 12:32:21 浏览: 258
以下是pandas计算周收益率的例子:
```python
import pandas as pd
import numpy as np
# 创建示例数据
data = {'date': pd.date_range(start='1/1/2022', periods=12, freq='D'),
'close': [100, 102, 98, 105, 110, 108, 109, 115, 116, 120, 118, 122]}
df = pd.DataFrame(data)
# 计算对数收益率
log_return = np.log(df['close'] / df['close'].shift(1))
# 将日期转换为周
df['week'] = df['date'].dt.isocalendar().week
# 计算周收益率
weekly_return = df.groupby('week')['close'].apply(lambda x: np.log(x/x.shift(1))).reset_index()
weekly_return.columns = ['week', 'weekly_return']
print(weekly_return)
```
相关问题
#基于上一关的结果,读取沪深300指数2016年~2017年的交易数据表"data1.xlsx" # 字段依次如下: # 指数代码 交易日期 开盘价 最高价 最低价 收盘价 成交量 成交额 # 计算如下指标: # a1周最高价:周内指数成交的最高价。 # a2周最低价:周内指数成交的最低价。 # a3成交额:一周内指数成交额。 # a4周收益率:(本周收盘价-上周收盘价)/上周收盘价。 # a5上周收益率:上一周的周收益率。 # a6前周收益率:上上周的周收益率。 # a7上周成交额:上一周的成交额。 # a8近四周平均成交额:在最近的四周内的平均成交额。 # y(因变量):下周收盘价 – 本周收盘价,如果大于 0,记为 1;如果小于等于 0,记为 -1。 # 其中a1~a8,用一个数据框Data来表示 def return_values(): import pandas as pd import numpy as np import step6_4 r=step6_4.return_values() list1=r[0] list2=r[1] return (Data,y)
以下是代码实现:
```python
import pandas as pd
import numpy as np
import datetime
# 读取数据表
df = pd.read_excel('data1.xlsx')
# 转换日期格式
df['交易日期'] = pd.to_datetime(df['交易日期'])
# 提取2016年~2017年的数据
df = df[(df['交易日期'] >= datetime.datetime(2016, 1, 1)) & (df['交易日期'] <= datetime.datetime(2017, 12, 31))]
# 计算周数
df['周数'] = df['交易日期'].dt.week
# 计算a1周最高价
a1 = df.groupby('周数')['最高价'].max()
# 计算a2周最低价
a2 = df.groupby('周数')['最低价'].min()
# 计算a3成交额
a3 = df.groupby('周数')['成交额'].sum()
# 计算a4周收益率
df['上周收盘价'] = df['收盘价'].shift(1)
df['周收益率'] = (df['收盘价'] - df['上周收盘价']) / df['上周收盘价']
a4 = df.groupby('周数')['周收益率'].last()
# 计算a5上周收益率
a5 = df.groupby('周数')['周收益率'].last().shift(1)
# 计算a6前周收益率
a6 = df.groupby('周数')['周收益率'].last().shift(2)
# 计算a7上周成交额
a7 = df.groupby('周数')['成交额'].last().shift(1)
# 计算a8近四周平均成交额
a8 = df.groupby('周数')['成交额'].rolling(window=4).mean().reset_index(level=0, drop=True)
# 构建Data数据框
Data = pd.concat([a1, a2, a3, a4, a5, a6, a7, a8], axis=1)
Data.columns = ['a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8']
# 计算y值
df['下周收盘价'] = df['收盘价'].shift(-1)
df['y'] = np.where(df['下周收盘价'] - df['收盘价'] > 0, 1, -1)
y = df.groupby('周数')['y'].last().shift(-1)
# 删除最后一行无效数据
Data = Data[:-1]
y = y[:-1]
return (Data, y)
```
其中,需要用到 step6_4 中的 return_values() 函数来获取数据。函数的实现可以参考上一关的任务。
我有一个数据集,里面包含了2010 年1月至2019 年9月期间交通银行A股与4 个股票指数(上证综指、上证 50 指数、上证 180 指数、沪深 300 指数)的部分周收盘价格数据,请给我计算其5只股票周收益率的数据框(收益率用自然对数计算)的代码,谢谢
为了帮助您计算数据集中的5只股票周收益率并转换为自然对数,我们可以使用Python的pandas库来进行处理。首先假设您的数据集已经保存在一个CSV文件中,名为`stock_prices.csv`,并且有以下列名:`date`, `traffic_bank`, `sh_composite`, `sz_50`, `sz_180`, `hs_300`。
以下是代码示例:
```python
import pandas as pd
import numpy as np
# 加载数据
df = pd.read_csv('stock_prices.csv')
# 将日期设置为索引,并将时间序列转换为每周数据
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
weekly_df = df.resample('W').last() # 使用最后一次收盘价代表一周内的价格
# 计算周收益率(对数收益率)
def log_return(row):
non_zero_returns = row[row > 0]
if len(non_zero_returns) == 0:
return np.nan
else:
return np.log(row / non_zero_returns.iloc[0])
# 应用到所有股票
weekly_df['log_return'] = weekly_df.apply(log_return, axis=1)
# 现在每周收益率存储在'dlog_return'列中
print(weekly_df)
```
这个代码会计算每只股票的周收益率(对数形式),并保留NaN值,如果某一周的数据全部为零则无法计算对数收益率。
阅读全文