第一个可用的策略

指数基金的收益率怎么样?

写一个实用的策略,验证指数基金的收益情况。

获取回测数据

我们从证券宝baostock免费获取中证500(000905)指数数据。

这里我们写了一个工具get_daily_data2.py,具体代码见下文:

使用前需要pip安装baostock,pandas,click这三个python库。

$ python get_daily_data2.py --code sh.000905
login success!
login respond error_code:0
login respond  error_msg:success
query_history_k_data_plus respond error_code:0
query_history_k_data_plus respond  error_msg:success

加载数据

首先我们继承GenericCSVData定义了自己的CSV读取函数。

class BSCSVData(btfeed.GenericCSVData):params = (("fromdate", datetime.datetime(2010, 1, 1)),("todate", datetime.datetime(2019, 12, 31)),('dtformat', ('%Y-%m-%d')),('openinterest', -1))

这里我们主要定义了起始结束时间,时间的格式。

GenericCSVData默认会读取datetime,open,high,low,close,volume,openinterest这些line,并定义了这些数据在CSV文件中对应的列号。

    data = BSCSVData(dataname="./datas/{0}".format(filename))

如果我们的CSV数据中,没有某指标,需要设置该指标为-1。

如果我们的CSV数据中包含了PE指标,并且我们想加载进来,也可以通过这种方式定义。

    ('pe', 7)

数据读取后,在backtrader加载数据很简单,使用adddata函数。

cerebro.adddata(data)

设置现金总额

在backtrader中可以设置初始投入金额:

cerebro.broker.set_cash(1000000.0)

实现策略(买入并持有指数基金)

我们继承bt.Strategy,定制自己的策略。

策略中重要的函数是next,函数next在每个时间点,都会被框架自动调用。

我们的策略很简单,如果发现当前是空仓,就把资金全部投入到目标标的,然后一只持有到天长地久。
购买使用的buy这个方法,这个方法实际上参数很多,可以指定数量购买,可以指定价格购买等方式。

init函数中的dataclose是引用回测数据中收盘价这条line。

总结

从我们回测持有中证500指数10年的情况看,总收益率只有15%,年收益率在1.5%左右。

甚至跑输余额宝这样的现金理财。
有兴趣的话,你也可以尝试评估下沪深300,上证50这样的指数。

回测的完整代码

#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-
from __future__ import (absolute_import, division, print_function,unicode_literals)import datetime  # For datetime objects
import backtrader as bt
import backtrader.feeds as btfeed
import mathclass BSCSVData(btfeed.GenericCSVData):params = (("fromdate", datetime.datetime(2010, 1, 1)),("todate", datetime.datetime(2019, 12, 31)),('dtformat', ('%Y-%m-%d')),('openinterest', -1))# Create a Stratey
class TestStrategy(bt.Strategy):def log(self, txt, dt=None):''' Logging function fot this strategy'''dt = dt or self.datas[0].datetime.date(0)print('%s, %s' % (dt.isoformat(), txt))def __init__(self):# Keep a reference to the "close" line in the data[0] dataseriesself.dataclose = self.datas[0].closedef next(self):# self.log('Close, %.2f' % self.dataclose[0])if not self.position:self.buy(size=math.floor(self.broker.get_cash() / self.dataclose[0]))if __name__ == '__main__':filename = 'bs_sh.000905.csv'cerebro = bt.Cerebro()# 加载自定义策略cerebro.addstrategy(TestStrategy)# 设置金额为一百万cerebro.broker.set_cash(1000000.0)# 加载历史数据data = BSCSVData(dataname="./datas/{0}".format(filename))cerebro.adddata(data)print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())cerebro.run()print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())# 计算总回报率和年度回报率return_all = cerebro.broker.getvalue()/1000000.0print('Total ROI: {0}%, Annual ROI{1}%'.format(round((return_all - 1.0) * 100, 2),round((pow(return_all, 1.0 / 10) - 1.0) * 100, 2)))

执行结果如下:

Starting Portfolio Value: 1000000.00
Final Portfolio Value: 1161006.90
Total ROI: 16.1%, Annual ROI1.5%Process finished with exit code 0

获取数据的完整代码

#!/usr/bin/env python
# -*- coding: utf-8; py-indent-offset:4 -*-""" 从baostock获取daily数据到datas目录下的csv文件当中,文件名如:bs_sh.000001.csv """import baostock as bs
import pandas as pd
import click@click.command()
@click.option("--code", default="sh.600000", help="baostock股票/指数代码,如sh.600000")
@click.option("--start", default="2010-01-01", help="开始日期, 格式如:2010-01-01")
@click.option("--end", default="2020-03-01", help="结束日期, 格式如:2010-01-01")
@click.option("--adj", default="1", help="复权类型(只针对股票):3: 未复权 2:前复权 1:后复权 , 默认1")
def get_data(code, start, end, adj):lg = bs.login()print('login respond error_code:' + lg.error_code)print('login respond  error_msg:' + lg.error_msg)rs = bs.query_history_k_data_plus(code, 'date,open,high,low,close,volume', start_date=start, end_date=end,frequency='d', adjustflag=adj)print('query_history_k_data_plus respond error_code:' + rs.error_code)print('query_history_k_data_plus respond  error_msg:' + rs.error_msg)# 打印结果集data_list = []while (rs.error_code == '0') & rs.next():# 获取一条记录,将记录合并在一起data_list.append(rs.get_row_data())data = pd.DataFrame(data_list, columns=rs.fields)columns = ['date', 'open', 'high', 'low', 'close', 'volume']data.to_csv("./datas/bs_{0}.csv".format(code),sep=',', index=False, columns=columns)if __name__ == "__main__":get_data()

backtrader量化平台教程(二)第一个可用的策略相关推荐

  1. python量化交易第一天_《Python量化交易教程》第一部分新手入门 第1天:谁来给我讲讲Python?...

    一.量化投资视频学习课程 二.Python手把手教学 第1天:谁来给我讲讲Python? PS: 1.注意使用方法,这个以后都有大用 2.注意符号的使用方式 3.尽量用英文表达 4.本日学习内容以及其 ...

  2. 可转债量化系列之二:估值择时策略初探

    摘要 转债研究以估值为核心,周期波动受股票和债券的双重驱动 可转债的核心点在于研究其估值水平,其估值周期通常会受到正股和自身波动的多重影响,本文对于转债择时的研究从估值维度展开. (1)对于转债指标, ...

  3. 量化投资——国内量化平台

    转发:[http://www.360doc.com/content/15/0925/07/1317564_501370544.shtml] 深圳爱智慧科技有限公司 深度学习 智能投顾 机器学习 量化投 ...

  4. Backtrader 基本使用教程 — 量化投资实战教程(1)

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

  5. Arduino可穿戴教程之第一个程序——连接硬件选择板子(二)

    Arduino可穿戴教程之第一个程序--连接硬件选择板子(二) 2.4.2  连接硬件 在选择好示例程序后就可以将LilyPad通过LilyPad编程器连接到电脑了. 2.4.3  选择板子 如果你了 ...

  6. 智能一代云平台(二十三):Mycat高可用的探索

    [前言] 在智能云平台的上篇博文 <智能云平台(二十二):多租户方案比较Hibernate.EclipseLink.Mybatis+Mycat>中讲解了实 现多租户的一种方案是用MySql ...

  7. 苹果消息推送服务教程:第一二部分(共2部分)

    苹果消息推送服务教程:第一部分(共2部分) 转自 http://www.raywenderlich.com/zh-hans/24732/苹果消息推送服务教程:第一部分(共2部分) 这是iOS教程团队的 ...

  8. 第一天: 5天免费搭建个人量化平台 - 预备工作

    第一天: 5天免费搭建个人量化平台 - 预备工作 前言 搭建自己的数据库 Mysql 数据库 Mongodb数据库 安装Python环境及基本库 python建议使用 Anaconda3 第三方库:命 ...

  9. 扫地僧AI量化平台Qlib给力教程系列一:核心篇

    自从去年微软发表Qlib以来,Qlib经历重大升级修订,许多以往的技术介绍文章已经过时.不少学习了Qlib的小伙伴还是经常有疑问: Qlib中怎样使用自己的行情数据? Qlib中怎样自定义因子? In ...

最新文章

  1. SDT(software-defined Things)?软件定义的物件
  2. 认识计算机系统反思,《认识计算机系统》教学反思
  3. 为什么手机升级系统反应慢了_win7系统鼠标右键刷新反应慢原因【解决方法】...
  4. 9. 混合模型和EM(2)
  5. 阿里云ECS——[您的云服务器(xxx.xxx.xxx.xxx)由于被检测到对外攻击,已阻断该服务器对其它服务器端口(TCP:6379)的访问]解决方案
  6. mysql中难以理解的sql
  7. dotNetCharting使用总结
  8. UE4 多个static mesh合并成一个static mesh
  9. SQL Server修改标识列方法 如自增列的批量化修改
  10. php yii结果集合并,PHP 基础之数组合并
  11. python安装包,使用镜像安装
  12. 计算机中的标准差是哪个英语单词,标准差是什么意思
  13. 电脑如何录制在线课程?-QVE屏幕录制
  14. 谈谈未来 APP 产品设计的革命性趋势
  15. Java web实现百度地图导航
  16. 显示计算机工程系老师所教课程的成绩表.,sql查询
  17. Pikachu(皮卡丘)靶场中SQL注入
  18. python操作ipv6_python ipv6计算SQLAlchemy复杂查询
  19. Android SearchView基本用法
  20. 深入理解PID的微分、积分电路

热门文章

  1. 为了解决jetson tx2的内存不足。挂载sd卡,并且使用docker在sd中安装jetPack的镜像。
  2. 2023第十届北京国际老年用品展览会,北京养老服务业展,8月
  3. FPS教程附带源码 更换基址 编译可用 包括csgo cf
  4. swift3实现照片多选,史上最赞(TGPhotoPicker)
  5. 圣诞节这么浪漫的日子,教你用Python制作表白神器—照片墙,操作起来哦
  6. LSH(Locality Sensitive Hashing)局部敏感Hash
  7. 常见路由协议分类及区别
  8. 服务器监控信息表,服务器监控统计表
  9. Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)
  10. ubuntu-16.04 详细安装教程(图文)附下载地址