请你帮我使用python写一段满足以下要求的程序: 输入:基金净值曲线,基准净值曲线、起止时间 输出:基金在起止时间内的收益率、波动率、最大回撤、相对基准的超额收益、跟踪误差、信息比率、相对基准的最大回撤、季度胜率、月度胜率。 所有输入和输出数据均要求用Excel的形式保存和读取。
时间: 2023-07-10 19:38:32 浏览: 200
好的,以下是一个满足要求的Python程序:
```python
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取基金和基准的净值数据
fund_data = pd.read_excel('fund_data.xlsx', index_col='date', parse_dates=['date'])
benchmark_data = pd.read_excel('benchmark_data.xlsx', index_col='date', parse_dates=['date'])
# 设置回测时间段
start_date = '2018-01-01'
end_date = '2021-08-31'
# 筛选回测时间段内的数据
fund_data = fund_data.loc[start_date:end_date]
benchmark_data = benchmark_data.loc[start_date:end_date]
# 计算基金和基准的收益率
fund_return = fund_data['net_value'].pct_change()
benchmark_return = benchmark_data['net_value'].pct_change()
# 计算基金和基准的累计收益率
fund_cumulative_return = (1 + fund_return).cumprod() - 1
benchmark_cumulative_return = (1 + benchmark_return).cumprod() - 1
# 计算基金和基准的年化收益率
fund_annual_return = (1 + fund_return).prod() ** (252 / len(fund_return)) - 1
benchmark_annual_return = (1 + benchmark_return).prod() ** (252 / len(benchmark_return)) - 1
# 计算基金和基准的年化波动率
fund_annual_volatility = np.sqrt(252) * fund_return.std()
benchmark_annual_volatility = np.sqrt(252) * benchmark_return.std()
# 计算基金和基准的最大回撤
fund_max_drawdown = (1 - fund_cumulative_return / (1 + fund_cumulative_return.cummax())).max()
benchmark_max_drawdown = (1 - benchmark_cumulative_return / (1 + benchmark_cumulative_return.cummax())).max()
# 计算基金和基准的超额收益
excess_return = fund_return - benchmark_return
# 计算基金和基准的跟踪误差
tracking_error = excess_return.std()
# 计算基金和基准的信息比率
information_ratio = excess_return.mean() / excess_return.std()
# 计算基金和基准的季度胜率
fund_quarterly_return = fund_return.resample('Q').prod()
benchmark_quarterly_return = benchmark_return.resample('Q').prod()
quarterly_win_rate = (fund_quarterly_return > benchmark_quarterly_return).sum() / len(fund_quarterly_return)
# 计算基金和基准的月度胜率
fund_monthly_return = fund_return.resample('M').prod()
benchmark_monthly_return = benchmark_return.resample('M').prod()
monthly_win_rate = (fund_monthly_return > benchmark_monthly_return).sum() / len(fund_monthly_return)
# 输出回测结果
print('回测时间段:{} 至 {}'.format(start_date, end_date))
print('基金收益率:{:.2%}'.format(fund_cumulative_return[-1]))
print('基金年化收益率:{:.2%}'.format(fund_annual_return))
print('基金年化波动率:{:.2%}'.format(fund_annual_volatility))
print('基金最大回撤:{:.2%}'.format(fund_max_drawdown))
print('基金超额收益:{:.2%}'.format(excess_return[-1]))
print('基金跟踪误差:{:.2%}'.format(tracking_error))
print('基金信息比率:{:.2f}'.format(information_ratio))
print('基金相对基准的最大回撤:{:.2%}'.format(fund_max_drawdown - benchmark_max_drawdown))
print('基金季度胜率:{:.2%}'.format(quarterly_win_rate))
print('基金月度胜率:{:.2%}'.format(monthly_win_rate))
# 绘制基金和基准的累计收益率曲线
plt.plot(fund_cumulative_return, label='Fund')
plt.plot(benchmark_cumulative_return, label='Benchmark')
plt.legend(loc='best')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.title('Fund vs Benchmark Cumulative Return')
plt.show()
# 将回测结果保存到Excel文件中
result = pd.DataFrame({
'回测时间段': '{} 至 {}'.format(start_date, end_date),
'基金收益率': fund_cumulative_return[-1],
'基金年化收益率': fund_annual_return,
'基金年化波动率': fund_annual_volatility,
'基金最大回撤': fund_max_drawdown,
'基金超额收益': excess_return[-1],
'基金跟踪误差': tracking_error,
'基金信息比率': information_ratio,
'基金相对基准的最大回撤': fund_max_drawdown - benchmark_max_drawdown,
'基金季度胜率': quarterly_win_rate,
'基金月度胜率': monthly_win_rate
}, index=[0])
result.to_excel('backtest_result.xlsx', index=False)
```
这个程序中,我们首先从 Excel 文件中读取基金和基准的净值数据,并按照日期排序。然后设置回测时间段,并筛选出回测时间段内的数据。接着计算基金和基准的收益率、基金和基准的累计收益率、基金和基准的年化收益率、基金和基准的年化波动率、基金和基准的最大回撤、基金和基准的超额收益、基金和基准的跟踪误差、基金和基准的信息比率、基金和基准的季度胜率和基金和基准的月度胜率等指标,并输出回测结果。最后,绘制基金和基准的累计收益率曲线,并将回测结果保存到 Excel 文件中。
阅读全文