5天平均累计净值
import pandas as pd
import matplotlib.pyplot as plt
# 读取CSV文件
data = pd.read_csv('history_006567.csv')
# 将日期列转换为datetime类型,并设置为索引
data['日期'] = pd.to_datetime(data['日期'], format='%Y/%m/%d')
data.set_index('日期', inplace=True)
# 使用 '5D' 作为频率参数来填充缺失的日期
data = data.asfreq(freq='5D')
# 计算每5天的平均累计净值,确保只计算有数据的日期
data['5天平均累计净值'] = data['累计净值'].rolling(window=5).mean().shift(-1)
# 标记A, B, C, D时间段的开始日期
time_periods = data.index[::5]
print(time_periods)
# 初始化买入、加仓和卖出的日期及条件
buy_dates = []
add_positions_dates = []
sell_dates = []
total_investment = 0
total_return = 0
# 遍历时间段,应用买入和加仓规则
for i in range(1, len(time_periods), 2):
# 获取当前时间段D的开始日期和前一个时间段C的结束日期
start_date = time_periods[i]
end_date = time_periods[i - 1]
# 计算时间段C和D的平均累计净值
average_C = data.loc[end_date, '5天平均累计净值']
average_D = data.loc[start_date, '5天平均累计净值']
print(start_date)
# 买入规则 A > B > C > D
if average_D < average_C:
buy_dates.append(start_date)
total_investment += 1 # 假设每次买入的本金是1单位
print(f"买入日期: {start_date}")
# 加仓规则 A > B > C > D
if i < len(time_periods) - 2:
next_start_date = time_periods[i + 2]
average_next_start = data.loc[next_start_date, '5天平均累计净值']
if average_next_start > average_D > average_C:
add_positions_dates.append(next_start_date)
total_investment += 1 # 同样假设加仓的本金是1单位
print(f"加仓日期: {next_start_date}")
# 应用卖出规则
# 假设我们在最后一个时间段结束时卖出
sell_date = time_periods[-1]
cumulative_return = (data.loc[sell_date, '累计净值'] - total_investment) / total_investment
if cumulative_return > 0.05 or cumulative_return < -0.3:
sell_dates.append(sell_date)
print(f"卖出日期: {sell_date}")
# 打印收益率
print('buy_dates',buy_dates)
print('add_positions_dates',add_positions_dates)
print('sell_dates',sell_dates)
print(f"总收益: {cumulative_return * 100:.2f}%")
# 注意:这里的计算非常简化,实际投资决策需要考虑更多因素,如交易成本、资金的时间价值等。