Starfish 因子开发管理平台快速上手:如何完成策略编写与回测

DolphinDB 开发的因子开发管理平台 Starfish 围绕量化投研的因子、策略开发阶段设计,为用户提供了一个从数据管理、因子研究到策略回测的完整解决方案。

因子平台的回测引擎提供了多个关键的事件函数,涵盖策略初始化、每日盘前和盘后回调、逐笔、快照和K线行情的回调,以及订单委托和成交回报函数。通过在策略初始化函数中定义指标,并在相应的回调函数中编写自定义策略逻辑,用户可以灵活地实现自己的交易策略。此外,因子平台还支持多样化的回测结果展示,用户可以通过数据报告和内置可视化报告直观地评估策略表现。这些可视化工具不仅帮助用户深入分析收益来源和风险因素,还能有效监控策略的执行效果,助力更为精准的策略优化。

本文将详细展示如何使用 DolphinDB 因子开发管理平台完成策略编写、回测运行。

Starfish 安装部署可参考  DolphinDB:Starfish 因子开发管理平台快速上手丨因子开发篇。

Starfish 因子开发管理平台 license 需申请试用,请点击  联系我们 - DolphinDB 填写表单,留言备注试用因子平台!

1. 策略开发与回测

在金融市场中,策略的开发与回测是投资成功的核心。Starfish 因子开发管理平台提供了一系列工具,帮助用户有效创建和验证交易策略,从而优化投资决策。

1.1 策略开发

策略开发是回测流程的起点。用户首先需要创建一个新的回测策略,选择相关的市场类型,如股票或期货,确定数据和回测类型,以及定义策略的基本信息如名称和描述。这一步是整个回测流程的基础,设定了后续操作的参数。具体的创建参数有:

  1. 名称:策略名称
  2. 回测类型:策略的品种,包含股票、期货、期权、债券。
  3. 行情类型:输入行情的类型,包含快照、分钟频率、快照频率;对于股票,还支持逐笔+快照或者快照+成交。
  4. 数据类型:TABLE 或者 DICT,代表进入回测的行情类型,具体会影响到在策略编写时如何拿取行情。例如,如若选择 TABLE,那么,需要用 for 循环的方式拿取每个时间中的每一条行情;如若选择 DICT,则可以拿 key 直接访问到行情。因此如果要追求更高的性能,更推荐使用 DICT 方式。
  5. 标签:用户自定义的标签。
  6. 备注:用户自定义的标签。

1.2 策略代码

在确定策略框架后,编写策略代码是关键一步。通过定义一系列事件函数,用户可以实现对市场数据的响应,确保策略的逻辑和执行能够与市场动态保持一致。

事件函数说明
def initialize(mutable context){}策略初始化函数,只触发一次。可以在该函数中初始化一些变量,或者订阅指标计算。回调函数传入参数 context 为逻辑上下文,是由回测引擎创建的字典变量
def beforeTrading(mutable context){}策略盘前交易函数,每日盘前触发一次。可以在该函数中一些启动前的准备,如订阅行情等
def onTick(mutable context, msg,indicator){}逐笔行情通知函数,行情更新时的处理函数,逐笔委托和成交。在股票的逐笔+快照类型回测时不需要indicator参数。
def onSnapshot(mutable context, msg,indicator){}快照行情通知函数,在股票的逐笔+快照类型回测时不需要indicator参数。
def onBar(mutable context, msg,indicator){}k线行情通知函数。
def onOrder(mutable context,orders){}委托回报通知函数,每个订单状态有变化时会触发。
def onTrade(mutable context,trades){}成交回报通知函数,有成交时会触发。
def afterTrading(mutable context){}策略每日盘后回调函数,每日盘后触发一次。可以在该函数统计当日的成交等信息
def finalize(mutable context){}策略结束之后回调函数

重要参数解释:

  • context:逻辑上下文,是由回测引擎创建的字典变量。策略的所有自定义变量都可以设置在 context 中。自动包含以下 4 个变量:
    • context[“tradeTime”] 获取行情的最新时间
    • context[“tradeDate”] 获取当前日期
    • context[“BarTime”] 快照降频为低频行情时的当前期 Bar 时间戳
    • context[“engine”] 获取回测引擎实例。

  • msg:回测引擎传入最新的行情。在 onTick 中即为 tick 行情,在 onSnapshot 中即为快照行情,在 onBar 中即为K线行情。
  • indicator:在初始化函数 initialize 中通过引擎接口 subscribeIndicator 自动订阅计算,以方便用户在后续策略中使用。indicator 集成了流数据处理方案,可以操作滑动窗口计算。

例如,在 initialize 函数中定义了指标 rsi:

def initialize(mutable context){d = dict(STRING,ANY)d["rsi"]=<ta::rsi(close,5)>  // 使用内置ta因子模块中的rsi因子Backtest::subscribeIndicator(context['engine'],'kline',d)
}

在回调函数中引用指标或者行情:

def onBar(mutable context, msg, indicator=NULL){for (stock in msg.keys()){close = msg[stock]['close'] // 获取标的的收盘价rsi = indicator[stock]['rsi'] // 获取标的rsi指标}
} // 假定msg为字典

其余的参数介绍,可以在策略编辑页面右上角辅助文档按钮打开,包含了传入的行情的具体字段,方便用户进行回调函数的编写:

1-1 策略代码编辑页面

1.3 回测引擎参数

配置回测引擎参数是运行回测前的重要环节。用户需设定初始资金、手续费等核心参数,以模拟真实交易环境,确保策略的有效性。其中,以下的参数配置为必填项:

key说明备注
startDate开始日期
endDate结束日期
cash初始资金
commission手续费
tax印花税
frequencyfrequency>0时,行情为逐笔行情,引擎内部合成 frequency 频率的行情触发 onSnapshot默认为0,合成频率为0,指自动合成

配置完这些必填参数后,理论上即可运行一个回测任务。但对于不同的策略类型(股票、期货、期权和债券),引擎还会有额外不同的参数配置,具体的参数配置和介绍可以参考回测文档 Backtest。

1.4 行情数据

行情数据的字段及类型主要基于 DolphinDB 回测引擎对数据结构范式的规定:一般来说用户从不同交易所、数据库获取各种股票数据,包括逐笔委托订单数据、快照数据、逐笔成交数据和 k 线数据。然而,这些数据来源各异,具有不同的结构和范式,对每一栏数据的含义、格式和取值也缺乏统一的规范。因此,用户在使用回测功能时,需要先确认数据结构的正确性。

在因子平台的策略与回测功能中,输入的行情数据源会是运行设定的一部分,具体在预设的第二步中。可以看到,平台中支持两种方式的数据源入参方式:

1-2 回测参数 - 设置数据源

  • 已有库表:选择当前用户可访问的库表,及其与目标字段的对应关系。只能选择数据类型与目标数据类型相同的字段。
  • 自定义计算:用户可以使用 SQL 的查询函数进行表的重构,或是使用公共函数库内的函数对已有的数据源进行处理,将最后的结果赋值为 result。在编写代码时,可以点击”计算代码“旁边的问号按钮查看此回测任务需要的目标行情数据源具体的列名、类型以及解释。

1-3 回测参数 - 设置数据源 - 计算代码

2. 回测结果解析

在因子平台中,回测结果的呈现方式主要分为数据报告和可视化报告两大类。

2.1 数据报告

数据报告提供了回测引擎返回的五个关键结果表格,涵盖了策略收益、每日权益、持仓情况等核心指标。这些数据不仅便于用户快速预览回测结果,还支持CSV格式下载,方便后续分析与分享。

数据报告中包含了回测引擎返回的 5 个结果表格:

表名含义
getReturnSummary策略的收益概述
getDailyTotalPortfolios策略每日权益指标
getDailyPosition每日持仓数据详情
getTradeDetails交易明细表
getPosition持仓信息

每个部分结果默认展示前 10 行,可以在表格下方切换页数查看 10 行以后的数据。每个表格的字段根据策略类型略有不同,例如对于期货分钟频,getReturnSummary 和 getDailyTotalPortfolios 结果为:

2-1 回测结果 - 数据报告

用户可以通过数据报告对回测的结果有一个大概的预览,并且可以点击每个表格右上角的下载按钮下载此表格为 csv 文件。

2.2 可视化报告

因子平台的内置可视化报告分为六个部分,为用户提供了丰富的策略分析视角。通过图表和可视化数据,用户可以直观地把握策略的核心执行结果、收益变化和持仓状况,从而实现对策略性能的深入评估。

1. 策略概述:汇总并展示策略的核心执行结果,包括基本统计和性能指标。数据源自 getReturnSummary,这为用户提供了一个快速把握策略效果的视图。

2-2 回测可视化报告 - 策略概述

2. 收益详情:该部分通过三个标签页展示不同的收益数据:

  • 每日收益率/盈亏:展示每一交易日的收益变化,帮助用户追踪策略的短期表现。

2-3 回测可视化报告 - 每日收益率/盈亏
  • 账户单位净值:展示账户净值的时间序列变化,反映策略从长期角度的资本增长。

2-4 回测可视化报告 - 账户单位净值

  • 累计收益率:展示从策略启动至今的总收益率,为评估整体投资回报提供依据。

2-5 回测可视化报告 - 累计收益率

3. 交易分析:包含了从开始日期到结束日期开仓的所有标的的行情及买卖信号的可视化图表。可以根据日期和标的进行筛选。也可以在这个图中观察在 initialize 中使用 subscribeIndicator 订阅的指标。例如在下图中,此策略订阅了 3 个指标:rsi、prevMacd、macd,即可在交易分析图中进行点击查看。对于分钟频率或者日频的策略,行情价格对应收盘价;对于快照数据,则对应行情中的 lastPrice。

2-6 回测可视化报告 - 交易分析

4. 持仓详情:包含了从开始日期到结束日期策略每日的持仓状况,用户可按时间及标的物筛选,直观了解持仓变动。此部分有助于用户监控策略的持仓风险和市场敞口。

2-7 回测可视化报告 - 持仓详情

5. 账户详情:包含了从开始日期到结束日期的账户详情,如提供策略运行期间的详细账户情况,如资产总值、现金余额等。根据策略类型的不同,返回的字段不同。例如,对于股票来说,包含以下信息:

2-8 回测可视化报告 - 账户详情

6. 订单详情:包含了从开始日期到结束日期每个开仓的标的所产生的订单详情,包括订单提交、成交至订单成功等状态。用户可以根据日期及标的进行筛选。对于每一笔成交的交易,都会有提交及下单成功两条交易。

2-9 回测可视化报告 - 订单详情

总体而言,这些内置可视化报告为用户提供了一个全面、多维的视角来评估和优化他们的交易策略,实现了对策略性能深入的可视化分析,同时利用低代码环境来充分利用 DolphinDB 的高效数据处理能力。

3. 回测进阶用法

在进行策略回测时,深入掌握进阶用法能够显著提升策略优化的效率和效果。因子平台为用户提供了灵活的工具,以满足多样化的策略需求,包括自定义参数寻优和绩效归因分析,这些功能使得策略开发和评估变得更加精准和系统化。

3.1 自定义参数寻优

在策略开发中,经常需要调整多个参数以达到最佳的市场表现。这些参数可能包括窗口大小、最大买卖价差、报价金额、对冲偏移量、价格波动等。因子平台提供了一个强大的自定义参数寻优功能,使得策略优化过程更加直观和灵活。

首先,在策略的编写阶段,开发者可以通过 userParams 字典传入策略函数来使用自定义参数。userParams 是一个由开发者自行定义的键值对集合,使策略在运行时能够调用这些自定义设置。

3-1 策略用例代码编写页面 - 初始化函数

在策略的回测参数设置中,开发者可以详细配置每个参数的候选值。具体的键值对可以在回测参数第三步中设置:

3-2 策略用例回测参数 - 自定义参数

例如上图的 CTA 策略想基于 MACD 指标记录买入卖出信号,但对于指标中的参数 shortWindowN 和 longWindowN 要进行参数的寻优。因此,可以在回测设置的自定义参数模块中给 initialize 函数中的 userParams 自定义参数字典加入键值,也就是名称,以及对应的值的选项。在代码编辑页中的 initialize 中,就可以通过 userParams[参数名称] 的方式访问到对应的值。例如,在上图代码框中,要提取 shortWindowN 的值,即可使用 userParams["shortWindowN"]拿取。

需要注意的是,所有的值都是字符串的形式,因此在真正使用的时候,需要对非字符串的值进行一层类型转换。例如 shortWindowN 为整数类型,则需要使用的时候使用 int(userParams["shortWindowN"])拿取到整数类型的窗口大小。

因为在这里设定了多个值,就会产生多个回测任务,在第六步参数组合中,即可查看共有几种参数组合。

3-3 策略用例回测参数 - 参数组合

3.2 绩效归因

绩效归因是评估和优化策略的重要手段,通过对策略回测结果的深入分析,可以了解策略的收益来源和风险因素,从而改进策略表现。本节将介绍如何在平台上创建和使用绩效归因模板,对历史回测结果进行可视化评价。因子平台中的绩效归因模板可以通过自定义的方式来评价策略结果。所有用户创建的模板都是公开的,用户可以查看和使用平台上所有的模板,但只能编辑和删除自己的模板。
首先,用户需在平台的“策略与回测”模块中找到并点击“绩效归因”选项,进入模板列表页面。在此页面中,所有可用的绩效归因模板均已列出。用户可通过点击页面上的“创建”按钮,启动新模板的创建过程。在此过程中,需要填写以下必要参数:

  • 模板名称
  • 描述:可以简要记录模板的用途和特点。
  • 标签:添加相关标签,便于分类和搜索。
3-4 新建绩效归因模板

创建成功后,即可跳转入绩效归因的编辑页面,该页面分为两个主要部分:模板参数和模板代码。

  • 模板参数:从概念上讲,绩效归因模板是通过函数调用实现对历史回测结果的深入计算。在模板参数部分,有一个控件类型为策略运行记录选择器,用于选择进行归因分析的结果对象。其余参数则包括归因时间及归因方法。在设置每个参数时,需明确每个参数的名称、控件类型及默认值。
3-5 绩效归因模板编辑 - 模板参数

  • 模板代码:在这一部分,平台会自动生成函数定义及其对应的参数提取方式。在撰写绩效归因代码时,用户只需直接使用参数名即可获取相应的参数值,进而对策略结果及相关参数进行进一步计算和整理。需注意,函数的返回值必须是字典类型,以保证数据的结构性。
3-6 绩效归因模板编辑 - 模板代码

在完成代码编辑后,用户可以点击代码框右上角的“查看运行结果”按钮,进行模板及默认参数值的试运行,以确保所得到的结果符合预期。

在因子平台中,我们内置了 Brinson 和 Campisi 两个绩效归因模板以及相对应的函数模块库。对于每个模板的实现方式和结果含义可以参考基于 DolphinDB 的 Brinson 绩效归因模型实践 和基于 DolphinDB 的 Campisi 绩效归因模型实践 。

  • Brinson:Brinson 绩效归因一般用于股票组合,具体的参数解释如下:
参数名称含义
backtestResult历史回测结果
methodBrinson 的归因方式,默认值为 BHB。可选值为 BHB 和 BF
multiPeriod是否多期归因
showAll是否展示每期结果
multiPeriodMethod多期归因的方式,默认是为 grap。可选值为 grap 和 sum
industryClassCode行业分类表代码。在这里填写如何获取股票的代码及对应的行业表格。如若不填,则不以行业进行归因,而是将每个股票当作一个行业进行归因分析
selfDefinedBenchmark是否自定义基准
benchmarkCode获取基准持仓表的代码,需要有 symbol 和 weight 两列。
  • Campisi:Campisi 绩效归因适用于债券组合的回测结果,具体的参数解释如下: 
参数名称含义
backtestResult历史回测结果
treasuryCurveCode获取国债曲线表格的代码。如若不填,则使用模拟数据
convexity是否考虑凸性
benchmark是否选择有基准归因
benchmarkPositionCode获取基准持仓表的代码,需要有 symbol 和 weight 两列
industryCurveCode获取行业曲线表格的代码,如若不填,则使用模拟数据
multiPeriod是否多期归因

4. 回测实战用例

本节将通过股票快照策略和和股票日频策略的具体案例,介绍因子开发管理平台的策略开发与回测功能。

4.1 股票快照策略

4.1.1 策略开发

在策略与回测页面下我的策略中,可以创建新策略,选择相应的策略、行情、消息类型后就会跳转此策略的编辑页面。

  • 在策略初始化函数中,此策略定义了一个指标 maxVolatility_1m,为当前 tick 相比于上一个 tick 的收益率。subscribeIndicator 接口获取回测引擎名、需要计算的数据类型(如 snapshot、tick 等)、需要计算的指标字典(key为指标名,用于之后访问;value为指标计算的元代码),之后计算结果将传入 onSnapshot 等策略回调函数。
4-1 stockDemo1 - 策略代码 - 初始化函数

  • 在每日盘前回调交易函数中,可以初始化当日的全局变量,并使用 Backtest::setUniverse 订阅设定当日的股票池。
4-2 stockDemo1 - 策略代码 - 策略盘前交易函数
  • 在快照行情通知函数中,编写基于快照行情的策略逻辑。可以根据行情及策略信号下达委托买卖订单。onSnapshot 中的 msg 参数中包含了最新的快照行情以及在初始化中订阅的指标。例如,在 Demo 中,我们可以计算出的 maxVolatility_1m 值来判断是否需要下达委托买的订单。Backtest::submitOrder 是回测引擎提供的下单接口。
4-3 stockDemo1 - 策略代码 - 快照行情通知函数

因此本策略的主要逻辑为:如果最新价相比于前价涨幅超过1%,则下单 000001.XSHE 的限价买单,下单时间为最新的快照时间,价格为一档卖价,股数为一档卖量。

4.1.2 回测运行

在编辑页面或者列表点击运行按钮后,就会弹出需要选择的预设参数。对于内置的两个策略 Demo,我们也提供了对应的预设参数。例如,stockDemo1 对应的预设为 stockDemo1_preset。点击后,所需要的参数就会自动填充完成。

4-4 stockDemo1 - 策略回测预设 - 选择预设

  • 设置参数:完整的配置参数列表请参阅 回测插件接口说明文档

4-5 stockDemo1 - 策略回测预设 - 设置参数

  • 设置数据源:此预设中因为我们没有数据,因此使用的是两条模拟的 tick 数据

4-6 stockDemo1 - 策略回测预设 - 设置数据源

  • 设置自定义参数:用于参数寻优,在 Demo2 中会详细介绍使用方法
  • 设置可视化模板:用于选择可视化的模板。如果不选,则默认使用内置的可视化模板
  • 设置绩效归因:选择绩效归因模板以及对应的参数
  • 参数组合:帮助确认已填的参数会产生的回测任务数量

在设置完所有参数后点击运行即可进入运行的详情页面。当然,如果已经设置好所有所需的参数,可以在任一步骤中点击运行。

4.1.3 回测结果

回测的结果页面可以分为两个部分:

4-7 stockDemo1 - 策略回测结果详情页

  • 运行信息:包含此运行的元信息以及运行状态、运行参数
  • 策略子任务:包含此运行中所有回测任务的运行时间、回测时间以及运行状态。
    • 例如,在这里可以点击查看日志查看策略中打印的日志

4-8 stockDemo1 - 策略回测结果详情页 - 查看日志

  • 点击查看详情,即可查看回测任务的详情
    • 运行结果:里面包含了所有回测引擎返回的表格结果。可以对每个表格进行下载。
4-9 stockDemo1 - 策略回测结果详情页 - 数据报告

  • 可视化报告:因为在参数处未选择模板,生成的报告使用了默认的可视化模板,包含了策略概述、收益详情、交易分析、持仓详情、账户详情和订单详情,对于后 4 个模块,可以进行股票代码和日期的筛选。

4.2 股票日频策略

接下来,我们来介绍一个更为复杂的日频策略来展示如何使用因子开发管理平台中的策略来编写事件回调函数,并且实现参数寻优的功能 。策略中也可以订阅因子平台中开发完成的因子信号,以实现交易信号的生成。

4.2.1 策略开发

以公共脚本库下的 stockDemo2 为例。下图为策略初始化函数中的代码,可以分为三个部分进行解析:

4-10 stockDemo2 - 策略代码 - 初始化函数

  • 信号订阅:蓝框内为订阅相对强弱 RSI 指标,与 stockDemo1 中展示的一样,在字典 d 中订阅指标并且使用 Backtest::subscribeIndicator 指定订阅指标的数据类型。这里为 ‘kline’,因此我们可以在 onBar 处获得指标的结果
  • 因子信号定义:在绿框内,我们使用到了 “ta::rsi” 这个因子,代表平台中有一个因子模块 ta,rsi 是其中的一个因子。因此,在订阅指标的时候用户可以任意使用到公开因子模块或者草稿因子模块中的因子信号。
  • 自定义参数的参数寻优:在每一个函数参数中都存在 userParams 用于储存用户的自定义参数,以实现自定义参数及参数寻优的功能。例如,在上图中,在计算 RSI 信号时,需要对 timePeriod 进行调参以实现优化策略的功能。
    • 首先,在设定运行回测参数的自定义参数对应的函数下添加 ‘timePeriod’ 以及对应的可选值
    • 设定好参数后,对应的值可以通过参数 userParams 进行获取。例如在 stockDemo2 中,我们使用到了 int(userPrams["timePeriod"]) 取出相应的值。需要注意的是,使用前需要把值转为对应的类型,例如这里使用 int() 将值转为整数类型。

在逐笔行情通知函数 onBar 中,此策略进一步定义了对于交易信号的判断:

4-12 stockDemo2 - 策略代码 - 逐笔行情通知函数

  • 在这个回调函数中,我们取出行情中的 rsi 指标值和在 contextDict 中储存的上一个 rsi 值,通过一些简单的 if 条件来判断是否需要提交委托买卖订单
    • 使用 print 函数打印日志,用于策略的 debug

4.2.2 回测结果

编辑好回调函数及代码后,点击运行,选择默认的内置预设 stockDemo2_preset 即可进行运行。运行详情页面如下:

4-13 stockDemo2 - 策略回测结果详情 

  • 参数寻优报告:包含了所有回测任务的回测结果一览,包含了指标概述等比较。可以在此看到不同参数所产生的策略收益与成交信息。
4-14 stockDemo2 - 策略回测结果详情 - 参数寻优报告

并且可以点击不同的回测任务查看到每个任务的具体详情,例如点击综合第一下的 stockDemo2_3 即跳转到对应的报告:

4-15 stockDemo2 - 策略回测结果详情 - 可视化报告

以上就是一个更为复杂的策略在因子开发管理平台的实现。

试用 Starfish 因子开发管理平台,请点击 联系我们 - DolphinDB填写表单,留言备注试用因子平台!

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET|日常开发中读写TXT文本详解

ASP.NET&#xff5c;日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET&#xff5c;日常开发中…

走进 RAG 技术:一场智能数据交互的奇幻之旅

朋友们&#xff0c;咱身处的这个时代&#xff0c;科技那可是跟开了挂似的往前冲&#xff0c;其中人工智能更是厉害得没话说&#xff0c;宛如一个充满无限可能的魔法领域&#xff0c;时不时就给咱的生活来个大变样。而在这其中&#xff0c;RAG 技术就像是突然冒出来的一颗超亮眼…

leetcode-402.移调k位数字-day8

代码实现细节影响 方法一&#xff1a;在构建最终结果字符串时&#xff0c;通过 stack.substring(0, stack.length() - k < 1? 0 : stack.length() - k).toString() 这样的方式来截取需要的部分&#xff0c;这个操作相对比较直接简洁&#xff0c;不需要额外的反转等操作&…

第十二课 Unity 内存优化_内存工具篇(Memory)详解

内存&#xff08;Memory&#xff09; unity 内存部分也是优化过程中非常重要的一个环节&#xff0c;也会影像渲染过程中的同步等待与带宽问题。因此内存的优化也可能会给我们渲染开销带来精简&#xff0c;今天我们先来了解unity中的内存与使用到的内存工具。 Unity中的内存 托…

ESlint代码规范,手动与自动修复

规范说明 规则参考 - ESLint - 插件化的 JavaScript 代码检查工具 规范说明 ​ ​ 可看到是main.js文件报错分别是第三行第30个字符&#xff0c;以及第七行第一个字符 后面则是规范说明&#xff0c;可以根据说明查找相应的规范 一.手动修正 ctrl f 可以搜索 二.自动修正 …

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…

vue3监听横向滚动条的位置;鼠标滚轮滑动控制滚动条滚动;监听滚动条到顶端

1.横向取值scrollLeft 竖向取值scrollTop 2.可以监听到最左最右侧 3.鼠标滚轮滑动控制滚动条滚动 效果 <template><div><div class"scrollable" ref"scrollableRef"><!-- 内容 --><div style"width: 2000px; height: 100…

FFTW 库于 Qt Creator 环境的部署与应用

1.什么是FFTW库 FFTW库是用于一维或多维快速傅里叶变换(FFT)的C函数库。 2.在Qt中的安装和使用 2.1 下载合适版本 我们以 FFTW 3.3.5 版本为例&#xff0c;对于 Windows 64 位平台&#xff0c;&#xff0c;可以从官网的下载链接&#xff1a;FFTW Installation on Windows 2…

加餐:读者写者问题与读写锁+自旋锁

目录 一、读者写者问题1、读者写者问题2、读者写者 vs 生产消费3、读者写者问题如何理解 二、读写锁1、读写锁接口&#xff08;1&#xff09;设置读写优先&#xff08;2&#xff09;初始化&#xff08;3&#xff09;销毁&#xff08;4&#xff09;加锁和解锁 2、读写锁案例 三、…

新零售社交电商系统小程序功能开发详细解析

现在的购物方式是越来越有趣了&#xff0c;新零售社交电商系统是互联网、大数据、人工智能的技术和咱们熟悉的传统零售深度结合后产生的。它整合线上线下渠道及数据&#xff0c;带来全方位、多渠道、个性化购物体验。借助实时库存管理、智能推荐和无缝购物体验等功能&#xff0…

【学习笔记】移动端浏览器的视口

两个视口 视觉视口&#xff1a;是当前显示屏页面中的一部分 布局视口&#xff1a;完整页面的大小 视觉视口 布局视口有多宽&#xff1f;这因浏览器而异。Safari iPhone使用980px&#xff0c; Opera 850px, Android WebKit 800px, IE 974px 视觉视口和布局视口相同 局视口宽度…

xshell连接虚拟机,更换网络模式:NAT->桥接模式

NAT模式&#xff1a;虚拟机通过宿主机的网络访问外网。优点在于不需要手动配置IP地址和子网掩码&#xff0c;只要宿主机能够访问网络&#xff0c;虚拟机也能够访问。对外部网络而言&#xff0c;它看到的是宿主机的IP地址&#xff0c;而不是虚拟机的IP。但是&#xff0c;宿主机可…

PVE系统下——OpenWRT一键扩容脚本(x86下EXT4SquashFS)

扩容了x86上的 OpenWrt 根分区和文件系统。 1.PVE 上增加硬盘大小 2.执行脚本 安装依赖 opkg update opkg install parted losetup resize2fs下载脚本并一键执行 wget -U "" -O expand-root.sh "https://openwrt.org/_export/code/docs/guide-user/advanced…

嵌入式Linux之wifi配网C++版

上篇文章,介绍了嵌入式Linux开发板中,通过sh脚本调用wpa_supplicant等工具进行配网。 本篇,来介绍如何通过C++编程 ,来实现同样的功能。 1 准备工作 我这个开发板,之前配置了开机自动启动配网脚本,为了便于测试C++编程,可以先关掉开机配网的自动脚本。 在/etc/init.d…

YOLOv8目标检测(六)_封装API接口

YOLOv8目标检测(一)_检测流程梳理&#xff1a;YOLOv8目标检测(一)_检测流程梳理_yolo检测流程-CSDN博客 YOLOv8目标检测(二)_准备数据集&#xff1a;YOLOv8目标检测(二)_准备数据集_yolov8 数据集准备-CSDN博客 YOLOv8目标检测(三)_训练模型&#xff1a;YOLOv8目标检测(三)_训…

Intel(R) Iris(R) Xe Graphics安装Anaconda、Pytorch(CPU版本)

一、Intel(R) Iris(R) Xe Graphics安装Anaconda 下载网址&#xff1a;https://repo.anaconda.com/archive/ 双击Anaconda3-2024.10-1-Windows-x86_64&#xff0c;一直下一步&#xff0c;选择安装的路径位置&#xff0c;一直下一步就安装完成了。打开Anaconda PowerShell Promp…

docker安装、升级、以及sudo dockerd --debug查看启动失败的问题

1、docker安装包tar下载地址 Index of linux/static/stable/x86_64/ 2、下载tgz文件并解压 tar -zxvf docker-24.0.8.tgz 解压后docker文件夹下位docker相关文件 3、将老版本docker相关文件&#xff0c;备份 将 /usr/bin/docker下docker相关的文件&#xff0c;mv到备份目录…

vue 对接百度地图,选择附近的点

安装依赖 npm install vue-baidu-map0.21.22 编写页面 <template><view class"nearLocation"><u-navbar :is-back"false" title"选择附近的点" title-color"black"><view style"padding-left: 20px;&quo…

详解排序几大算法

一、插入排序 基本思想&#xff1a; 直接插入排序是一种简单的插入排序算法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列。 步骤&#x…

Unix 和 Windows 的有趣比较

Unix 和 Windows NT 比较 来源于这两本书&#xff0c;把两本书对照来读&#xff0c;发现很多有意思的地方&#xff1a; 《Unix 传奇》 https://book.douban.com/subject/35292726/ 《观止 微软创建NT和未来的夺命狂奔 》 Showstopper!: The Breakneck Race to Create Windows…