使用python写一段代码,需要读取十只股票的数据,算出当日个股收盘价的 5 日均值:MA5 算出当日个股收盘价到 5 日均值的偏离程度 ratio:(closePrice-MA5)/MA5 根据给出的十只股票当日的 ratio,挑出 ratio 为负的个股,第二天等权持仓,再根据每日的持仓个股和个股的收益率,计算每日的策略收益率,最后在一副图中,画出: 1)根据策略收益率画出策略净值曲线 2)茅指数净值 3)HS300 净值 净值计算公式:Nav(t)=(1+r1)(1+r2)(1+r3)......(1+rt)。 其中 ri 为第 i 天收益率,Nav(t)为第 t 天净值。
时间: 2024-02-06 12:12:40 浏览: 210
好的,以下是一份示例代码,可以实现你的需求:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取十只股票数据
stock_list = ['000001.SZ', '000002.SZ', '000004.SZ', '000005.SZ', '000006.SZ', '000007.SZ', '000008.SZ', '000009.SZ', '000010.SZ', '000011.SZ']
df_list = []
for stock in stock_list:
df = pd.read_csv(f'{stock}.csv')
df_list.append(df)
# 计算每只股票的 MA5 和 ratio
for i, df in enumerate(df_list):
df['MA5'] = df['close'].rolling(window=5).mean()
df['ratio'] = (df['close'] - df['MA5']) / df['MA5']
# 挑出 ratio 为负的个股,并计算每日的策略收益率
df_ratio = pd.concat([df[['trade_date', 'ratio']].rename(columns={'ratio': stock_list[i]}) for i, df in enumerate(df_list)], axis=1)
df_ratio['sum'] = df_ratio.sum(axis=1)
df_ratio['signal'] = df_ratio['sum'].apply(lambda x: 1 if x < 0 else 0)
df_ratio['return'] = df_ratio[stock_list].mean(axis=1) * df_ratio['signal'] / df_ratio['signal'].sum()
# 计算每日的策略净值、茅指数净值和 HS300 净值
df_ratio['strategy_nav'] = (1 + df_ratio['return']).cumprod()
df_ratio['maotai_nav'] = (1 + df_list[0]['pct_chg'] / 100).cumprod()
df_ratio['hs300_nav'] = (1 + df_list[-1]['pct_chg'] / 100).cumprod()
# 绘制策略净值曲线、茅指数净值曲线和 HS300 净值曲线
plt.plot(df_ratio['trade_date'], df_ratio['strategy_nav'], label='strategy')
plt.plot(df_ratio['trade_date'], df_ratio['maotai_nav'], label='maotai')
plt.plot(df_ratio['trade_date'], df_ratio['hs300_nav'], label='hs300')
plt.legend()
plt.show()
```
注意,以上代码中的 `000001.SZ` 表示贵州茅台的股票代码,对于其他股票需要替换成对应的股票代码。此外,这份代码的实现方式可能并不是最优的,仅供参考。
阅读全文