import backtrader as bt
import datetime
import pandas as pd
import matplotlib.pyplot as plt
import backtrader.analyzers as btanalyzers#定义指标
class Ketler(bt.Indicator):params = dict(ema=20,atr= 17)lines = ('expo','atr','upper','lower')plotinfo = dict(subplot =False)plotlines = dict(upper = dict(ls = '--'),lower = dict(_samecolor = True))def __init__(self):self.l.expo = bt.talib.EMA(self.datas[0].close,timeperiod=self.params.ema)self.l.atr = bt.talib.ATR(self.data.hight,self.data.low,self.data.close,timeperiod = self.params.atr)self.l.upper = self.l.expo + self.l.atrself.lower = self.l.expo-self.l.atr
#Backtrader的策略主体
class Strategy(bt.Strategy):def log(self,txt,dt=None):"""Logging function for this strategy"""dt = dt or self.datas[0].datetime.date(0)print('%s,%s'%(dt.isoformat(),txt))def __init__(self):self.ketler = Ketler()self.close = self.data.closedef notify_order(self,order):if order.status in [order.Submitted,order.Accepted]:# Buy/Sell order submmitted/accepted to/by broker - Nothing to doreturn#Check if an order has been completed#Attention: broker could reject order if not enough cashif order.status in [order.Completed]:if order.isbuy():self.log('BUY EXECUTED ,Price:{:.2f},Cost:{:.2f},Comm {:.2f}'.format(order.executed.price,order.executed.value,order.executed.comm))self.buyprice = order.executed.priceself.buycomm = order.executed.commelse:self.log('SELL EXECUTED,Price:{:.2f},Cost:{:.2f},Comm(:.2f)'.format(order.executed.price,order.executed.value,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 = Nonedef notify_trade(self,trade):if not trade.isclosed:returnself.log('OPERATION PROFIT,GROSS %.2f,NET %.2f' %(trade.pnl,trade.pnlcomm))def next(self):if not self.position:if self.close[0] > self.ketler.upper[0]:self.order = self.order_target_percent(target= 0.95)else:if self.close[0]<self.ketler.expo[0]:self.order = self.sell()
#策略主体
if __name__ == '__main__':cerebro = bt.Cerebro()data = bt.feeds.YahooFinanceData(dataname = 'AAPL',fromdate = datetime.datetime(2015,1,1),todate = datetime.datetime(2021,1,17),timeframe = bt.TimeFrame.Days)cerebro.adddata(data)cerebro.addstrategy(Strategy)cerebro.broker.setcash(1000000)cerebro.broker.setcommission(commission=0)cerebro.addsizer(bt.sizers.PercentSizer,percents=98)cerebro.addanalyzer(btanalyzers.SharpeRatio, _name = 'shape')cerebro.addanalyzer(btanalyzers.DrawDown,_name = 'drawdown')cerebro.addanalyzer(btanalyzers.Returns,_name='returns')print('Starte Portfolio Value {}'.format(cerebro.broker.getvalue()))back =cerebro.run()print('end portfolio vlaue {}'.format(cerebro.broker.getvalue()))par_list = [[x.analyzers.returns.get_analysis()['rtot'],x.analyzers.returns.get_analysis()['rnorm100'],x.analyzers.drawdown.get_analysis()['max']['drawdown'],x.analyzers.sharpe.get_analysis()['sharperatio']]for x in back]par_df = pd.DataFrame(par_list,columns = ['Total Return','APR','Drawdown','SharpRatio'])print(par_df)cerebro.plot(style='candle')

凯特勒通道(backtrader)相关推荐

  1. 科技产品下一个重大突破将来自芯片堆叠技术

    来源:网易科技 概要:作为几乎所有日常电子产品最基础的一个组件,微芯片正出现一种很有意思的现象. 作为几乎所有日常电子产品最基础的一个组件,微芯片正出现一种很有意思的现象.通常又薄又平的微芯片,如今却 ...

  2. 2020年化工自动化控制仪表考试题库及化工自动化控制仪表新版试题

    题库来源:安全生产模拟考试一点通公众号小程序 2020年化工自动化控制仪表考试题库及化工自动化控制仪表新版试题,包含化工自动化控制仪表考试题库答案和解析及化工自动化控制仪表新版试题练习.由安全生产模拟 ...

  3. 《数据科学家养成手册》第八章---统计学

    数理统计的鼻祖------阿道夫.凯特勒 1.凯特勒的"平均人"思想 凯特勒运用概率论的方法进一步的研究了社会道德领域的大量统计资料,发现"在我们对大多数人进行观察的时候 ...

  4. 微软洪小文:AI将成为人类未来最好的左脑

    演讲嘉宾 | 洪小文 整理 | 夕颜 出品 | AI科技大本营(ID:rgznai100) 导读:2019 年 6 月 14 日,由清华大学五道口金融学院.清华大学国家金融研究院.清华大学研究生会联合 ...

  5. 教你如何区分描述统计学与推断统计学

    统计学被广泛的应用于各个领域之上,从物理和社会科学,再到人文科学,甚至被用在工商业及ZF的情报决策当中.统计学又可分为描述统计学和推断统计学,那么要怎样来区分她们呢?   我们先来了解描述统计学和推断 ...

  6. 深藏不露,挖掘4种大脑网络中的管理工具

    走过了百余年发展历程的管理理论与实践,自身体系正在不断深化与创新,其中一个重要领域是对脑神经科学成果的利用. 虽然柯洁以0:3败给了AlphaGo,虽然人工智能可以完成一些人类所不能及的工作,但是人类 ...

  7. 匈牙利命名法为何被淘汰_为何甲烷的习惯命名法用甲烷而不是一烷?

    其实在有机化合物中文翻译早期,是有过用数字命名的阶段的,先上图. 部分有机化合物在不同时期的汉译名对照 那么后来为何未采用数字,而使用天干.与商务印书馆和郑贞文个人其实有很大关系. 那么有机物中文命名 ...

  8. 如果科学家封神,会有什么称号?

    全世界只有3.14 % 的人关注了 数据与算法之美 你听说过"天雷真君"吗? 你知道"虐猫狂人"吗? 其实这两个称号是网友分别送给大科学家富兰克林和薛定谔的. ...

  9. 【渝粤题库】陕西师范大学292071社会统计学作业(高起专)

    <社会统计学>作业 一.单项选择题 1.从历史上看,在社会经济统计学的形成过程中,首先使用"统计学"这一术语的是( ). A. 政治算术学派 B. 国势学派 C. 数理 ...

最新文章

  1. web安全之信息刺探防范(上)
  2. 2016 大连网赛---Weak Pair(dfs+树状数组)
  3. jzoj4228-C【dp】
  4. python 元组比较大小_为什么元组比列表更快?
  5. spark stage 划分 源码
  6. 【华为云技术分享】从自建MongoDB聊聊云数据库MongoDB的蓬勃张力
  7. Eclipse java SE版本解决无法新建web项目问题
  8. 10.8 wtx模拟题题解
  9. 金字塔原理(Pyramid Principle)
  10. 利用幅度谱和相位谱重构图像
  11. 中坚力量:Isilon
  12. 树莓派 vnc Cannot currently show the desktop
  13. 阿里云主机的公网带宽和私网带宽的介绍
  14. 企业微信登陆,操作企业微信通讯录(代码已上传github)
  15. 刷新BIOS应该做的几件事
  16. 中等专业学校计算机教师,中等专业学校计算机老师年度工作总结
  17. 模拟QQ自动隐藏窗体
  18. jquery获取第一个子元素
  19. Opencv测量图片中的物体大小
  20. 3dsmax网格重构细分

热门文章

  1. 知网和万方下载论文收费模式,被这家网站打破,令人拍手叫好
  2. c语言关于continue的题,10道c语言基础题1、C语言的跳转语句中,对于break和continue说法正确的是_______. A、contin...
  3. 任意输入一个年份 判断是否为闰年
  4. NETDMIS5.0笛卡尔坐标系和矢量2023
  5. 基于 Nginx 的 HTTPS 性能优化
  6. 计算机科学技术手抄报,【科技创新手抄报资料50】_关于科技创新的手抄报内容资料...
  7. MATLAB小知识(三)——输出矩阵到TXT
  8. 前端如何实现一个滚动的文本字幕
  9. 视频滚动字幕怎么批量添加
  10. 软件开发平台之争:NET VS Java,谁是更好的选择?