文档章节

用python教你计算定投能获得多少收益

StanleySun
 StanleySun
发布于 2018/10/03 12:31
字数 1837
阅读 635
收藏 1

问题

所谓定投,就是每隔固定时间(比如每周)购买固定金额的基金。

经常有一些专家告诉你,定投风险小,长期能获得不错的收益。因为投资者在高点时买入的份额较少,而在低处买入的份额较多。

我们不妨来用实际数据计算一下,看看定投的收益如何。

问题:长期定投一个沪深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%。所谓低位多买,高位少买,对收益对影响就这么多。

 

 

备注:本文只是模拟投资,来观察投资结果,给大家一个感性认识。实际情况,根据股市的行情不同,结果可能有较大差异。另外,因为是定期投资,所以资金占用时间也是需要按时间分摊的,这个因素并没有考虑。希望有兴趣的同学自己算一下。

 

 

 

 

© 著作权归作者所有

StanleySun
粉丝 24
博文 46
码字总数 44524
作品 0
技术主管
私信 提问
这一本书教你用Python快速入门深度神经网络

2016年年初,传奇的围棋棋手李世石与一个围棋界的“新手”开始了一系列举世瞩目的较量。 围棋是一种棋盘类游戏,于2500年前发源于中国。它是一种比国际象棋更为复杂的策略游戏,全球有75个国...

异步社区
2018/06/11
0
0
有轻功:用3行代码让Python数据处理脚本获得4倍提速

Python是一门非常适合处理数据和自动化完成重复性工作的编程语言,我们在用数据训练机器学习模型之前,通常都需要对数据进行预处理,而Python就非常适合完成这项工作,比如需要重新调整几十万...

爱喵的程序员
2018/07/26
0
0
力场夏令营Day Five 作业:在力场的Staking经济,这样做你快速提升

前言 2019年8月7日星期一晚上8点,汤洪波老师在千聊上给小白们上了夏令营的第五节公开课。对于汤洪波老师,这边很有必要介绍一下,他是DappPub团队创始人,互联网行业的老兵,是EOS的深更者。...

币圈成长录
08/08
0
0
如何用 Python 编写你喜爱的 R 函数

R 还是 Python ? Python 脚本模仿易使用的 R 风格函数,使得数据统计变得简单易行。 “Python vs. R” 是数据科学和机器学习的现代战争之一。毫无疑问,近年来这两者发展迅猛,成为数据科学、...

作者: Tirthajyoti Sarkar
2018/12/05
0
0
又是一道送命题!女朋友让你教她学Python

近期,某网站发出了一个调查问题: 2018-2019年科技行业最火的关键词有哪些? 上线5小时便有3.6万人参与,经过盘点,“人工智能”和“Python”则脱颖而出,分别获得冠军和亚军。提起AI也许大...

急速奔跑中的蜗牛
05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

最简单的获取相机拍照的图片

  import android.content.Intent;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Environment;import android.provider.MediaStore;import andr......

MrLins
今天
6
0
说好不哭!数据可视化深度干货,前端开发下一个涨薪点在这里~

随着互联网在各行各业的影响不断深入,数据规模越来越大,各企业也越来越重视数据的价值。作为一家专业的数据智能公司,个推从消息推送服务起家,经过多年的持续耕耘,积累沉淀了海量数据,在...

个推
今天
9
0
第三方支付-返回与回调注意事项

不管是支付宝,微信,还是其它第三方支付,第四方支付,支付机构服务商只要涉及到钱的交易都要进行如下校验,全部成功了才视为成功订单 1.http请求是否成功 2.校验商户号 3.校验订单号及状态...

Shingfi
今天
5
0
简述Java内存分配和回收策略以及Minor GC 和 Major GC(Full GC)

内存分配: 1. 栈区:栈可分为Java虚拟机和本地方法栈 2. 堆区:堆被所有线程共享,在虚拟机启动时创建,是唯一的目的是存放对象实例,是gc的主要区域。通常可分为两个区块年轻代和年老代。更...

DustinChan
今天
7
0
Excel插入批注:可在批注插入文字、形状、图片

1.批注一直显示:审阅选项卡-------->勾选显示批注选项: 2.插入批注快捷键:Shift+F2 组合键 3.在批注中插入图片:鼠标右键点击批注框的小圆点【重点不可以在批注文本框内点击】----->调出批...

东方墨天
今天
7
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部