利用Python使基金定投收益最大

目录

序言

准备工作:

定投频率与收益

日定投

周定投

月定投

涨日与跌日

涨日定投

跌日定投


序言

博主最近沉迷理财,为了不使编程功力减退,特此使用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])
'''

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海人001

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值