《BackTrader量化交易图解》第9章:回测结果分析

news2024/11/17 17:37:52

文章目录

  • 9. 回测结果分析
    • 9.1 常用量化分析指标
    • 9.2 Analyzer 分析类
    • 9.3 Analyzer 分析模块架构图
    • 9.4 SQN 指数
    • 9.5 案例:回测数据基本分析
    • 9.6 案例:回测数据扩展指标分析

9. 回测结果分析

9.1 常用量化分析指标

使用BackTrader等量化软件做交易会生成大量的测试数据, 策略的好坏及稳定性等都要通过回测结果的分析来进行判定。
常用的量化分析指标一般分为三类:

  1. Return, 收益指标。
  2. Risk, 风险指标。
  3. Factor, 多因子分析指标。

下面进行具体分析。

  1. Return收益指标。

    • Returns收益率, 通常为百分比形式的、 非累积的年/月/日等周期收益率, 即每个周期相对于上一个交易周期的收益比率。
    • annual_return, 年化回报率, 使用策略投资一年的收益率。
    • ROI, 投资回报率。
    • cum_returns, 累计收益。
    • VWR, 动态加权回报率。
    • omega_ratio, 欧米伽比率, 用来分析收益分布, 指标数值越高越好, 它是对偏度和峰值的一个调整。
    • benchmark_returns, 参考/基准(年化) 收益率, 标准指数(如SPY标普指数、 上证指数) 投资一年的收益率。

    就量化策略而言, 最重要的就是投资回报率这个指标, 其主要用于评估策略模型的稳定性。 而好的量化策略的关键就是具有稳定性, 能够获取稳定的投资回报率。 判断策略稳定的标准是: 在多种产品组合和多个时间周期的情况下都能够稳定盈利。

    对于初学者而言, 重点关注投资回报率指标就可以了。 其他指标通常在投资回报率差不多的情况下, 对策略做一些辅助优化即可。

  2. Risk风险指标。包含:

    • Alpha, 阿尔法指数, 非系统性风险投资指数。
    • Beta, 贝塔指数, 系统性风险投资指数, 反映了策略对大盘变化的敏感性。
    • Volatility, 波动率, 用来衡量策略的风险性, 波动率越大代表策略风险越高。
    • annual_volatility, 年化波动率。
    • information_ratio, 信息比率, 数值越高, 业绩表现持续优于大盘的程度越高。 该指标主要用来衡量投资组合所带来的超额收益。
    • calmar_ratio, 卡尔马比率, 是年化收益率与历史最大回撤之间的比率。 数值越大, 表示业绩越好; 数值越小, 表示业绩越差。
    • sharpe_ratio, 夏普指数/夏普比率, 是投资回报与风险的比例, 数值越大, 投资组合越佳。
    • sortino_ratio, 索提诺比率, 是夏普指数的修正版, 是用于评价投资资产、 组合或者策略收益的指标。
    • downside_risk, 下行风险, 指未来价格走势有低于投资者预期目标价位的风险。
    • tail_ratio, 尾比, 其含义是赚取的回报率比亏钱的比率大多少倍。
    • MaxDown, 最大回撤数据, 用于衡量策略可能出现的最糟糕情况。
    • SQN指数: 策略评级指数, 用于评估策略优劣。
  3. Factor多因子指标。

    • Factor Autocorrelation, 因子的自回归程度。
    • Profitable Count, 盈利的交易次数。
    • Unprofitable Count, 亏损的交易次数。
    • mean_return_by_quantile, 因子平均收益率数据。
    • mean_return_difference, 收益率差值, 即最好因子收益率减去最差因子收益率。
    • Return Ratio, 收益回撤比。
    • N-day Variance Ratio, n日方差比率。
    • Hurst, 赫斯特指数, 可衡量一个时间序列统计的相关性。
    • cumulative_returns_by_quantile, 多因子累计收益率。
    • Cash-netural Investment, 投资收益现金净值。

    专业因子指标如下。

    • 规模类因子: 总市值、 流通市值、 自由流通市值。
    • 估值类因子: 市盈率( TTM) 、 市净率、 市销率、 市现率、 企业价值倍数。
    • 成长类因子: 营业收入同比增长率、 营业利润同比增长率、 母公司利润同比增长率、 现金流金额同比增长率。
    • 盈利类因子: 净资产收益率( ROE) 、 总资产报酬率( ROA) 、销售毛利率、 销售净利率。
    • 动量反转因子: 前1~6个月涨跌幅。
    • 交投因子: 前一个月的日均换手率。
    • 波动因子: 前一个月的波动率、 前一个月的振幅。
    • 股东因子: 户均/机构持股比例、 户均/机构持股比例变化。
    • 分析师因子: 预测当年净利润增长率、 主营业务收入增长率, 以及最近一个月的净利润上调幅度、 主营业务收入上调幅度、 上调评级占比。

就目前国内量化交易的实际情况而言, 初学者只需重点掌握 BackTrader软件的常用功能, 能够灵活使用即可, 不需要对多因子进行深入分析。

9.2 Analyzer 分析类

内置Analyzer分析类的主要指标如下:
AnnualReturn, 年化回报率。
Calmar, 卡曼指数。
DrawDown, 最大回撤数据。
TimeDrawDown, 不同周期的最大回撤数据。
PositionsValue, 仓位变化数据。
PyFolio, 专业Folio量化图表分析。
LogReturnsRolling, 对数化回报率分析。
PeriodStats, 周期分析。
Returns, 回报率。
SharpeRatio, 夏普指数。
SharpeRatio_A, 修正版夏普指数。
SQN, 策略评估指数。
TimeReturn, 周期回报率。
TradeAnalyzer, 交易分析。
Transactions, 逐笔订单分析。
VWR, 动态加权回报率。
比较专业的Analyzer分析类指标, 只在进行一些特殊分析的时候才需要使用, 本节讲解比较简单的量化回测分析案例, 介绍量化分析的基本操作, 仅使用到一些常用的量化分析指标, 如Sharp、 MaxDown等。

在Analyzer分析模块中, 最重要的子模块是analyzer.Analyzer子模块。
在analyzer.Analyzer子模块内部分布图中, 以“_”开头的函数是类内部函数, 其他主要函数如下。
● 常规量化操作函数: next、 prenext、 nextstart、 start、 stop。
● 数据获取函数: get_analysis。

● 数据传递函数: notify_cashvalue、 notify_trade、 notify_order、notify_fund。
● 其他类函数: Create_analysis、 print、 pprint。

此外还有两个重要的函数: csv、 rets。

9.3 Analyzer 分析模块架构图

下图所示是 Analyzer 分析模块的核心部分,改图中最左边的圆形中的内容,是整个模块的入口:

btr_anz001

从上图可以看到 ,Analyzer 分析模块的核心是 Analyzer 分析类及其类函数。Analyzer 分析类及其类函数又分为两个子类:

  • TimeFrameAnalyzer,时间周期分析子类;
  • MetaAnalyzer,元数据分析子类。

注意, MetaTimeFrameAnalyzer(元数据分析的时间周期分析) 子类源自TimeFrameAnalyzer子类, 而不是由MetaAnalyzer子类派生出的。

在BackTrader量化软件中, 把Analyzer分析模块中的TimeFrameAnalyzer子类作为核心子类, 而在其他量化软件中, 通常把时间周期分析也作为一个量化分析指标。

MetaAnalyzer子类的设计非常巧妙, 其中的Meta元数据可以导入各种专业量化指标, 从而衍生出各种专业的量化分析指标, 如SQN指数、Sharp指数、 MaxDown等常用量化分析指标。

这种巧妙的设计架构, 非常方便用户扩展各种量化分析指标和各种自定义分析指标, 大大简化了用户的编程工作。

下面再看一看 analyzer.Analyzer 子模块架构图, 如下图所示。由图可以看出, analyzer.Analyzer子模块是所有分析模块的基础, 定义了量化分析主要的类函数。 其中以“_”开头的函数是类内部函数, 其他主要函数有以下几类。
● 常规量化操作函数: next、 prenext、 nextstart、 stop、 start。
● 数据获取函数: get_analysis。
● 数据传递函数: notify_trade、 notify_order、 notify_fund。
● 其他类函数: create_analysis、 print、 pprint。

btr_anz002

9.4 SQN 指数

SQN 指数全称为 System Quality Number,即系统质量指数,用来评估量化策略的优劣。SQN 的计算公式为:

SQN=root(n)×expectancy/stdev(R)
(SQN=交易次数n的平方根×交易系统的期望值/期望值的标准差)

其中,
root(n) : 一年交易次数n的平方根。
expectancy: 交易系统的期望值, 以倍数(风险回报比) 表示。
stdev(R) : 期望值的标准差。

评测的交易总次数最多不能超过100, 当然, 交易次数也有下限,即不能少于30。 当交易数量≥30时, SQN指数通常被认为是可靠的。
SQN指数具有如下意义:
● 交易次数越多, 获利机会越大。
● 风险回报比越大越好。
● 风险回报比的标准差越小, 交易结果越具有规律性, 回撤越小。

SQN指数公式很简单, 要优化SQN指数也很简单:
● 使交易次数和平均风险回报比的乘积尽可能大。
● 使公式中的期望值标准差尽可能小。

9.5 案例:回测数据基本分析

本实例代码 Analyzer1.py 。

本节案例增加了一些回测分析函数指标,重点是 addanalyzer 分析指标添加函数:

print("\n\t#2-5,设置每手交易数目为:10,不再使用默认值:1手")
cerebro.addsizer(bt.sizers.FixedSize, stake=10)

print("\n\t#2-6,设置addanalyzer分析参数")
cerebro.addanalyzer(SQN)
#
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name="SharpeRatio", legacyannual=True)
cerebro.addanalyzer(bt.analyzers.AnnualReturn, _name="AnnualReturn")
#
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name="TradeAnalyzer")
cerebro.addanalyzer(bt.analyzers.DrawDown, _name="DW")

以上代码为量化程序添加 SQN 指数、Sharp 指数、MaxDown 常用量化分析指标。

addanalyzer 策略添加函数中改的 name 参数变量,主要用于分析结果和图标绘制。这些指标名称可以通过name 参数设置,一般使用默认模式,即指标函数名称。下图是该函数关系属性示意图:

btr_add_anz

量化分析编程主要有两个环节:

  1. 在主程序源码中的数据设置部分,设置各种常用的分析指标,并使用 addanalyzer 添加各种指标。
  2. 当量化程序运行完成时,在量化回测结果数据中提取各种分析数据。

在量化回测结果数据中提取各种分析数据,需要从量化回测的返回值中获取分析数据:

print("\n#3,调用BT回测入口程序,开始执行run量化回测运算")
results = cerebro.run()

通过如下代码,把相关的回测结果数据提取出来,保存到 anzs 变量中:

# ---------
print("\n#5,analyzer分析BT量化回测数据")
strat = results[0]
anzs = strat.analyzers
#
dsharp = anzs.SharpeRatio.get_analysis()["sharperatio"]
trade_info = anzs.TradeAnalyzer.get_analysis()
#
dw = anzs.DW.get_analysis()
max_drowdown_len = dw["max"]["len"]
max_drowdown = dw["max"]["drawdown"]
max_drowdown_money = dw["max"]["moneydown"]
#
print("\t夏普指数SharpeRatio : ", dsharp)
print("\t最大回撤周期 max_drowdown_len : ", max_drowdown_len)
print("\t最大回撤 max_drowdown : ", max_drowdown)
print("\t最大回撤(资金)max_drowdown_money : ", max_drowdown_money)

anzs 变量用于保存回测分析数据,该变量本身是复合字典格式,提取的各组分析数据都是标准的 dict 字典格式,各组分析数据的返回值也都是 dict 字典格式,可方便大家提取使用。各组回测结果都保存在 Analyzer 分析类的 rets 属性中,可以通过 get_analysis 函数读取。

下图是 get_analysis 函数关系属性图:

btr_add_sta

由图可以看出,相关的分析结果不仅可以通过 rets 变量导出,也可以通过内置的 print、pprint 两个输出函数直接输出,而且输出的数据格式均进行过分组处理。

本案例生成图片如下:

Analyzer1

本案例各分析指标输出内容为:

#5,analyzer分析BT量化回测数据
        夏普指数SharpeRatio :  -66.94067728496657
        最大回撤周期 max_drowdown_len :  269
        最大回撤 max_drowdown :  0.03984537510517593
        最大回撤(资金)max_drowdown_money :  39.85270000001765

9.6 案例:回测数据扩展指标分析

本实例代码: Analyzer2.py 。

上个案例已经添加了一些分析指标,本案例继续添加如下分析指标:

  • TimeReturn, 周期回报率
  • VWR, 动态加权回报率。

添加分析指标的代码如下:

# 周期回报率,不同时间周期
cerebro.addanalyzer(
    bt.analyzers.TimeReturn, timeframe=bt.TimeFrame.Years, _name="timReturns"
)
# cerebro.addanalyzer(bt.analyzers.TimeReturn, timeframe=bt.TimeFrame.Months,_name='timReturns')
#
# 动态加权回报率 Variability-Weighted Return: Better SharpeRatio with Log Returns
cerebro.addanalyzer(bt.analyzers.VWR, _name="VWR")

添加输出代码如下:

#
print("\t#5-2,常用量化分析数据")
print("\tSQN指数、AnnualReturn年化收益率,Trade交易分析报告")
print("\t可以通过修改参数,改为其他时间周期:周、月、季度等")
for alyzer in strat.analyzers:
    alyzer.print()

本案例生成图片如下:

Analyzer2

输入内容如下:

#5,analyzer分析BT量化回测数据
        5-1夏普指数SharpeRatio :  -66.94067728496657
        最大回撤周期 max_drowdown_len :  269
        最大回撤 max_drowdown :  0.03984537510517593
        最大回撤(资金)max_drowdown_money :  39.85270000001765
        #5-2,常用量化分析数据
        SQN指数、AnnualReturn年化收益率,Trade交易分析报告
        可以通过修改参数,改为其他时间周期:周、月、季度等
===============================================================================
SQN:
  - sqn: 1.0152350590677315
  - trades: 32
===============================================================================
SharpeRatio:
  - sharperatio: -66.94067728496657
===============================================================================
AnnualReturn:
  - 2020: 8.860000000066037e-05
  - 2021: 0.00038036629954540935
===============================================================================
TradeAnalyzer:
  -----------------------------------------------------------------------------
  - total:
    - total: 32
    - open: 0
    - closed: 32
  -----------------------------------------------------------------------------
  - streak:
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - won:
      - current: 1
      - longest: 9
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - lost:
      - current: 0
      - longest: 2
  -----------------------------------------------------------------------------
  - pnl:
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - gross:
      - total: 53.19999999999992
      - average: 1.6624999999999974
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - net:
      - total: 46.89999999999994
      - average: 1.4656249999999982
  -----------------------------------------------------------------------------
  - won:
    - total: 22
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - pnl:
      - total: 122.12029999999996
      - average: 5.5509227272727255
      - max: 23.0399
  -----------------------------------------------------------------------------
  - lost:
    - total: 10
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - pnl:
      - total: -75.22030000000002
      - average: -7.522030000000003
      - max: -15.918399999999988
  -----------------------------------------------------------------------------
  - long:
    - total: 32
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - pnl:
      - total: 46.89999999999994
      - average: 1.4656249999999982
      *************************************************************************
      - won:
        - total: 122.12029999999996
        - average: 5.5509227272727255
        - max: 23.0399
      *************************************************************************
      - lost:
        - total: -75.22030000000002
        - average: -7.522030000000003
        - max: -15.918399999999988
    - won: 22
    - lost: 10
  -----------------------------------------------------------------------------
  - short:
    - total: 0
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - pnl:
      - total: 0.0
      - average: 0.0
      *************************************************************************
      - won:
        - total: 0.0
        - average: 0.0
        - max: 0.0
      *************************************************************************
      - lost:
        - total: 0.0
        - average: 0.0
        - max: 0.0
    - won: 0
    - lost: 0
  -----------------------------------------------------------------------------
  - len:
    - total: 242
    - average: 7.5625
    - max: 26
    - min: 1
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - won:
      - total: 98
      - average: 4.454545454545454
      - max: 15
      - min: 1
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - lost:
      - total: 144
      - average: 14.4
      - max: 26
      - min: 1
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - long:
      - total: 242
      - average: 7.5625
      - max: 26
      - min: 1
      *************************************************************************
      - won:
        - total: 98
        - average: 4.454545454545454
        - max: 15
        - min: 1
      *************************************************************************
      - lost:
        - total: 144
        - average: 14.4
        - max: 26
        - min: 1
    +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    - short:
      - total: 0
      - average: 0.0
      - max: 0
      - min: 9223372036854775807
      *************************************************************************
      - won:
        - total: 0
        - average: 0.0
        - max: 0
        - min: 9223372036854775807
      *************************************************************************
      - lost:
        - total: 0
        - average: 0.0
        - max: 0
        - min: 9223372036854775807
===============================================================================
DrawDown:
  - len: 31
  - drawdown: 0.016181390901583496
  - moneydown: 16.191600000005565
  -----------------------------------------------------------------------------
  - max:
    - len: 269
    - drawdown: 0.03984537510517593
    - moneydown: 39.85270000001765
===============================================================================
TimeReturn:
  - 2020-12-31: 8.860000000066037e-05
  - 2021-12-31: 0.00038036629954540935
===============================================================================
VWR:
  - vwr: 0.02078841499279231

输出信息中的TimeReturn时间周期回报率, 使用的周期也是year(年度) , 所以最终数据和使用annual_return年化回报率完全相同。

代码仓库链接:CPythoner/BackTraderDemo at develop (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1376305.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js(JavaScript)数据结构之字典

什么是数据结构? 下面是维基百科的解释: 数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。 我们每天的编码中都会…

审稿变慢?还疯狂拒稿?这本毕业神刊如今争议不断,还值得一投吗?

【SciencePub学术】 IEEE ACCESS 期刊评说 网友辣评 评说1:麻了,11月17收到外审,现在意见还没回来啊,神刊肿么了? 评说2:两个审稿人评审的,一个拒绝(最终意见大修)&…

代码随想录 Leetcode707. 设计链表

题目: 代码(首刷看解析 2024年1月11日): class MyLinkedList { private:struct ListNode{int val;ListNode* next;ListNode(int val):val(val),next(nullptr){}};int size;ListNode* dummyHead; public:MyLinkedList() {dummyHead new List…

序章 初始篇—转生到vue世界!

Vue.js 是什么? Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项…

四、C++运算符(4)比较运算符

作用&#xff1a;用于表达式的比较&#xff0c;并返回一个真值或者假值 #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<string> using namespace std; int main() {//int a 10;int b 20; //变量a重新赋值为100//cout << (ab) << end…

【Redis】Redis 进阶

文章目录 1. BigKey1.1 MoreKey1.2 BigKey 2. 缓存双写一致性更新策略2.1 读缓存数据2.2 数据库和缓存一致性的更新策略2.3 canal 实现双写一致性 3. 进阶应用3.1 统计应用3.2 hyperloglog3.3 GEO3.4 bitmap 4. 布隆过滤器5. Redis 经典问题5.1 缓存预热5.2 缓存穿透5.3 缓存击…

order by 与 分页 的冲突

order by 与 分页 的冲突 问题背景 Oracle拼接SQL&#xff0c;JAVA使用SQLQueryExecutor执行拼接的SQL&#xff0c;SQL如下&#xff1a; SELECT col_key, col_other_info FROM tb_tableName WHERE col_where_info 一些筛选条件 order by col_updatetime desc 该表中的数…

一行代码给Button添加一个光标焦点动画:得着焦点按钮放大,失去焦点按钮恢复

当光标进入Button的时候&#xff0c;也就是Button得着焦点时&#xff0c;Button出现放大效果&#xff0c;失去焦点的时候&#xff0c;恢复原来的尺寸。 本例仅供学习交流之用 一、效果 按钮得着焦点&#xff0c;放大 按钮失去焦点&#xff0c;恢复 二、给按钮添加动效 得着…

k8s中的基础概念

k8s可以从硬件和软件两方面来理解&#xff1a; 硬件&#xff1a; 1、节点&#xff08;Node&#xff09;&#xff1a;类似于手机、平板、电脑 2、集群&#xff08;Cluster&#xff09;&#xff1a;多个节点组合到一起 3、持久卷&#xff08;Persistent Volumes&#xff09;&…

微信小程序开发WebSocket通讯

官方文档说明&#xff1a;入口 WebSocket连接的链接只支持wss加密方式&#xff0c;且只能用域名的方式 该域名还要在微信公众平台的小程序中登记才能使用&#xff0c;开发->开发管理->服务器域名->修改 该域名要和https使用的一致 以域名地址&#xff1a;dtu.aab…

质量好洗地机有哪些?洗地机口碑榜

在很多人眼中&#xff0c;洗地机可能被简单地视为一种高价的拖把&#xff0c;但作为一个经验丰富的洗地机测评博主&#xff0c;我要强调洗地机在家务工作中的巨大价值。它不仅仅是一种清洁工具&#xff0c;更是集扫地、拖地、洗地以及擦干地板等多项功能于一身的强大设备。通过…

【软件测试】学习笔记-设计GUI自动化测试策略

这篇文章从“实战”这个角度展开&#xff0c;探讨实际的大型全球化电商网站的GUI自动化测试如何开展。这场实战&#xff0c;从以下两个方面展开&#xff1a; 测试策略如何设计&#xff1f;这一点&#xff0c;我会根据亲身经历的实际项目&#xff0c;和你探讨GUI测试的分层测试…

R730服务器做了raid的硬盘,插在R720上面可以用吗?

环境 戴尔R720 戴尔R730 问题描述 R730服务器做了raid的硬盘&#xff0c;插在R720上面可以用吗&#xff1f; 解决方案 1.直接在 R730服务器做了raid的硬盘&#xff0c;卸下来在插在r720上面使用 &#xff0c;读不到硬盘 2.前往R730服务器上面&#xff0c;去清除RAID配置的…

采集小红书笔记详情页的方法,大部分人都想得复杂了

一般来说&#xff0c;社交媒体都有列表页和详情页、个人主页三大页面&#xff0c;列表页一般包含搜索结果页、话题聚合页等等&#xff0c;详情页就是点开某一条笔记或者动态的具体页面&#xff1b; 小红书当然也不例外&#xff0c;比如下面这个话题聚合页&#xff1a; https:/…

csv文件查找工具(一)

自己写的小工具&#xff0c;查询csv文件前三列的数据互查&#xff0c; 主要目的是 组sql 需要这三个数据互查&#xff0c; 当然从数据库查的更快&#xff0c; 但数据库的连接需要验证权限&#xff0c;能自己搞&#xff0c;先自己搞 速度待优化&#xff0c;没时间搞了&#xff0…

【办公技巧】Word功能区灰色显示不能编辑,怎么破?

Word文档可以设置加密来保护文件禁止修改&#xff0c;但是在word文档中设置限制编辑功能时对它的作用是否有详细的了解呢&#xff1f;今天为大家介绍word限制编辑功能的作用以及忘记了限制编辑密码该如何解决。 设置限制大家应该都清楚&#xff0c;就是点击工具栏中的审阅 – …

微信小程序开发学习笔记《7》全局配置以及小程序窗口

微信小程序开发学习笔记《7》全局配置以及小程序窗口 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。全局配置官方文档 一、全局配置文件及常用的配置项 小程序根目录下的app.json 文件是小程序的全局配置文件。 常用的配置项如…

Java基础项目---飞机大战的简易实现

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读前言一、系统分析问题描述总体设计功能流程图 二、程序和算法的介绍FlyingOb…

DDNS-GO配置使用教程

环境&#xff1a;openwrt 下载地址&#xff1a;Releases jeessy2/ddns-go GitHub 下载 ssh至openwrt根目录&#xff0c;根据你的处理器选择要下载的版本&#xff0c;我是路由器&#xff0c;选择的是 ddns-go_5.7.1_linux_arm64.tar.gz wget github链接 安装 tar -zxvf…

Java面试题之JVM

Java面试题之JVM 1. JVM的组成部分及其作用&#xff1f;2. JVM的堆和栈的区别&#xff1f;3. 简述一下垃圾回收机制&#xff1f;(垃圾回收的原理&#xff1f;)4. 垃圾回收器都有什么&#xff1f;该怎么选择&#xff1f;5. 如何判断垃圾可以回收了&#xff1f;6. 垃圾回收算法有…