backtrader量化平台教程(二)第一个可用的策略
第一个可用的策略
指数基金的收益率怎么样?
写一个实用的策略,验证指数基金的收益情况。
获取回测数据
我们从证券宝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量化平台教程(二)第一个可用的策略相关推荐
- python量化交易第一天_《Python量化交易教程》第一部分新手入门 第1天:谁来给我讲讲Python?...
一.量化投资视频学习课程 二.Python手把手教学 第1天:谁来给我讲讲Python? PS: 1.注意使用方法,这个以后都有大用 2.注意符号的使用方式 3.尽量用英文表达 4.本日学习内容以及其 ...
- 可转债量化系列之二:估值择时策略初探
摘要 转债研究以估值为核心,周期波动受股票和债券的双重驱动 可转债的核心点在于研究其估值水平,其估值周期通常会受到正股和自身波动的多重影响,本文对于转债择时的研究从估值维度展开. (1)对于转债指标, ...
- 量化投资——国内量化平台
转发:[http://www.360doc.com/content/15/0925/07/1317564_501370544.shtml] 深圳爱智慧科技有限公司 深度学习 智能投顾 机器学习 量化投 ...
- Backtrader 基本使用教程 — 量化投资实战教程(1)
都说Python可以用于量化投资,但是很多人都不知道该怎么做,甚至觉得是非常高深的知识,其实并非如此,任何人都可以在只有一点Python的基础上回测一个简单的策略. Backtrader是一个基于Py ...
- Arduino可穿戴教程之第一个程序——连接硬件选择板子(二)
Arduino可穿戴教程之第一个程序--连接硬件选择板子(二) 2.4.2 连接硬件 在选择好示例程序后就可以将LilyPad通过LilyPad编程器连接到电脑了. 2.4.3 选择板子 如果你了 ...
- 智能一代云平台(二十三):Mycat高可用的探索
[前言] 在智能云平台的上篇博文 <智能云平台(二十二):多租户方案比较Hibernate.EclipseLink.Mybatis+Mycat>中讲解了实 现多租户的一种方案是用MySql ...
- 苹果消息推送服务教程:第一二部分(共2部分)
苹果消息推送服务教程:第一部分(共2部分) 转自 http://www.raywenderlich.com/zh-hans/24732/苹果消息推送服务教程:第一部分(共2部分) 这是iOS教程团队的 ...
- 第一天: 5天免费搭建个人量化平台 - 预备工作
第一天: 5天免费搭建个人量化平台 - 预备工作 前言 搭建自己的数据库 Mysql 数据库 Mongodb数据库 安装Python环境及基本库 python建议使用 Anaconda3 第三方库:命 ...
- 扫地僧AI量化平台Qlib给力教程系列一:核心篇
自从去年微软发表Qlib以来,Qlib经历重大升级修订,许多以往的技术介绍文章已经过时.不少学习了Qlib的小伙伴还是经常有疑问: Qlib中怎样使用自己的行情数据? Qlib中怎样自定义因子? In ...
最新文章
- SDT(software-defined Things)?软件定义的物件
- 认识计算机系统反思,《认识计算机系统》教学反思
- 为什么手机升级系统反应慢了_win7系统鼠标右键刷新反应慢原因【解决方法】...
- 9. 混合模型和EM(2)
- 阿里云ECS——[您的云服务器(xxx.xxx.xxx.xxx)由于被检测到对外攻击,已阻断该服务器对其它服务器端口(TCP:6379)的访问]解决方案
- mysql中难以理解的sql
- dotNetCharting使用总结
- UE4 多个static mesh合并成一个static mesh
- SQL Server修改标识列方法 如自增列的批量化修改
- php yii结果集合并,PHP 基础之数组合并
- python安装包,使用镜像安装
- 计算机中的标准差是哪个英语单词,标准差是什么意思
- 电脑如何录制在线课程?-QVE屏幕录制
- 谈谈未来 APP 产品设计的革命性趋势
- Java web实现百度地图导航
- 显示计算机工程系老师所教课程的成绩表.,sql查询
- Pikachu(皮卡丘)靶场中SQL注入
- python操作ipv6_python ipv6计算SQLAlchemy复杂查询
- Android SearchView基本用法
- 深入理解PID的微分、积分电路
热门文章
- 为了解决jetson tx2的内存不足。挂载sd卡,并且使用docker在sd中安装jetPack的镜像。
- 2023第十届北京国际老年用品展览会,北京养老服务业展,8月
- FPS教程附带源码 更换基址 编译可用 包括csgo cf
- swift3实现照片多选,史上最赞(TGPhotoPicker)
- 圣诞节这么浪漫的日子,教你用Python制作表白神器—照片墙,操作起来哦
- LSH(Locality Sensitive Hashing)局部敏感Hash
- 常见路由协议分类及区别
- 服务器监控信息表,服务器监控统计表
- Android截屏截图方法汇总(Activity、View、ScrollView、ListView、RecycleView、WebView截屏截图)
- ubuntu-16.04 详细安装教程(图文)附下载地址