使用python写一段代码根据已经读取的十只股票的数据,算出当日个股收盘价的 5 日均值:MA5 算出当日个股收盘价到 5 日均值的偏离程度 ratio:(closePrice-MA5)/MA5 根据给出的十只股票当日的 ratio,挑出 ratio 为负的个股,第二天等权持仓,再根据每日的持仓个股和个股的收益率,计算每日的策略收益率,最后在一副图中,画出: 1)根据策略收益率画出策略净值曲线 2)茅指数净值其中 ri 为第 i 天收益率,Nav(t)为第 t 天净值。
时间: 2024-02-06 20:12:57 浏览: 23
好的,这是一个比较复杂的问题,需要用到pandas、numpy、matplotlib等库,我会尽力为您解答。
首先,我们需要读取十只股票的数据,这里假设数据已经保存在csv文件中,每个文件名为股票代码,文件中包含日期、开盘价、收盘价等信息。我们可以用pandas库中的read_csv函数来读取这些数据:
```python
import pandas as pd
stocks = []
for code in ['000001', '000002', '000004', '000005', '000006', '000007', '000008', '000009', '000010', '000011']:
df = pd.read_csv(f'{code}.csv', index_col=0)
stocks.append(df)
```
接下来,我们需要计算每个股票的MA5和ratio。我们可以使用rolling函数来计算5日均值,使用apply函数来计算ratio:
```python
for df in stocks:
ma5 = df['close'].rolling(window=5).mean()
df['ma5'] = ma5
df['ratio'] = (df['close'] - ma5) / ma5
```
然后,我们需要挑出ratio为负的股票,并在第二天等权持仓。我们可以用shift函数来将ratio向后移动一天,然后使用apply函数来进行筛选:
```python
def select_stock(df):
df['ratio_shift'] = df['ratio'].shift(-1)
selected_df = df[df['ratio_shift'] < 0]
selected_df['return'] = selected_df['close'].pct_change()
selected_df['weight'] = 1 / len(selected_df)
selected_df['weighted_return'] = selected_df['return'] * selected_df['weight']
return selected_df[['close', 'return', 'weight', 'weighted_return']]
selected_stocks = []
for df in stocks:
selected_df = df.groupby('date').apply(select_stock)
selected_stocks.append(selected_df)
```
最后,我们需要计算每日的策略收益率和净值曲线。我们可以使用concat函数将所有股票的weighted_return合并起来,然后使用cumsum函数计算累计收益率,再使用exp函数计算净值曲线。同时,我们还需要下载茅台日线数据,计算茅台的净值曲线,以便与策略净值曲线进行比较:
```python
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
# 下载茅台日线数据
data = ts.get_k_data('600519', start='20200101', end='20211231')
data['date'] = pd.to_datetime(data['date'])
data.set_index('date', inplace=True)
# 计算茅台净值曲线
data['return'] = data['close'].pct_change()
data['weighted_return'] = data['return'] / len(data)
data['strategy_nav'] = (1 + data['weighted_return']).cumprod()
# 合并所有股票的weighted_return
weighted_returns = pd.concat([df['weighted_return'] for df in selected_stocks], axis=0)
weighted_returns = weighted_returns.groupby(level=0).sum()
weighted_returns = weighted_returns.dropna()
# 计算策略净值曲线
weighted_returns = np.exp(np.log(1 + weighted_returns).cumsum())
weighted_returns.name = 'strategy_nav'
# 合并茅台和策略净值曲线
nav = pd.concat([data['strategy_nav'], weighted_returns], axis=1)
nav = nav.dropna()
# 画出净值曲线图
nav.plot(figsize=(12, 6))
plt.title('Strategy vs Maotai')
plt.xlabel('Date')
plt.ylabel('Net Asset Value')
plt.show()
```
这样,我们就完成了题目中的要求。需要注意的是,本代码仅供参考,实际应用还需要进行更多的优化和完善。