用python教你計算定投能獲得多少收益
- 2019 年 10 月 6 日
- 筆記
問題
所謂定投,就是每隔固定時間(比如每周)購買固定金額的基金。
經常有一些專家告訴你,定投風險小,長期能獲得不錯的收益。因為投資者在高點時買入的份額較少,而在低處買入的份額較多。
我們不妨來用實際數據計算一下,看看定投的收益如何。
問題:長期定投一個滬深300指數基金,能獲得多少收益?
分析
1. 需要獲得滬深指數的數據。
2. 模擬投資,進行計算。比如從2015-01-01開始投資,每周定投500元,到2018-10-01止,計算投資本金和收益,進而得出投資收益率。
過程
1. 獲取滬深數據。
網上有不少獲取股票指數數據的地方,網易有個接口挺不錯,可以獲取任意股票數據。格式如下
http://quotes.money.163.com/service/chddata.html?code=0000001&start=19901219&end=20181003&fields=TCLOSE;HIGH;LOW;TOPEN;LCLOSE;CHG;PCHG;VOTURNOVER;VATURNOVER
code表示股票代碼,0000001為上證指數。滬深300指數編號為0000300。
start為開始日期,格式yyyyMMdd
end為結束日期,格式為yyyyMMdd
fields為返回字段,比如TCLOSE表示收盤價,HIGH表示最高價等等。
直接訪問地址會返回csv格式定文件。
下載滬深300數據,存放到 /data/stock/000300.csv,格式如下
日期,股票代碼,名稱,收盤價,最高價,最低價,開盤價,前收盤,漲跌額,漲跌幅,成交量,成交金額 2018-09-28,000300,滬深300,3438.8649,3444.9884,3404.6973,3409.9598,3403.5902,35.2747,1.0364,84377756,94880274571.6 2018-09-27,000300,滬深300,3403.5902,3423.71,3394.732,3415.9532,3417.2413,-13.6511,-0.3995,69765241,87573300844.9 2018-09-26,000300,滬深300,3417.2413,3448.2595,3383.2352,3388.5576,3379.8043,37.437,1.1077,93173343,1.19113319089e+11 2018-09-25,000300,滬深300,3379.8043,3394.3771,3367.0253,3375.9717,3410.4856,-30.6813,-0.8996,69054693,82870029933.1 2018-09-21,000300,滬深300,3410.4856,3410.4856,3307.767,3320.6958,3310.1258,100.3598,3.0319,108416005,1.23573117858e+11 2018-09-20,000300,滬深300,3310.1258,3332.3093,3303.073,3314.8758,3312.4823,-2.3565,-0.0711,64561057,76660845175.0 2018-09-19,000300,滬深300,3312.4823,3335.9913,3258.3097,3261.997,3269.4319,43.0504,1.3168,89170666,1.09395423838e+11 2018-09-18,000300,滬深300,3269.4319,3270.107,3193.6423,3193.6423,3204.9224,64.5095,2.0128,70425035,83899137593.0 2018-09-17,000300,滬深300,3204.9224,3230.7878,3200.5096,3224.9267,3242.0902,-37.1678,-1.1464,52259547,60650940907.6 2018-09-14,000300,滬深300,3242.0902,3254.1043,3227.9439,3242.8307,3236.5662,5.524,0.1707,60130640,76481211955.9
2. 計算
用python寫一個程序模擬定投程序
#!/usr/bin/python # -*- coding: UTF-8 -*- import operator as op from datetime import datetime,timedelta ''' 加載數據 input: index_no: 指數編號,比如滬深300指數的編號為 000300 start_date:開始日期,格式為 2018-04-03 end_date:結束日期,格式為 2018-04-03 output: 指數列表,只包含日期和收盤價 ''' def load(index_no, start_date, end_date): file = '../../data/stock/' + index_no + '.csv' f = open(file,'r') indices = {} for line in f.readlines(): arr = line.strip().split(',') dt = arr[0] if op.lt(start_date,dt) and op.lt(dt,end_date) : indices[arr[0]] = arr[3] return indices ''' 購買 input: date: 投日日期 amount: 投資金額 data: 指數數據 output: 獲得基金份數 ''' def purchase(date, amount, data): index_value = data[date] return amount/float(index_value) def getIndexValue(date,data): return data[date] ''' 定投 input: start_date: 起投日期 end_date: 終止日期 amount: 每次投資金額 freq: 投資頻率(每幾天投資一次) output: 投資總額,收益總額 ''' def invest(index_no,start_date, end_date, amount, feq): data = load(index_no,start_date,end_date) sd = datetime.strptime(start_date, '%Y-%m-%d') ed = datetime.strptime(end_date, '%Y-%m-%d') curr = sd total_share = 0; total_amount = 0;total_profit=0 last_index = 0 while True: #如果當天不是交易日,則往後延一天. while curr.strftime('%Y-%m-%d') not in data.keys(): curr += timedelta(days = 1) if curr > ed: break if curr > ed: # 超過結束日期則停止 break last_index = float(getIndexValue(curr.strftime('%Y-%m-%d'),data)) #購買基金 shares = purchase(curr.strftime('%Y-%m-%d'), amount, data) total_share += shares total_amount += amount #計算下一個投資日期 curr = curr + timedelta(days = feq) total_profit = last_index*total_share - total_amount return total_amount,total_profit start_date = '2008-10-01' end_date = '2018-10-01' total_amount,total_profit = invest('000300',start_date, end_date,500,7) print('起投日期',start_date) print('結束日期',end_date) print('總投資額',total_amount) print('總收益',round(total_profit)) print('投資收益率',round(total_profit/total_amount*100,2),"%")
3.執行結果
$ python3 investment.py 起投日期 2015-01-01 結束日期 2018-10-01 總投資額 95500 總收益 -4433 投資收益率 -4.64 %
即,從2015年1月1日投資,到2018年10月1日,獲得到收益為-4433,投資收益率 -4.64 %
我們再分析一下,投資1年、2年、3年、5年和10年,分別能獲得多少收益。
投資年限 |
投資金額 |
投資收益 |
收益率 |
年化收益率 |
---|---|---|---|---|
1年 (2017.10.01~2018.10.01) |
25000 |
-2439 |
-9.76% |
-9.76% |
2年 (2016.10.01~2018.10.01) |
50500 |
-3081 |
-6.1 % |
-3.1% |
3年 (2015.10.01~2018.10.01) |
76000 |
-2001 |
-2.63% |
-1% |
5年 (2013.10.01~2018.10.01) |
127000 |
9948 |
7.83 % |
1.52% |
10年 (2008.10.01~2018.10.01) |
252500 |
45320 |
17.95 % |
1.66% |
這還沒有考慮基金公司收取的管理費,考慮進去後,都是負收益!
問題2:
不同的投資頻率,是否影響收益率呢?
以下是通過2008~2018年間,採用不同頻率(每天投一次到每3個月投一次)與總收益的曲線。橫軸是投資間隔天數,縱周是10年投資收益,總體上在20%波動,沒有明顯的趨勢。
下圖是滬深300近10年的走勢圖。
考慮到目前(2018.10)的點位不高(3438.86),所以收益率偏低。我們用近期的高點實驗一下。比如用2018-01-24(滬深300點數為4389.89)作為截止日期,投資期限分別為1年、2年、3年、5年和10年,看一下收益有多少。最近2年還可以,但是10年期對年化收益率僅為4.18%. 當然,因為是定投,所以並不是所有對錢都投了10年,最近投入都錢也許只有1天,資金的平均佔用時間為投資期限/2。
投資年限 |
投資金額 |
投資收益 |
收益率 |
年化收益率 |
---|---|---|---|---|
1年 (2017.01.24~2018.01.24) |
26000 |
4478 |
17.22 % |
17.22 % |
2年 (2016.01.24~2018.01.24) |
51000 |
13117 |
25.72 % |
12.12% |
3年 (2015.01.24~2018.01.24) |
77000 |
16593 |
21.55 % |
6.72% |
5年 (2013.01.24~2018.01.24) |
129000 |
58404 |
45.27% |
7.75% |
10年 (2008.01.24~2018.01.24) |
256500 |
129950 |
50.66% |
4.18% |
這時,投資頻率對收益有些影響,似乎投資頻率越低(間隔越長),總收益越低,總體略微呈下滑趨勢。見下圖:
問題3
如果指數是理想狀況的勻速波動,且投資截止日期的指數為10年來的平均值,投資能獲得多少回報?
比如,指數的走勢為:起始點1500點,上漲的時候每個交易日漲10個點,下跌的時候每個交易日跌10個點。並且長期在1000~2000點之間波動。最終也是1500點。持續10年左右,定投能從波動中賺多少?
理想指數波動情況如下圖所示:
計算結果是
起投日期 2008-01-24 結束日期 2017-12-12 總投資額 253500 總收益 12853 投資收益率 5.07 %
定投收益曲線如下圖所示,剛開始投資時,本金少,收益/損失波動也小。隨着時間的推移,本金越來越大,波動也越來越大。起始時間設為點為1500點,終止投資點為1520點。投資時長10年。收益僅為5.07%。所謂低位多買,高位少買,對收益對影響就這麼多。
備註:本文只是模擬投資,來觀察投資結果,給大家一個感性認識。實際情況,根據股市的行情不同,結果可能有較大差異。另外,因為是定期投資,所以資金占用時間也是需要按時間分攤的,這個因素並沒有考慮。希望有興趣的同學自己算一下。