BackTrader 简单BTC的SMA15回测DEMO
import time
import requests
import json
import csv
from requests.packages.urllib3 import disable_warnings
disable_warnings()
#BTC历史价格获取
if __name__ == '__main__': time_stamp = int(time.time())
print(f"Now timestamp: {time_stamp}")
# 1367107200
request_link = f"https://web-api.coinmarketcap.com/v1/cryptocurrency/ohlcv/historical?convert=USD&slug=bitcoin&time_end={time_stamp}&time_start=1367107200"
print("Request link: " + request_link)
r = requests.get(url = request_link,timeout=120,verify=False)
#print(r.content)
# 返回的数据是 JSON 格式,使用 json 模块解析
content = json.loads(r.content)
#print(type(content))
quoteList = content['data']['quotes']
#print(quoteList) with open('BTC.csv','w' ,encoding='utf8',newline='') as f:
csv_write = csv.writer(f)
csv_head = ["Date","Open","High","Low","Close","Volume"]
csv_write.writerow(csv_head) for quote in quoteList:
quote_date = quote["time_open"][:10]
open_price = "{:.2f}".format(quote["quote"]["USD"]["open"])
high_price = "{:.2f}".format(quote["quote"]["USD"]["high"])
low_price = "{:.2f}".format(quote["quote"]["USD"]["low"])
close_price = "{:.2f}".format(quote["quote"]["USD"]["close"])
quote_volume = "{:.2f}".format(quote["quote"]["USD"]["volume"])
csv_write.writerow([quote_date, open_price, high_price,low_price ,close_price ,quote_volume])
print('over')
import backtrader as bt
import pandas as pd
import matplotlib.pyplot as plt
import datetime as dt
import numpy as np
#talib
class MyStrategy(bt.Strategy):
def __init__(self):
self.dataclose = self.data0.close
self.order = None
self.buyprice = None
self.buycomm = None
self.sma = bt.indicators.MovingAverageSimple(self.data0,period=15)
# self.macd = bt.indicators.MACD(self.data0,period_me1=12,period_me2=26,period_signal=9)
# self.boll = bt.indicators.BollingerBands(self.data0,period=21)
# self.mcross = bt.indicators.CrossOver(self.macd.macd, self.macd.signal)
def next(self): if not self.position:
if self.dataclose[0] > self.sma[0]:
self.buy()
else:
if self.dataclose[0] > self.sma[0]:
self.close() # if not self.position:
# if self.mcross:
# if def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
return
if order.status in [order.Completed]:
if order.isbuy():
self.log(
'BUY EXECUTED, Price: % .2f, Cost: % .2f, Comm % .2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
else:
self.log(
'SELL EXECUTED, Price: % .2f, Cost: % .2f, Comm % .2f' %
(order.executed.price,
order.executed.value,
order.executed.comm))
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
self.bar_executed = len(self)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
self.order = None def notify_trade(self, trade):
if not trade.isclosed:
return
self.log(' OPERATION PROFIT, GROSS %.2f, NET %.2f' %
(trade.pnl,trade.pnlcomm))
def log(self,txt,dt=None,doprint=True):
if doprint:
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt)) if __name__ == '__main__':
cerebro = bt.Cerebro()
dataframe = pd.read_csv('BTC.csv')
dataframe['Datetime'] = pd.to_datetime(dataframe['Date'])
dataframe.set_index('Datetime',inplace=True)
data_btc = bt.feeds.PandasData(dataname=dataframe,timeframe = bt.TimeFrame.Days)
#timeframe = bt.TimeFrame.Days
cerebro.adddata(data_btc) cerebro.addstrategy(MyStrategy)
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name= 'SharpeRatio')
cerebro.addanalyzer(bt.analyzers.DrawDown ,_name= 'DrawDown') cerebro.broker.set_cash(10000)
cerebro.broker.setcommission(0.001)
cerebro.addsizer(bt.sizers.PercentSizer,percents = 90) result = cerebro.run()
print('夏普比率:',result[0].analyzers.SharpeRatio.get_analysis()['sharperatio'])
print('最大回撤:',result[0].analyzers.DrawDown.get_analysis()['max']['drawdown'])
cerebro.plot()
来源:https://www.bilibili.com/video/BV1QR4y147rS?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=c81b130b6f8bb3082bdb42226729d69c
BackTrader 简单BTC的SMA15回测DEMO的更多相关文章
- OnePy--构建属于自己的量化回测框架
本文主要记录我构建量化回测系统的学习历程. 被遗弃的项目:Chandlercjy/OnePy_Old 新更新中的项目:Chandlercjy/OnePy 目录 1. 那究竟应该学习哪种编程语言比较好呢 ...
- 如何使用TradingView(TV)回测数字货币交易策略
更多精彩内容,欢迎关注公众号:数量技术宅.想要获取本期分享的完整策略代码,请加技术宅微信:sljsz01 TradingView平台简介 前段时间,有粉丝找到技术宅,表示他有一个常用的交易平台,叫做T ...
- WeQuant比特币交易策略回测记录
程序参数 PARAMS = { "start_time": "2017-02-01 00:00:00", "end_time": " ...
- 量化投资策略:常见的几种Python回测框架(库)
量化投资策略:常见的几种Python回测框架(库) 原文地址:http://blog.csdn.net/lawme/article/details/51454237 本文章为转载文章.这段时间在研究量 ...
- 回测框架pybacktest简介(一)
pybacktest 教程 本教程让你快速了解 pybacktest's 的功能.为此,我们回测精典交易策略移动平均线MA交叉. MA快线上穿慢线时,买进做多 MA快线下穿慢线时,卖出做空 进场规则, ...
- 回测框架pybacktest简介(二)
pybacktest 的疑点 第(一)节“教程”原文,是用 ipython notebook 写成,程序代码是一些片段组成. 为了阅读方便,合并在一起. 本文转载于:http://blog.csdn. ...
- WeQuant教程—1.3 利用回测工具降低交易风险
量化系统投入实际使用之前,人们会希望提前测试交易的效果.这个期间往往涉及代码的改动和参数的调整.最常见的做法是将历史数据输入量化系统,让量化系统根据既定的交易逻辑进行操作,观察和分析交易结果,找到问题 ...
- FMZ发明者量化平台回测机制说明
原文连接:https://www.fmz.com/digest-topic/4009 大部分策略在实盘之前都需要回测进行验证,FMZ支持部分品种数字货币现货.期货和永续合约,以及商品期货所有品种.但发 ...
- 手把手教你用Python搭建自己的量化回测框架【均值回归策略】
手把手教你用Python搭建自己的量化回测框架[均值回归策略] 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的, ...
- 用Python编写的第一个回测程序
用Python编写的第一个回测程序 2016-08-06 def savfig(figureObj, fn_prefix1='backtest8', fn_prefix2='_1_'): import ...
随机推荐
- golang在win10安装、环境配置 和 goland(IDE开发golang配置)
前言 本人在使用goland软件开发go时,对于goland软件配置网上资料少,为了方便自己遗忘.也为了希望和我一样的小白能够更好的使用,所以就写下这篇博客,废话不多说开考. 一.查看自己电脑系统版本 ...
- HNCTF的pyjail做题过程详解
简述: 因为本人对python的内置函数理解也不是深入,在做题过程中也是靠着出题人的hint和google大法才做出来几题,详细的解题过程和知识点讲解可以看一下春哥的知乎,[PyJail] pytho ...
- win7安装Anaconda+TensorFlow(cpu版)+配置PyCharm
本着不折腾不舒服斯基,好久没安装软件玩了.今天趁天气不错,安装下TensorFlow(cpu版)(因为没钱上GPU),首先在网上搜了下教程,原文出处: https://blog.csdn.net/u0 ...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记3
1. 组织文件笔记(第9章)(代码下载) 1.1 文件与文件路径 通过import shutil调用shutil模块操作目录,shutil模块能够在Python 程序中实现文件复制.移动.改名和删除: ...
- [R语言] ggplot2入门笔记4—前50个ggplot2可视化效果
文章目录 通用教程简介(Introduction To ggplot2) 4 ggplot2入门笔记4-前50个ggplot2可视化效果 1 相关性(Correlation) 1.1 散点图(Scat ...
- linux 基础(2) 文件权限及其修改
文件的权限属性 在 linux 中,每个文件都有唯一的"所属者"(user)和"所属群组"(group).owner 和 group 都对文件有特殊的权限 输入 ...
- 从0开始学习VUE3--01-Vue2与Vue3的不同点
升级带来的性能提升总结 1.模板编译优化:节点达到一定个数,会自动优化 每次重新渲染,会调用createVnode创建虚拟节点,VUE3会做静态提升,静态节点进行提取,进行优化 2.事件 缓存事件,防 ...
- linux命令与公私钥
昨日内容回顾 etc目录 配置相关 /etc/profile 环境变量文件 /etc/motd 开机欢迎界面 usr目录 程序相关 四种安装软件的方式 1.yum安装 自动解决依赖性问题 2.rap安 ...
- ASCLL编码器-算术运算符_四则与取模运算
ASCLL编码器 public static void main(String[] args) { //字符类型变量 char c = 'a'; int i = 1; //字符类型和int类型计算 S ...
- centos7笔记本使用iptables服务,将笔记本模拟成为出口路由器 PPPOE拨号+NAT+端口映射
郑州洪水,闲置在家,捣鼓捣鼓 centos7笔记本使用iptables服务,将笔记本模拟成为出口路由器 PPPOE拨号+NAT+端口映射 环境: 1.笔记本单网口,无法做路由网关,手里有个闲置的USB ...