首页 股吧 正文

python基金(Python基金计算n日净值)

2022-04-07 17:04:36 127
admin

咱们也会有惊骇和贪婪,只不过在他人贪婪的时分咱们惊骇,在他人惊骇的时分咱们贪婪。——巴菲特

导言

继上一篇文章《

Python数说指数定投战略》,今日为咱们共享一篇推文(原文来历:SAMshare),评论一下愈加深化的Ideas,总结来说主要有两点:1) 是否存在最适宜的定投周期?

2) 咱们究竟要设置多少止盈点较为适宜?

什么意思呢?咱们打开来说,

??关于第一点:是否存在最适宜的定投周期?

基金定投作为"懒人理财"的头号玩家,当然得遵循其"懒人"思想,咱们想知道究竟定投多久,才能说大约率地取得较为满足的收益。

这儿有几个点需求理一下:

进场的随机性:由于涉及到实际操作,每个人的进场时刻不尽相同,所以这儿评论最适宜的定投周期,要考虑进场机遇的随机性。指数的异质性:咱们评论的是指数基金,但不同的指数之间,也是或许会存在不一样的性质,这儿也要考虑。人道的缺陷:由于是定投,实际操作的仍是人,所以当定投期完毕时,是否会由于其时是所谓的"上涨"or"跌落"行情而纠结?何为"满足的收益”:怎么判别“满足”呢,不同人对满足的心情不同,怎么界说一个基准。

针对以上的几点,我在自己思考后给出了下面的验证办法:

在指定的定投周期内(定投周期为0.5年的整数倍),遍历一切或许的进场点,卖出点取离场点当月的指数均值,假如收益率大于余额宝定存相同周期时刻内的收益的,即为之"满足",一同验证多几个指数。

简略解释一下,咱们验证的定投周期,均是0.5年的整数倍,比方定投1年、1.5年、2年等等,买入日期,挑选月初,而卖出点,不会是最终的那个月的月初,而是取其当月的指数均值,比方2019年1月1日开始定投,定投1年,那么卖出点便是2020年2月的指数均值,便是为了避免有的人由于其时股价改变而呈现的纠结心情。

当指数基金定投收益率大于余额宝定存收益率的,记为1,为咱们的正样本,反之则记为0,为咱们的负样本。咱们就来核算一下,不同的定投周期,正负样本的份额关系,看下怎么样的定投周期,具有较大约率的"满足"成果!

??关于第二点:咱们究竟要设置多少止盈点较为适宜?

关于这点,咱们便是为了找出多少的止盈点较为适宜。这个结合咱们上篇文章的内容,咱们知道假如咱们定投的周期越长,收益率当然便是越大的,所以,不同定投周期之间的收益率没有可比性。所以咱们需求指定一个定投周期(权且咱们用第一点得到的"最优"定投周期N来作为咱们的观测周期)。

咱们的验证办法:

在指定的定投周期内,遍历一切或许的进场点,卖出点取离场点当月的指数均值,记载此刻的收益率状况,核算收益率的大约率会集区间,即为咱们的参阅止盈点。

接下来,咱们就针对以上的2个内容,来用python代码验证一波。(:show time~)

python基金(Python基金计算n日净值)

是否存在最适宜的定投周期?

1. 导入相关库

1# -*- coding: UTF-8 -*- 2import matplotlib as mpl 3import matplotlib.pyplot as plt 4import pandas as pd 5import numpy as np 6import tushare as ts 7from datetime import datetime 8 9#处理中文显现问题,Mac10%matplotlib inline11from matplotlib.font_manager import FontProperties1213plt.rcParams['figure.figsize'] = (10.0, 4.0) # 设置figure_size尺度14plt.rcParams['image.interpolation'] = 'nearest' # 设置 interpolation style15plt.rcParams['image.cmap'] = 'gray' # 设置 色彩 style16plt.rcParams['savefig.dpi'] = 100 #图片像素17plt.rcParams['figure.dpi'] = 100 #分辨率1819# 使用plotly绘图20import plotly.offline as of21import plotly.graph_objs as go

2. 数据获取

这儿仍是适用Tushare的接口来获取数据,详细代码如下:

1# 设置token 2ts.set_token('your token') 3 4# 初始化接口 5pro = ts.pro_api() 6 7# 获取基本信息 8sh_basic = pro.index_basic(market='SSE') # 上交所 9sz_basic = pro.index_basic(market='SZSE') # 深交所101112# 000001.SH 上证综指13# 399001.SZ 深证成指14data_sh = pro.index_daily(ts_code='000001.SH', start_date='19901219', end_date='20190401')15data_sz = pro.index_daily(ts_code='399001.SZ', start_date='19901219', end_date='20190401')16data_sh.head()

3. 代码封装

对上面提及的验证办法进行逻辑封装:

1def Log_of_AIP(data, n, money): 2 ''' 3 data:测试数据集,即指数前史走势数据 4 n:定投周期,6个月的整数倍,如n=1代表定投6个月 5 money:定投金额 6 ''' 7 8 data = data.loc[:,['open','trade_date']] 9 data['trade_month'] = data['trade_date'].apply(lambda x:str(x)[0:6])10 data['date'] = data['trade_date'].apply(lambda x:datetime.strptime(x,'%Y%m%d'))11 data = data.set_index('date').sort_index()1213 # 假定余额宝的年化收益率为 4%14 data['余额宝利率'] = (4.0/100+1)**(1.0/250)-1 15 data['理财收益_净值'] = (data['余额宝利率']+1).cumprod()1617 # 挑选每个月的第一个买卖日进行定投18 trading_day = data.resample('M', kind='date').first()1920 # 确认循环次数,由于得确保满足定投周期21 try:22 All_Sales = pd.DataFrame()23 for i in range(len(trading_day) - (6*n)):24 # 在定投周期完毕后一个月卖出25 trading_cycle = trading_day.iloc[i:i+6*n+1] 2627 # 核算卖出点 下个月的指数均值28 in_month = data[data['trade_month']==list(trading_cycle['trade_month'][-1:])[0]]29 sales_point = in_month.pivot_table(values='open', index='trade_month').mean().values[0]303132 # 定投指数基金33 AIP = pd.DataFrame(index=trading_cycle.index)34 AIP['定投金额'] = int(money)3536 # 以基金当天的开盘价作为当天买入的价格37 AIP['基金价格'] = trading_cycle['open']38 AIP['购买基金份额'] = AIP['定投金额']/AIP['基金价格']39 AIP['累计基金份额'] = AIP['购买基金份额'].cumsum()4041 # 定时购买理财产品42 AIP['购买理财产品份额'] = AIP['定投金额']/trading_cycle['理财收益_净值']43 AIP['累计理财产品份额'] = AIP['购买理财产品份额'].cumsum()4445 # 累计投入本金46 AIP['累计定投本金'] = AIP['定投金额'].cumsum()4748 # 核算每个买卖日的本息(即本金+利息,公式=当天的份额 X 当天的基金价格)49 result = pd.concat([trading_cycle, AIP], axis=1)50 result['基金本息'] = (result['open'] * result['累计基金份额']).astype('int')51 result['理财本息'] = (result['理财收益_净值'] * result['累计理财产品份额']).astype('int')5253 # 买入点 result['trade_date'][0]54 # 定投周期(月) 6*n55 # 定投投入本金 result['累计定投本金'][-2:-1][0]56 # 基金卖出后本息 result['累计基金份额'][-2:-1][0] * sales_point57 # 余额宝卖出后本息 result['理财本息'][-2:-1][0]585960 Each_Sales = pd.DataFrame([[result['trade_date'][0], 61 6*n, 62 result['累计定投本金'][-2:-1][0],63 result['累计基金份额'][-2:-1][0] * sales_point, 64 result['理财本息'][-2:-1][0]]], 65 columns=['买入点','定投周期(月)', '累计定投本金', '基金卖出后本息', '余额宝卖出后本息'])66 Each_Sales['基金收益率%'] = 100*(Each_Sales['基金卖出后本息'][0]/Each_Sales['累计定投本金'][0] - 1)67 Each_Sales['余额宝收益率%'] = 100*(Each_Sales['余额宝卖出后本息'][0]/Each_Sales['累计定投本金'][0] - 1)68 Each_Sales['LikeOrNot'] = Each_Sales['基金卖出后本息'] > Each_Sales['余额宝卖出后本息'] 69 All_Sales = All_Sales.append(Each_Sales)7071 return All_Sales7273 except:74 print("定投周期大于前史股价走势!请从头设置定投周期。")757677def Rate_of_Like(data, money):78 data= data79 money= money8081 Rate_of_like = pd.DataFrame()82 for i in range(int(len(trading_day)/6)):83 tt = Log_of_AIP(data_sh, i+1, 2000)84 rate = pd.DataFrame([[(i+1)*6, (tt['LikeOrNot'].value_counts()/len(tt))[True]]], 85 columns=['定投周期(月)','定投基金满足占比'])86 Rate_of_like = Rate_of_like.append(rate)87 return Rate_of_like

4. 函数调用&猜测验证

1rate_of_sh = Rate_of_Like(data_sh, 2000)2rate_of_sh.head() 1# 绘拟定投满足概率图 2of.offline.init_notebook_mode(connected=True) 3 4trace1 = go.Scatter( 5 x=rate_of_sh['定投周期(月)'], 6 y=rate_of_sh['定投基金满足占比'], 7 mode = 'lines+markers', 8 name = '定投基金满足的次数占比' 9)10data = go.Data([trace1])1112layout = dict(title = '是否存在最适宜的定投周期?',13 yaxis = dict(showgrid=True, #网格14 zeroline=False, #是否显现基线,即沿着(0,0)画出x轴和y轴15 nticks=20,16 showline=True,17 title='定投基金满足的次数占比'),1819 xaxis = dict(showgrid=True, #网格20 zeroline=False, #是否显现基线,即沿着(0,0)画出x轴和y轴21 nticks=20,22 showline=True,23 title='定投周期(月)')24 )25fig = dict(data=data, layout=layout)26of.plot(fig, filename='rate_of_like')

上面,我仅仅验证了上证综指,从数据中能够看出,当定投周期超出240个月,即20年,咱们取得满足(即定投收益跑赢余额宝定存收益)的基金定投的概率超出80%!

此外,咱们看到,如同定投周期在300个月以上,取得满足的概率居然得到了100%,可是咱们知道这不太符合实际,原因是由于这基本是从上证开盘就开始定投,也不太满足咱们的实际操作。

综上所述:(针对上证综指)

定投周期在50个月之内的,取得满足的概率是一半一半,定投的威力还没表现出来;当定投周期在60个月左右的满足概率与定投60~120个月的满足概率差不多;定投240个月左右的满足概率能够到达80%,定投的威力总算来了!

设置多少止盈点较为适宜?

1. 函数调用

1log = Log_of_AIP(data_sh, 40, 2000) 2log = log.sort_values(['基金收益率%']) 3 4# 转化为密度函数,以10%为一个单位 5log['density'] = log['基金收益率%'].apply(lambda x:int(x/10)) 6log2 = log.pivot_table(values='LikeOrNot', index='density', aggfunc=len).reset_index() 7log2['density2'] = log2['density'].apply(lambda x:str(10*x) +'%~'+str(10*(x+1)) + '%') 8 9# 帕累托图10log2['density3'] = log2['density'].cumsum()11log2['density4'] = log2['density3']/(log2.tail(1).reset_index()['density3'][0])12log2

2. 猜测制作

这儿仅仅贴了其间一个制作代码:

1# 制作收益分布图 2of.offline.init_notebook_mode(connected=True) 3 4trace1 = go.Scatter( 5 x = pd.Series(range(len(log))), 6 y = log['基金收益率%'], 7 mode = 'markers', 8 name = '基金 收益率分布图' 9)1011trace2 = go.Scatter(12 x = pd.Series(range(len(log))),13 y = log['余额宝收益率%'],14 mode = 'markers',15 name = '余额宝 收益率分布图'16)1718data = go.Data([trace1,trace2])1920layout = dict(title = '设置多少止盈点较为适宜?',21 yaxis = dict(showgrid=True, #网格22 zeroline=False, #是否显现基线,即沿着(0,0)画出x轴和y轴23 nticks=20,24 showline=True,25 title='出资收益率%'),2627 xaxis = dict(showgrid=True, #网格28 zeroline=False, #是否显现基线,即沿着(0,0)画出x轴和y轴29 nticks=20,30 showline=True,31 title='迭代次数'32 )33 )34fig = dict(data=data, layout=layout)35of.plot(fig,filename='log')

咱们依照定投最优的周期(240个月)来进行止盈点的核算,从上图能够看出,余额宝在定投240个月后,收益率大约维持在50%左右,而基金大多数的收益率都是大于余额宝的。

依据基金的收益率,我进行了密度转化,能够看出,咱们的收益率,大致都是会集在60~70%之间。

综上所述:(针对上证综指)

定投20年基金,大约率(80%)水平上会取得比余额宝要好得多的收益;定投20年基金,止盈点定在80~90%,产生的或许性为80%;定投20年基金,止盈点定在130~140%,产生的或许性为50%;定投20年基金,止盈点定在200~210%,产生的或许性为20%;

其他战略

此外,我也从网上看到了其他更佳杂乱的出资战略,这儿就先不验证,先放出来给咱们参阅,下次一同验证:

办法一:高抛低吸降本钱

熊市中,不要信任某一次上涨行情或许是新一轮牛市的初步,牛市的到来远远比你幻想的要悠远。关于部分套牢的基金,主张在反弹10%以上时,逐渐卖出,保存一部分底仓。然后遇到跌落,再买回来。这样做,大约率上会降低本钱。

要牢牢记住,反弹多了就减仓,就算你很不幸,卖在了牛市的起步阶段,你也能够在牛市行情建立的时分再买回来。

这样高抛低吸的来回买卖,对自动办理型基金来说,本钱费用太高。主张买入创业板ETF或许中小板ETF,手续费更廉价。

办法二:10%补仓法

不断进行补仓,使亏本份额控制在10%以内,然后一个10%的反弹就解套了。是不是很简略?缺陷便是要有满足的资金。

本文总结

咱们经过上述的验证,大致能够得到下面的定论,当然这个定论是针对上证综指的,按道理我应该看过几个指数,可是授之以鱼不如授之以渔,办法都在代码里,咱们无妨自己着手试试?自己得到一些定论不是来得更有feel不

定投周期在50个月之内的,定投跑赢余额宝的概率是50%;当定投周期在60个月(5年)左右的满足概率与定投60~120个月的满足概率差不多,大约是65%;定投240个月(20年)左右的满足概率能够到达80%,大约率水平上会取得比余额宝要好得多的收益!定投20年基金,止盈点定在80~90%,产生的或许性为80%;定投20年基金,止盈点定在130~140%,产生的或许性为50%;定投20年基金,止盈点定在200~210%,产生的或许性为20%;

Reference

深度实战,当下最好的出资战略 — 复利人生Python在基金定投上的验证

关于Python金融量化

专心于共享Python在金融量化范畴的使用。参加常识星球,能够免费获取30多g的量化出资视频材料、大众号文章Python完好源码、量化出资前沿剖析结构,与博主直接沟通、结识圈内朋友等。

收藏
分享
海报
127