Python分析10萬條基金數(shù)據(jù),探索基金定投的奧秘
基金定投這個名詞大家都不陌生,喜歡理財?shù)呐笥芽赡芏紘L試過,今天我想給大家分享是,用python模擬基金定投和普通投的過程,并進(jìn)行簡單比較,探索基金定投的奧秘。
1.分析單支基金定投收益情況
基金數(shù)據(jù)已經(jīng)給大家準(zhǔn)備好了,首先用pandas讀?。?/p>
import?pandas?as?pd
data=pd.read_csv('基金數(shù)據(jù).csv',encoding='gbk')
data

總共92390條
以‘161724’基金為例,起投100,從2020年1月2日到2020年12月18日,工作日每日定投100,計算收益并可視化展示。
首先選出該基金在上述時間段內(nèi)的數(shù)據(jù),代碼如下:
import?datetime
s_date?=?datetime.datetime.strptime('2020-01-01',?'%Y-%m-%d').date()
data['日期']=[datetime.datetime.strptime(i.replace('/','-'),?'%Y-%m-%d').date()?for?i?in?list(data['日期'])]
data1=data[(data['代碼']==161724)?&?(data['日期']?>=?s_date)]
data1

就算定投和普通投收益并可視化展示(計算方式參考注釋):
#定投收益率計算
portion1=0??#總份額
for?i?in?list(data1['日期'])[::-1]:
????dwjz=data1[data1['日期']==i]['單位凈值'].values[0]
????portion1+=float(100/dwjz)
capital=100*len(list(data1['日期']))???#本金=100*天數(shù)
profit1=int(portion1*data1[data1['日期']==i]['單位凈值'].values[0])????#本金+收益=份額*單位凈值
#正常投資收益率計算
profit2=(capital/(data1['單位凈值'].values[-1]))*data1['單位凈值'].values[0]??#本金+收益=份額*單位凈值
可視化展示:
from?pyecharts?import?options?as?opts
from?pyecharts.charts?import?Bar
from?pyecharts.globals?import?ThemeType
kind=['定投','普投']
l1=[capital,capital]
l2=[profit1,int(profit2)]
bar?=?(
????Bar(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
????.add_xaxis(kind)
????.add_yaxis("本金",?l1)
????.add_yaxis("收益",?l2)
????.set_global_opts(title_opts=opts.TitleOpts(title="定投與普投收益比較",?subtitle="2020-161724"),
????????????????????toolbox_opts=opts.BrushOpts(),)
)
bar.render_notebook()
通過上圖可以看出,本年23400固定的情況下,2020年一年的時間,定投比普投多收入1千元,差別不是很大。
2.設(shè)置隨機(jī)時間段
有的朋友會說,僅靠一個時間段,局限性和偶然性太大,下面我們隨機(jī)設(shè)置30個時間段,并用折線圖來比較最終結(jié)果:
首先,我們將30個時間段的收益結(jié)果存入列表中,代碼如下:
import?random
result=[]
for?i?in?range(30):
????s=random.choice(list(data1['日期']))
????e=random.choice(list(data1['日期']))
????if?s>e:
????????t=s
????????s=e
????????e=t
????portion1=0??#總份額
????for?j?in?list(data1['日期'])[list(data1['日期'])[::-1].index(s):list(data1['日期'])[::-1].index(e)]:
????????dwjz=data1[data1['日期']==j]['單位凈值'].values[0]
????????portion1+=float(100/dwjz)
????capital=100*len(list(data1['日期'])[list(data1['日期'])[::-1].index(s):list(data1['日期'])[::-1].index(e)])???#本金
????profit1=int(portion1*data1[data1['日期']==j]['單位凈值'].values[0])????#定投本金+收益
????profit2=(capital/(data1['單位凈值'].values[-1]))*data1['單位凈值'].values[0]
????result.append(['第{}次'.format(i+1),capital,profit1,int(profit2)])
result
[['第1次', 15300, 13557, 18520],
['第2次', 3200, 3422, 3873],
['第3次', 17100, 18548, 20699],
['第4次', 12100, 12441, 14646],
['第5次', 18800, 20094, 22757],
['第6次', 4000, 3595, 4841],
['第7次', 13900, 12782, 16825],
['第8次', 7400, 7021, 8957],
['第9次', 700, 687, 847],
['第10次', 7600, 7508, 9199],
['第11次', 10600, 10705, 12831],
['第12次', 1600, 1598, 1936],
['第13次', 900, 902, 1089],
['第14次', 12200, 12551, 14767],
['第15次', 5200, 4452, 6294],
['第16次', 1400, 1282, 1694],
['第17次', 3100, 2942, 3752],
['第18次', 15300, 16436, 18520],
['第19次', 15300, 14039, 18520],
['第20次', 8100, 7218, 9804],
['第21次', 100, 100, 121],
['第22次', 13600, 11708, 16462],
['第23次', 3900, 3656, 4720],
['第24次', 1300, 1291, 1573],
['第25次', 11100, 12648, 13436],
['第26次', 15100, 13296, 18278],
['第27次', 17700, 17189, 21425],
['第28次', 3500, 3485, 4236],
['第29次', 18900, 20274, 22878],
['第30次', 13400, 12638, 16220]]
對結(jié)果進(jìn)行可視化:
import?pyecharts.options?as?opts
from?pyecharts.charts?import?Line
line=(
????Line(init_opts=opts.InitOpts(theme=ThemeType.VINTAGE))
????.add_xaxis(xaxis_data=[t[0]?for?t?in?result])
????.add_yaxis(
????????series_name="定投",
????????y_axis=[t[2]?for?t?in?result],
????????symbol="triangle",
????????symbol_size=10,
????????linestyle_opts=opts.LineStyleOpts(color="red",?width=2,?type_="dashed"),
????????label_opts=opts.LabelOpts(is_show=False),
????????itemstyle_opts=opts.ItemStyleOpts(
????????????border_width=3,?border_color="yellow",?color="red"
????????),
????????markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
????)
????.add_yaxis(
????????series_name="普投",
????????y_axis=[t[3]?for?t?in?result],
????????symbol="circle",
????????symbol_size=10,
????????linestyle_opts=opts.LineStyleOpts(color="blue",?width=2,?type_="dashed"),
????????label_opts=opts.LabelOpts(is_show=False),
????????itemstyle_opts=opts.ItemStyleOpts(
????????????border_width=3,?border_color="yellow",?color="blue"
????????),
????????markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
????????
????)
????.set_global_opts(
????????xaxis_opts=opts.AxisOpts(type_="category"),
????????yaxis_opts=opts.AxisOpts(
????????????type_="value",
????????????axistick_opts=opts.AxisTickOpts(is_show=True),
????????????splitline_opts=opts.SplitLineOpts(is_show=True),
????????),
????????tooltip_opts=opts.TooltipOpts(is_show=False),
????)
)
line.render_notebook()
根據(jù)上圖,30個時間段內(nèi),普投的最終平均值為10990元,定投為8935.5,普投的總體情況較好。
3.設(shè)置隨機(jī)基金
為做進(jìn)一步探索,繼續(xù)擴(kuò)大數(shù)據(jù)范圍,隨機(jī)選擇20支基金,計算在30個隨機(jī)時間段內(nèi)的平均收益情況:
首先各時間段內(nèi)的總收益,存入字典中:
import?numpy?as?np
codes=random.sample(list(data['代碼']),20)
results={}
for?i?in?range(1,31):
?????results['第{}次'.format(i)]=np.array([0,0,0])
for?code?in?codes[1:2]:
????data2=data[(data['代碼']==code)]
????result=[]
????capital=0
????profit1=0
????profit2=0
????for?i?in?range(1,31):
????????s=random.choice(list(data1['日期']))
????????e=random.choice(list(data1['日期']))
????????if?s>e:
????????????t=s
????????????s=e
????????????e=t
????????portion1=0??#總份額
????????for?j?in?list(data1['日期'])[list(data1['日期'])[::-1].index(s):list(data1['日期'])[::-1].index(e)]:
????????????dwjz=data1[data1['日期']==j]['單位凈值'].values[0]
????????????portion1+=float(100/dwjz)
????????capital=100*len(list(data1['日期'])[list(data1['日期'])[::-1].index(s):list(data1['日期'])[::-1].index(e)])???#本金
????????profit1=int(portion1*data1[data1['日期']==j]['單位凈值'].values[0])????#定投本金+收益
????????profit2=(capital/(data1['單位凈值'].values[-1]))*data1['單位凈值'].values[0]
????????results['第{}次'.format(i)]+=np.array([capital,profit1,int(profit2)])
將結(jié)果可視化:
import?pyecharts.options?as?opts
from?pyecharts.charts?import?Line
fina=[results[i].tolist()?for?i?in?list(results.keys())]
line1=(
????Line(init_opts=opts.InitOpts(theme=ThemeType.ROMANTIC))
????.add_xaxis(xaxis_data=list(results.keys()))
????.add_yaxis(
????????series_name="本金",
????????y_axis=[t[0]/20?for?t?in?fina],
????????symbol="triangle",
????????symbol_size=10,
????????linestyle_opts=opts.LineStyleOpts(color="yellow",?width=2,?type_="dashed"),
????????label_opts=opts.LabelOpts(is_show=False),
????????itemstyle_opts=opts.ItemStyleOpts(
????????????border_width=3,?border_color="yellow",?color="yellow"
????????),
????????markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
????)
????.add_yaxis(
????????series_name="定投",
????????y_axis=[t[1]/20?for?t?in?fina],
????????symbol="triangle",
????????symbol_size=10,
????????linestyle_opts=opts.LineStyleOpts(color="red",?width=2,?type_="dashed"),
????????label_opts=opts.LabelOpts(is_show=False),
????????itemstyle_opts=opts.ItemStyleOpts(
????????????border_width=3,?border_color="red",?color="red"
????????),
????????markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
????)
????.add_yaxis(
????????series_name="普投",
????????y_axis=[t[2]/20?for?t?in?fina],
????????symbol="circle",
????????symbol_size=10,
????????linestyle_opts=opts.LineStyleOpts(color="blue",?width=2,?type_="dashed"),
????????label_opts=opts.LabelOpts(is_show=False),
????????itemstyle_opts=opts.ItemStyleOpts(
????????????border_width=3,?border_color="blue",?color="blue"
????????),
????????markline_opts=opts.MarkLineOpts(data=[opts.MarkLineItem(type_="average")]),
????????
????)
????.set_global_opts(
????????xaxis_opts=opts.AxisOpts(type_="category"),
????????yaxis_opts=opts.AxisOpts(
????????????type_="value",
????????????axistick_opts=opts.AxisTickOpts(is_show=True),
????????????splitline_opts=opts.SplitLineOpts(is_show=True),
????????),
????????tooltip_opts=opts.TooltipOpts(is_show=False),
????)
)
line1.render_notebook()
從上圖可以看出,普投的收益情況要高于定投。
說明:本文模型比較簡單,僅作為學(xué)習(xí)pyhton數(shù)據(jù)分析的素材,不作為投資依據(jù),感興趣的朋友可以繼續(xù)深入探索。另外,若對本文有疑問,請在留言區(qū)評論。
程序員GitHub,現(xiàn)已正式上線! 接下來我們將會在該公眾號上,專注為大家分享GitHub上有趣的開源庫包括Python,Java,Go,前端開發(fā)等優(yōu)質(zhì)的學(xué)習(xí)資源和技術(shù),分享一些程序員圈的新鮮趣事。
推薦閱讀:
這個GitHub 1400星的Git魔法書火了,斯坦福校友出品丨有中文版 賊 TM 好用的 Java 工具類庫 超全Python IDE武器庫大總結(jié),優(yōu)缺點一目了然! 秋招來襲!GitHub28.5顆星!這個匯聚阿里,騰訊,百度,美團(tuán),頭條的面試題庫必須安利! 收獲10400顆星!這個Python庫有點黑科技,竟然可以偽造很多'假'的數(shù)據(jù)! 牛掰了!這個Python庫有點逆天了,竟然能把圖片,視頻無損清晰放大!
點這里,獲取一大波福利





