目录
序言
博主最近沉迷理财,为了不使编程功力减退,特此使用python分析基金定投,文章不会推荐理财产品,各位看看就好。
准备工作:
- 某指数,某基金的历史业绩,爬虫,复制皆可
- python3环境,编译器
定投频率与收益
数据选取的是2018年到2019年9月间的微笑曲线
日定投
定投400个交易日,每日都定投
周定投
每周定投一次,80周
月定投
每月按20交易日算,定投20个月
频率越低收益越高,但三种定投收益相差不超过1%,大多数情况下是频率越高,收益越高,主要与波型有关。
对于如下的波形,日频能够在低点买入,但是周&月频率则较大概率在高点买入,所以日频定投更好
如下波形的微笑曲线,正好与上面相反,日頻不会错过所有高点,而其他两种定投较大概率在低点买入。
涨日与跌日
这里定投就需要每日看盘了,分为涨日买进和跌日买进,定投次数不定,每次金额固定
涨日定投
跌日定投
跌日买进要比涨日买进收益高3%
import pandas as pd
import matplotlib.pyplot as plt
from pylab import mpl
from pandas.plotting import lag_plot
def Cast_Surely(count_list,cast_count,cast_fre,money):
#普通定投
#count_list 净值序列
#money 本金
#cast_count 定投次数
#cast_fre 定投频率
once_cost = money/cast_count #单笔定投金额
final_count = count_list[len(count_list)-1] #结束定投净值
Share_count = 0 #持有份额
mark_count = 0 #上一次定投索引
cast_x = [] #定投时间
cast_y = [] #定投价格
for i in range(len(count_list)):
if i == 0:
Share_count = once_cost/count_list[i]
cast_x.append(i)
cast_y.append(count_list[i])
elif i-cast_fre == mark_count and i < cast_count*cast_fre:
Share_count = Share_count + once_cost/count_list[i]
cast_x.append(i)
cast_y.append(count_list[i])
mark_count = i #标记本次定投位置
InCome_final = Share_count*final_count #最终收益
return [money,InCome_final,(InCome_final/money-1)*100,cast_x,cast_y]
def Cast_Surely_1(data,cast_fre,money):
# 涨跌投
#count_list 净值数据
#money 本金
#cast_fre 定投频率
count_list = data['收盘']
ware_list = data['涨跌幅']
final_count = count_list[len(count_list)-1] #结束定投净值
Share_count_up = 0 #涨持有份额
Share_count_down = 0 #跌持有份额
cast_up_x = [] #涨定投时间
cast_up_y = [] #涨定投价格
cast_down_x = [] #跌定投时间
cast_down_y = [] #跌定投价格
up_count = 0
down_count = 0
for i in range(len(count_list)):
if ware_list[i] > 0:
up_count = up_count + 1
elif ware_list[i] < 0:
down_count = down_count + 1
for i in range(len(count_list)):
if ware_list[i] > 0:
Share_count_up = money/up_count/count_list[i] + Share_count_up
cast_up_x.append(i)
cast_up_y.append(count_list[i])
elif ware_list[i] < 0:
Share_count_down = money/down_count/count_list[i] + Share_count_down
cast_down_x.append(i)
cast_down_y.append(count_list[i])
InCome_final_up = Share_count_up * final_count # 涨最终收益
InCome_final_down = Share_count_down * final_count # 跌最终收益
return [[money,InCome_final_down,(InCome_final_down/money-1)*100,cast_down_x,cast_down_y],[money,InCome_final_up,(InCome_final_up/money-1)*100,cast_up_x,cast_up_y]]
def readfile(file_name):
path = 'E:\DataAnalysis\project\money_analysis\Fund_analysis\\'+file_name+'.xls'
data = pd.read_excel(path, index_col='时间',sheet_name='上证50指数A')
return data
def plotMA(pandas_data,other1,other2,plot_name,a,b,c):
title_name = '定投次数:' + str(a) + ' 交易频率:' + str(b) + ' 持有收益率:' + str(c) + '%'
fig, ax = plt.subplots()
ax.scatter(other1, other2, c='r',label = '投资时刻')
ax.plot(range(len(pandas_data['收盘'])), pandas_data['收盘'], 'g--',label=plot_name)
plt.xlabel('交易日')
plt.ylabel('价值')
plt.title(title_name)
plt.legend()
mpl.rcParams['font.sans-serif'] = ['SimHei']
plt.savefig('E:\DataAnalysis\project\money_analysis\Fund_analysis\common\\'+str(a)+'_'+str(b)+'.png')
plt.show()
'''
filename = '数据'
data = readfile(filename)['2018':]
CS_count = 20
CS_fre = 20
money = 10000
Result = Cast_Surely(data['收盘'],CS_count,CS_fre,money)
plotMA(data.copy(),Result[3],Result[4],filename,CS_count,CS_fre,Result[2])
'''
'''
filename = '数据'
data = readfile(filename)['2018':]
CS_count = 'down'
CS_fre = '跌日'
money = 10000
Result = Cast_Surely_1(data,CS_fre,money)
plotMA(data.copy(),Result[0][3],Result[0][4],filename,CS_count,CS_fre,Result[0][2])
#plotMA(data.copy(),Result[1][3],Result[1][4],filename,CS_count,CS_fre,Result[1][2])
'''