![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
量化
文章平均质量分 53
roy1126_
这个作者很懒,什么都没留下…
展开
-
SMA(简单移动平均线)
开放工具:SMA分析原创 2022-08-31 22:14:33 · 3938 阅读 · 2 评论 -
Backtrader坑记录
1、假设2022-01-25提交了一堆买单. 到了2022-01-26, 开始执行买单, 当执行到其中一个订单资金不足时, 往后的未决订单全是资金不足状态原创 2022-03-12 13:30:24 · 634 阅读 · 0 评论 -
Backtrader(二十四)- 定时器timer
使用可以在 init 或者 start 方法中为策略添加定时器def add_timer(self, when, offset=datetime.timedelta(), repeat=datetime.timedelta(), weekdays=[], weekcarry=False, monthdays=[], monthcarry=True, allow=原创 2022-02-04 21:04:42 · 1909 阅读 · 0 评论 -
Backtrader(二十三)- 多股票回测
多数据策略跌代表详解场景:有多个相同时间粒度的股票数据参与策略,不同股票数据时间并不一致 日期 开盘 收盘 最高 最低 成交量 成交额 振幅 \0 2020-12-22 38.44 33.67 38.44 32.96 89625 582730960.0 31.08 1 2020-12-23 30.11 29.91 32.33 28.11 69495 3715081原创 2022-02-01 21:39:08 · 2617 阅读 · 1 评论 -
Backtrader(二十二)- 混合时间粒度回测
简述当要使用不同时间粒度的行情数据时,backtrader有两种处理方式,第一种是读入不同的行情bar数据,第二种是将细粒度数据合并成粗粒度数据(resample)读入不同的行情bar数据规则最小粒度的数据必须被第一个加入到Cerebro实例中数据必须按照日期时间升序排列大粒度数据的使用有可能使得策略的最小周期变大若使用不同时间粒度的指标进行运算,则要采用cerebro.run(runonce=False) 若策略中使用了不同时间粒度的指标进行运算,不能用cerebro.run()init原创 2022-02-01 10:05:16 · 2421 阅读 · 0 评论 -
Backtrader(二十一)- 订单Order - 策略参数优化
使用backtrader内置优化功能进行参数优化方式一:数组if __name__ == '__main__': cerebro = bt.Cerebro() cerebro.adddata(feed) cerebro.broker.setcash(10000.0) cerebro.broker.setcommission(commission=0.001) cerebro.optstrategy( strategy=SmaCross,原创 2022-01-30 20:26:09 · 1462 阅读 · 0 评论 -
Backtrader(二十)- Order订单 - 订单增加自定义信息
简述有一些复杂的交易策略,需要给订单附加更加多的自定义信息。Backtrader使用 addinfo 给订单添加自定义信息。使用方法增加自定义信息 def next(self): o1 = self.buy() o1.addinfo(name='ben', age=10)读取自定义信息 def notify_order(self, order): name = order.info.name age = order.i原创 2022-01-30 10:57:31 · 684 阅读 · 0 评论 -
Backtrader(十九)- 订单Order - 一篮子订单BacketOrders
简述一篮子订单是三个订单组合起来的,其中一个是主订单,另外两个一个是针对 主订单的止损保护单(止损单),二是针对主订单的获利了结单(止盈单)主买单:默认是限价单Limit,要设置主限制价 price,相当于进入市场的价格止损单:默认是止损单Stop,用于限制损失,要设置止损价 stopprice止盈单默认是限价单Limit,要设置限制价(止盈价)limitprice将这3个订单一起提交,主订单执行后,两个子订单才激活。若主单取消,则子单自动取消。激活的子单中任意一个执行或取消将导致另一个自动原创 2022-01-30 10:50:07 · 881 阅读 · 0 评论 -
Backtrader(十八)- Order订单 - 订单下单和执行时机
默认模式假设为日线数据,在next方法中调用订单方法。执行逻辑为,当天收盘后提交订单,次日使用开盘价执行订单。在backtrader中对任何时间粒度的数据,下单时机是当前bar(索引为0)的完成时间点;执行时机是下一根bar(索引为1)开始。作弊模式收盘作弊模式简述当日(收盘)下单,当日(收盘)成交有些用户想要在使用日线bar时,今日下市价单,成交价格就是今日收盘价。相当于实际场景:用户在下午临收盘前观察盘面,预估收盘价,下单成交,这个价格有可能与收盘价差别不大,相当于今日收盘价成交。b原创 2022-01-29 20:21:33 · 2114 阅读 · 0 评论 -
Backtrader(十七)-Order订单 - 订单通知
简述在订单状态发生变化时,触发策略的 notify_order方法,在方法中可以查询订单状态相关信息,或执行一些动作。该方法在next方法前触发在 def notify_order(self, order): 方法中,通过参数order 访问 order信息order.status 订单状态(int)order.getstatusname() 订单状态名称order.getstatusname(order.status) 通过订单状态int,获取订单状态名称订单状态 0~8[Created、原创 2022-01-29 17:41:02 · 1584 阅读 · 0 评论 -
Backtrader(十六)- Order订单 - order_target_xxx
方法枚举1、order_target_size2、order_target_value3、order_target_percent注意:此类方法的参数与 buy / sell 完全相同方法详解1、self.order_target_size(target=10000)自动通过买卖,将self.data对应的股票仓位数量调整至10000股。2、self.order_target_value(target=10000)自动通过买卖,将self.data对应的股票仓位价值调整至10000元不考原创 2022-01-25 10:52:09 · 1778 阅读 · 0 评论 -
Backtrader(十五)- Order订单 - 自定义Sizer类控制下单量
简介通过向cerebro传入自定义Sizer,修改buy/sell的执行逻辑,控制下单量等。在自定义的Sizer类中,可以访问策略对象self.strategy,以及策略的经纪行对象self.strategy.broker(self.broker),通过broker可以访问仓位(self.broker.getposition(data))和市值(self.broker.getvalue())等信息.在Sizer类中的 def _getsizing(self, comminfo, cash, data,原创 2022-01-24 21:33:45 · 1955 阅读 · 1 评论 -
Backtrader(十四)- Order订单 - 订单有效期与涨停跌停
关于订单有效期buy/sell/close 方法有个参数 valid 控制订单的有效期,也就是到哪一天(含)之前订单都有效但是,有效期对市价单和收盘价单是不起作用的,这两种订单肯定会在下一个实际bar上成交,对其他类型的订单。比如限价单,有效期起作用。valid参数的值1、买单有效期截止到valid 这一天的 23时59分59秒 (秒)from datetime import timedeltadef next(self): #当前日期时间之后三个自然日内有效 valid = self.d原创 2022-01-24 14:19:33 · 1077 阅读 · 1 评论 -
Backtrader(十三)- Order订单 -订单类型、订单执行逻辑
订单执行原则通常订单可分类为 市价单Market、收盘价单Close、限价单Limit、止损单Stop、止损限价单StopLimit、止损跟踪单StopTrail、止损跟踪限价单StopTrailLimit,在用buy、sell方法创建订单时,exectype参数指明了创建的订单类型1、当前数据已经产生,不能用于执行交易def next(self): if self,data.close > self.sma: self.buy()在这个逻辑中,如果当日收盘价close高于移动平均价,原创 2022-01-23 17:49:43 · 12734 阅读 · 0 评论 -
Backtrader(十二)- 订单 Order -buy、sell、close
简介订单代表着发送给经纪行的指令,触发经纪行(用broker对象模拟经纪行)执行相关的动作。通常在策略类中的next方法中创建订单。下订单(买卖)的方法self.buy()、self.sell()、self.close()、self.order_target_size()、self.order_target_value()、self.order_target_percent() 等buy()def buy(self, data=None, size=None, price=原创 2022-01-23 11:32:52 · 5547 阅读 · 0 评论 -
Backtrader(十一) - Indicator指标
简述backtrader支持 内置指标 和 talib 指标相关文档:内置指标:https://www.backtrader.com/docu/indautoref/talib指标:https://www.cnblogs.com/forest128/p/13823649.html策略中使用内置指标:class SmaCross(bt.Strategy): params = dict(period=5) def __init__(self): self.move_原创 2022-01-21 21:59:10 · 1920 阅读 · 0 评论 -
Backtrader(十) - 经纪行 Broker
简述现实交易中,用户在经纪行(如 证券公司)开设交易账户,然后向Backtrader提供broker对象模拟现实世界的经济行。broker对象支持各种订单类型,它的主要功能有,检查库存现金能否满足已提交订单的现金需求、在策略的每次迭代中跟踪现金与市值余额、维护各个标的资产的仓位信息、维护佣金和滑点。在类似期货这样的资产交易中,broker会自动在每次迭代时调整现金,因为资产价格变化意味着现金的增加或减少。默认的经纪行对象类型是 backtrader.brokers.backbroker.BackBrok原创 2022-01-21 18:07:19 · 856 阅读 · 0 评论 -
Backtrader(九)- Observers观察者对象
基本使用cerebro会自动加入三个观察者,即Broker、Trades、BuySell。 这样通过 cerebro.plot() 输出图形时,图形界面会输出三部分。自定义观察者对象# 取消自定义观察者cerebro = bt.Cerebro(stdstats=False)# 手动添加观察者cerebro.addobserver(OrderObserver)在策略中访问Observers在策略类中访问观察者的方法是通过策略的属性 stats,比如:broker观察者含有两根线,value原创 2022-01-21 13:45:25 · 1123 阅读 · 0 评论 -
Backtrader(八) - 分析者Analyzer(自定义一个分析者类)
关于凯利公式K = W - (1 - W) / RK: 凯利最优比率W: 胜率R: 盈亏比,即平均盈利除以平均损失基于凯利公式实现自定义分析者对象'''关于凯利公式kelly公式得到的凯利比率,实际上并不是对策略的绩效的评价,那么它起什么作用呢:如果凯利比率为负,则说明策略是亏损的,不能采用。如果kelly比率(kellyRatio)为正数,比如kellyRatio=0.215,那么说明,理论上每次下单时,购买金额应该为当时总现金值的 kellyPercent 即 21.5%。'''原创 2022-01-18 20:54:23 · 1602 阅读 · 0 评论 -
Backtrader(七)- 分析者Analyzer(基本使用)
前言评价策略是否成功,不仅要看策略是否赚钱,还要看策略是否承担了过大的风险。这些都有一些专门的指标来评价,比如:夏普率、最大回撤、胜率等。 分析者对象Analyzer就是用来完成策略的绩效评价工作。添加分析者对象cerebro.addanalyzer(Kelly, _name='kelly') # Kelly为分析者类注意:当分析者对象需要参数时,也是这里通过kv形式传入分析者对象返回的数据每一个策略对象都会返回一组已添加的分析者对象数据(如:当使用策略参数优化optstrategy时,每一原创 2022-01-18 20:40:48 · 1872 阅读 · 0 评论 -
Backtrader(六) - 关于datafeed
PandasData将pandas的dataframe,对象加载到 bt.feeds.PandasData。生成回测的行情数据对象。范例:数据来源 akshareimport akshare as ak# 获取历史行情数据stock_zh_a_hist_df = ak.stock_zh_a_hist( symbol=g_stock_code, # 股票代码 period="daily", # {'daily', 'weekly', 'monthly'} adjust原创 2022-01-16 21:43:58 · 3976 阅读 · 2 评论 -
Backtrader(五)- 策略常用对象
策略常用对象self.datas这是策略的行情数据集合,策略里经常访问的是第一个行情数据对象self.datas[0]。如果有多个行情对象被注入策略了,则用self.datas[n] 访问如果要访问行情对象中的某一线,如:收盘线,则用 self.data[0].close如果访问具体的某一点数据,如:当天收盘价,则用self.data[0].close[0]self.position 与 self.getpositionself.position仓位,通过此属性可以访问第一个行情数据self原创 2022-01-16 13:54:32 · 1195 阅读 · 0 评论 -
Backtrader概念(四)-Cerebro参数
Cerebro参数设置方式两种:1、cerebro = bt.Cerebro(runonce=True, ...)cerebro.run()2、cerebro = bt.Cerebro()cerebro.run(runonce=False, ...)常用参数preloaddefault = True预加载数据:确定是否一次性将行情数据全部加载进策略runoncedefault:True预计算指标:确定是否一次性以矢量化方式计算好指标,后面运行速度快。注意:runonce为T原创 2022-01-16 12:59:23 · 2140 阅读 · 0 评论 -
Backtrader概念(三)
最小周期如果我们的策略中使用了如:5日均线指标,迭代行情数据时,前4行数据都无法计算5日均线。这个情况会怎样处理呢?通常情况下(没有覆盖nextstart),使用了5日均线,则最小周期为5。至少需要5个bar才能算5日均线,则next方法会从第5根bar开始触发。因此,最小周期是指 技术指标所需的最小行情数据bar数,如果不同指标需要的最小bar数不同,则取最大。到达最小bar数才开始触发 next 方法。prenext()、nextstart()、next() 的逻辑关系假设策略中使用了5日均线指原创 2022-01-15 21:21:55 · 1068 阅读 · 0 评论 -
backtrader概念(二)Trade
trade 交易对于正常采用自由资金购买股票,不能做空的情况下。当针对某个行情数据对象下,一个订单使得仓位从0变为正值,则打开了一个交易,会触发 notify_trade();此后,当某个订单使仓位从正值变为0,则该交易关闭,会触发 notify_trade()一个交易可以由多张订单组成举个例子:第一次下单,买100股,仓位从 0 变成 100。打开交易,触发notify_trade()第二次下单,卖100股,仓位从 200 变成 100。不触发notify_trade()第三次下单,买100股原创 2022-01-14 23:19:12 · 12308 阅读 · 0 评论 -
Backtrader概念(一)
行情数据含线对象含有一条或多条线的对象称为含线对象,含线对象有一个类似列表的属性lines,里面就是对象的线。行情对象(data feed)如 self.datas[0]、指标对象如self.move_average, 都是含线对象,策略自己self也是含线对象线 line对象行情数据中每一列称为一条线,线由一系列数据点组成。比如 close 线由一系列收盘价构成。含线对象的 lines 中含有指向具体line数据的line对象,可通过索引访问其中的线对象。如:self.data.lines[原创 2022-01-13 23:04:58 · 1130 阅读 · 0 评论