自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(35)
  • 资源 (1)
  • 收藏
  • 关注

原创 SMA(简单移动平均线)

开放工具:SMA分析

2022-08-31 22:14:33 3722 2

原创 Backtrader坑记录

1、假设2022-01-25提交了一堆买单. 到了2022-01-26, 开始执行买单, 当执行到其中一个订单资金不足时, 往后的未决订单全是资金不足状态

2022-03-12 13:30:24 576

原创 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 1821

原创 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 2492 1

原创 Backtrader(二十二)- 混合时间粒度回测

简述当要使用不同时间粒度的行情数据时,backtrader有两种处理方式,第一种是读入不同的行情bar数据,第二种是将细粒度数据合并成粗粒度数据(resample)读入不同的行情bar数据规则最小粒度的数据必须被第一个加入到Cerebro实例中数据必须按照日期时间升序排列大粒度数据的使用有可能使得策略的最小周期变大若使用不同时间粒度的指标进行运算,则要采用cerebro.run(runonce=False) 若策略中使用了不同时间粒度的指标进行运算,不能用cerebro.run()init

2022-02-01 10:05:16 2226

原创 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 1377

原创 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 639

原创 Backtrader(十九)- 订单Order - 一篮子订单BacketOrders

简述一篮子订单是三个订单组合起来的,其中一个是主订单,另外两个一个是针对 主订单的止损保护单(止损单),二是针对主订单的获利了结单(止盈单)主买单:默认是限价单Limit,要设置主限制价 price,相当于进入市场的价格止损单:默认是止损单Stop,用于限制损失,要设置止损价 stopprice止盈单默认是限价单Limit,要设置限制价(止盈价)limitprice将这3个订单一起提交,主订单执行后,两个子订单才激活。若主单取消,则子单自动取消。激活的子单中任意一个执行或取消将导致另一个自动

2022-01-30 10:50:07 830

原创 Backtrader(十八)- Order订单 - 订单下单和执行时机

默认模式假设为日线数据,在next方法中调用订单方法。执行逻辑为,当天收盘后提交订单,次日使用开盘价执行订单。在backtrader中对任何时间粒度的数据,下单时机是当前bar(索引为0)的完成时间点;执行时机是下一根bar(索引为1)开始。作弊模式收盘作弊模式简述当日(收盘)下单,当日(收盘)成交有些用户想要在使用日线bar时,今日下市价单,成交价格就是今日收盘价。相当于实际场景:用户在下午临收盘前观察盘面,预估收盘价,下单成交,这个价格有可能与收盘价差别不大,相当于今日收盘价成交。b

2022-01-29 20:21:33 1921

原创 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 1509

原创 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 1666

原创 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 1809 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 1026 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 12510

原创 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 5202

原创 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 1797

原创 Backtrader(十) - 经纪行 Broker

简述现实交易中,用户在经纪行(如 证券公司)开设交易账户,然后向Backtrader提供broker对象模拟现实世界的经济行。broker对象支持各种订单类型,它的主要功能有,检查库存现金能否满足已提交订单的现金需求、在策略的每次迭代中跟踪现金与市值余额、维护各个标的资产的仓位信息、维护佣金和滑点。在类似期货这样的资产交易中,broker会自动在每次迭代时调整现金,因为资产价格变化意味着现金的增加或减少。默认的经纪行对象类型是 backtrader.brokers.backbroker.BackBrok

2022-01-21 18:07:19 821

原创 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 1065

原创 Backtrader(八) - 分析者Analyzer(自定义一个分析者类)

关于凯利公式K = W - (1 - W) / RK: 凯利最优比率W: 胜率R: 盈亏比,即平均盈利除以平均损失基于凯利公式实现自定义分析者对象'''关于凯利公式kelly公式得到的凯利比率,实际上并不是对策略的绩效的评价,那么它起什么作用呢:如果凯利比率为负,则说明策略是亏损的,不能采用。如果kelly比率(kellyRatio)为正数,比如kellyRatio=0.215,那么说明,理论上每次下单时,购买金额应该为当时总现金值的 kellyPercent 即 21.5%。'''

2022-01-18 20:54:23 1531

原创 Backtrader(七)- 分析者Analyzer(基本使用)

前言评价策略是否成功,不仅要看策略是否赚钱,还要看策略是否承担了过大的风险。这些都有一些专门的指标来评价,比如:夏普率、最大回撤、胜率等。 分析者对象Analyzer就是用来完成策略的绩效评价工作。添加分析者对象cerebro.addanalyzer(Kelly, _name='kelly') # Kelly为分析者类注意:当分析者对象需要参数时,也是这里通过kv形式传入分析者对象返回的数据每一个策略对象都会返回一组已添加的分析者对象数据(如:当使用策略参数优化optstrategy时,每一

2022-01-18 20:40:48 1814

原创 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 3530 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 1099

原创 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 1992

原创 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 1002

原创 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 12144

原创 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 1056

原创 998条接口用例需要跑多久?(二)

总体架构组成logger 顾名思义,配置logger的import logginglogger = logging.getLogger('Base_logger')logger.setLevel(logging.DEBUG)stream_handler = logging.StreamHandler()stream_handler.setFormatter(logging.Formatter("%(asctime)s - %(levelname)s - %(filename)s[:%(lin

2020-05-23 14:29:33 544

原创 998条接口用例需要跑多久?(一)

这只是随机的一次测试耗时。经过多次测试一般为 27 ~ 73 秒之间。运行过程包含 读取用例加载,请求发送,接收响应,写入结果。具体如何实现?连载开始了,快点关注吧 !!

2020-05-22 22:34:57 1118

原创 基于图像识别的ui操作--4

今天第一次把图片识别应用到实际的测试脚本中。windows环境下,效果不错。更新一个方法pics_match(*args) *args为传入的待匹配图片#循环对传入的图片进行匹配,可以选择check_and_click()方法 或 wait_and_match_process() 方法进行匹配,匹配一轮后没有 #合适的结果则抛出异常,否则可以进行点击,返回True def ...

2020-02-29 21:57:38 217

原创 基于图像识别的ui操作--3

wait_and_match(click,daemon) — 不断进行截图,并匹配图片,匹配成功后进行点击,但是这个方法一般不单独使用而是被下面两个方法所调用。click: boolen。 是否进行点击,默认是daemon: boolen。是否作为守护进程调用,默认为否 #不断刷新屏幕的截图,进行图像匹配,主要用作守护进程 def wait_and_match(self,...

2020-02-26 22:37:17 212

原创 基于图像识别的ui操作--2

基本方法:test() — 用于对结果进行调试,显示出匹配到的位置click() — 简单的点击操作。check_and_click() — 首先对匹配到的区域进行相关性计算。设置阈值就是在这时起效,相关性在阈值范围内时,将进行点击。 def test(self): #调试 img = cv.rectangle(self.full_screen,(s...

2020-02-25 20:01:01 158

原创 基于图像识别的ui操作--1

```pythonimport osimport timeimport multiprocessingimport Baseimport cv2 as cvimport traceback'''1 首先在截屏尺寸图上截屏'''class Click_pic(): def __init__(self,match_pic,driver=None,cut=(2,1),u...

2020-02-22 23:32:59 541

原创 Python关于threading.Semaphore()和threading.BoundedSemaphore()计数器

关于threading.Semaphore()和threading.BoundedSemaphore()计数器工作如何输出,以及两个有什么不同:threading.Semaphore(value=1):可通过acquire(block=[bool],timeout=None)获取,也就是对value减一.1 当block=True,timeout=None,acquirec()次数超过val...

2020-01-01 16:50:07 1255

原创 Python学习中的那些坑3 模块中不同函数间的变量使用和函数中的追加list追加

这是两个关于局部变量和全部变量的两个小坑,主要是python语法不熟悉另外大神千万不要看,不然肯定会说:“这人该不会是个傻子吧~~”第一个:getData()函数中得出 Data 字符串,希望在runAdb()函数中调用。但是报错Cpuinfo中没有Data这个属性。应该是因为没有做全局变量的意思吧~ 于是:加上global Data后成功。当然也可以这样改:第二个踩的坑是...

2019-07-20 13:44:02 211

原创 Python学习中的那些坑 2 之 【**子类***不能调用***父类**中的方法】

首先1 在joinRace 包中有 button 和 submitRace 两个模块2 在button 模块中 有一个类—Bbutton(),这个类继承了 submitRace 模块中的 SubmitRace()类 。 --------Bbutton(submitRace.SubmitForm)3 在button模块中,生成一个属于类 Bbutton 的一个对象 But...

2019-07-19 21:19:19 567 1

adbJS.rar解决appium无法与andriod9创建会话问题

关于自己遇到的坑,appium1.4.16无法与Android创建会话,只需按说明中步骤后,重启appium服务器即可

2019-06-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除