1. 取数

从Wind等数据库取数,拿到净值数据。结构如下图:

2. 用pandas实现回测

  • buy_list可以添加下跌买入幅度,取消最后两行注释即可观察最佳买点
  • 第一个if后的0.005为我设置的卖点,这个可以修改调整
  • 策略描述:涨超0.5%就卖,跌超0.26%就买
import pandas as pd
import numpy as np
import matplotlib.pyplot as pltdf = pd.read_excel('004933.xlsx', skiprows=3)  # 读取标的基金数据,跳过表头
buy_list = [0.00260]  # 买入下跌幅度列表
rev_list = []  # 初始化收益率列表
for rate in buy_list:  # 遍历每一个下跌幅度inv = 0  # 初始投资量为0cash = 1  # 初始账户现金为1total = 1  # 初始账户总额为1holding_days = 0  # 初始持有天数为0deal_num = 0  # 交易笔数inv_date = df.loc[len(df) - 1, 'Date']  # 初始假设投资日期为最后一天df.loc[0, 'vol'] = 0  # 成立日当天波动为0df.loc[0, 'inv'] = inv  # 成立日当天账户净值为1df.loc[0, 'cash'] = cash  # 成立日当天账户净值为1df.loc[0, 'total'] = total  # 成立日当天账户总额为1for i in df.index[1:]:  # 遍历索引vol = (df.loc[i, 'nav'] - df.loc[i-1, 'nav']) / df.loc[i-1, 'nav']  # 计算每日相对于前一日的波动if vol > 0.005 and df.loc[i-1, 'inv'] != 0 and holding_days >= 30:  # 如果涨幅大于0.5%且满仓且持有超30天inv = 0  # 空仓cash = df.loc[i-1, 'inv'] * (1 + vol)  # 现金为当天赎回值elif vol < -rate and df.loc[i-1, 'cash'] != 0:  # 如果跌幅大于0.5%且空仓inv = df.loc[i-1, 'cash']  # 持仓为前一天现金量cash = 0  # 满仓inv_date = df.loc[i, 'Date']  # 买入日期deal_num += 1  # 交易笔数加1else:inv = df.loc[i-1, 'inv'] * (1 + vol)  # 持仓为前一天持仓加波动cash = df.loc[i-1, 'cash']  # 现金为前一天现金holding_days = (df.loc[i, 'Date'] - inv_date).days  # 持有天数为当天减上次买入日期total = inv + cash  # 总量等于持仓加现金df.loc[i, 'vol'] = vol  # 波动率存储到DataFrame中df.loc[i, 'inv'] = inv  # 持仓存储到DataFrame中df.loc[i, 'cash'] = cash  # 现金存储到DataFrame中df.loc[i, 'total'] = total  # 总额存储到DataFrame中# for i, date in enumerate(df['Date']):  # 日期列不要时间只要日期#     df.loc[i, 'Date'] = date.to_pydatetime().date()rev = df.loc[len(df)-1, 'total'] - df.loc[0, 'total']  # 总收益率rev_list.append(rev)  # 加入收益率列表print('买入下跌幅度为%f时:' % rate)print('基金总收益为:{:.2%}'.format(df.loc[len(df)-1, 'nav'] - df.loc[0, 'nav']))print('基金波动率为:{:.2%}'.format(np.std(df['nav'])))print('策略总收益为:{:.2%}'.format(rev))print('策略波动率为:{:.2%}'.format(np.std(df['total'])))print('总交易日数:%d' % len(df))print('持币交易日共:%d个' % (df['cash'] > 0).sum())print('交易笔数:%d' % deal_num)print('平均下跌幅度:{:.2%}'.format(np.mean(df['vol'][df['vol'] < 0])))print('平均上涨幅度:{:.2%}'.format(np.mean(df['vol'][df['vol'] > 0])))print('--------------------分割线--------------------')df.to_excel('004933test.xlsx', index=None)  # 存储回测结果
# plt.plot(buy_list, rev_list)
# plt.show()

回测结果


Python基金投资回测相关推荐

  1. python量化回测框架_股票量化交易回测框架pyalgotrade源码阅读(一)

    PyAlgoTrade是什么呢? 一个股票量化交易的策略回测框架. 而作者的说明如下. To make it easy to backtest stock trading strategies. 简单 ...

  2. python外汇交易回测系统_StarQuant - 综合量化交易回测系统/平台

    Welcome to StarQuant StarQuant(中文名:易数交易系统)是一个轻量的.面向个人( 普通)用户的综合量化交易回测系统,目前主要用于期货期权程序化交易(CTP接口,在实盘测试中 ...

  3. python 策略回测期货_量化投资实战教程(1)—基于backtrader的简单买入卖出策略

    都说Python可以用于量化投资,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基于Py ...

  4. Python backtrader回测之布林带策略

    在做量化分析时,我们有很多种策略,这些策略的好坏如何去评价,那就是用过往数据进行测试.这里就需要用到量化分析的回测系统了.由于刚入门,就使用了Python中的backtrader.由于自己Python ...

  5. python 股票回测书籍推荐_python实现马丁策略回测3000只股票

    python实现马丁策略回测3000只股票 批量爬取股票数据 这里爬取数据继续使用tushare,根据股票代码来遍历,因为爬取数据需要一定时间,不妨使用多线程来爬取,这里要注意tushare规定每分钟 ...

  6. python股票回测_Python量化交易-回测简单的交易策略

    这篇文章主要介绍如何使用Python对一些简单的交易策略进行回测,对这块比较感兴趣的朋友可以看一看. 1.获取证券数据 本文以A股市场为例,先获取A股近10年的数据并保存到数据库. 1.1.安装数据库 ...

  7. python回测函数_【手把手教你】动量指标的Python量化回测

    我认为投资专业的学生只需要两门教授得当的课堂:如何评估一家公司,以及如何考虑市场价格.--巴菲特 01 引言 本文延续"手把手教你使用Python的TA-Lib"系列,以资金流量指 ...

  8. python外汇交易回测系统_易经量化交易系统之回测系统1

    我们在这里向大家介绍如何从零开始,实现一个适合于A股市场的回测系统.在这里我们以A股日K线数据为例,实际上可以比较方便的扩展为分级的数据源. Tick数据类 我们首先定义一个Tick数据的基类,这个类 ...

  9. python量化回测结果分析53课_#滑动平均策略——python回测结果 (中山大学岭南学院量化投资协会)...

    策略如下: 回测区间为2016年10月10日至2017年10月13日,选择沪深300进行回测. 记录所有当天5日滑动平均价格高于20日滑动平均价格的股票 将总资金额的一半n/2用于买入股票,每一支股票 ...

最新文章

  1. python监控错误语句,基于Python的关键字监控及告警
  2. python爬取图片全网通_UC头条:全网通杀——暴强工具推荐: 下载你看到的任意视频...
  3. 神州数码成为华为数通产物总代理
  4. NodeJS”热部署“代码,实现动态调试
  5. 今日头条屏幕适配方案落地研究
  6. Ubuntu 16.04安装Tomcat 8 图解
  7. vs2012打包和部署程序成可安装安装包文件(InstallShield
  8. 【转】GigE Vision简介
  9. ubuntu快速清理磁盘垃圾
  10. python字符串编码_Python字符串编码答疑
  11. gephi生成网络关系图_用 NetworkX + Gephi + Nebula Graph 分析lt;权力的游戏gt;人物关系(上)
  12. 运输层--TCP协议(2)
  13. 修炼成QTP高手的十个步骤
  14. python滑稽脸代码_如何用python进行简单的syn flood滑稽(带代码@)
  15. 破除java网页禁止复制_网页内容禁止复制怎么办?
  16. c语言中char ch和getchar()是什么意思?
  17. ArcGIS API for iOS在俄勒冈大学校园中的创新应用
  18. Gallery 简易图片浏览
  19. 2019全国大众点评数据更新
  20. node 根据xlsx表格数据,批量生成表格文件,并且设置样式和行高

热门文章

  1. 大学英语二_视听说单词
  2. 让虞书欣、李诞拍到停不下来!AR+AI双引擎的互动小游戏,如何打开IP新玩法?...
  3. OpenCV(C++)---调整图像亮度和对比度
  4. Android改变图像的饱和度 亮度和对比度
  5. Greenplum【异常 02】使用Navicat的服务器监控工具解决Greenplum数据库锁表问题
  6. 你见过的最难的编程语言是什么?
  7. SSL协议概述(三)
  8. 解析:type t_string is table of varchar2(32767) index by binary_integer
  9. java当前日期加一个月_用代码实现使当前日期 Date型的数据增加一个月
  10. 打开cmd命令行的常用方法总结