当前位置: 首页 > news >正文

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填写表单,留言备注试用因子平台!

相关文章:

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

DolphinDB 开发的因子开发管理平台 Starfish 围绕量化投研的因子、策略开发阶段设计&#xff0c;为用户提供了一个从数据管理、因子研究到策略回测的完整解决方案。 因子平台的回测引擎提供了多个关键的事件函数&#xff0c;涵盖策略初始化、每日盘前和盘后回调、逐笔、快照和…...

Oracle 数据库中,UNION ALL创建视图的使用详解

目录 UNION ALL 的特点 UNION ALL 的作用 1. 合并结果集 2. 保留重复行 3. 提高性能 UNION ALL 的使用场景 1. 日志或数据拼接 2. 区分数据来源 3. 解决分区表查询 注意事项 在创建视图中的作用 场景 1&#xff1a;合并多个表的数据到视图 表结构 目标 SQL 实现…...

无名信号量和条件变量

1.使用无名信号量实现春夏秋冬的输出 #include <myhead.h> sem_t sem1,sem2,sem3,sem4; void *fun1() {while(1){sem_wait(&sem1);sleep(1);printf("春\n");sem_post(&sem2);} } void *fun2() {while(1){sem_wait(&sem2);sleep(1);printf("夏…...

之前使用vue-element-admin框架开发的项目无法启动,可能是这个原因

最近运行之前的项目&#xff0c;发现无法正常启动&#xff0c;可能有以下几种情况&#xff1a; 一、版本问题 报错&#xff1a; this[kHandle] new _Hash(algorithm, xofLen); Error: error:0308010C:digital 因为在 node V17 版本发布了 OpenSSL3.0 对算法…...

JDK的配置

目录 第一步&#xff0c;配置JAVA_HOME. 第二步&#xff0c;进入JDK的bin目录&#xff0c;然后复制路径。 第三步&#xff0c;配置CLASSPATH. 第四步&#xff0c;检验是否配置成功 安装好JDK后&#xff0c;配置三个环境变量 第一步&#xff0c;配置JAVA_HOME. 先找到JDK…...

【Linux系列】Linux 系统中查看目录权限

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

开启数字化时代心理服务新篇章:专属线上心理咨询服务小程序

在当今快节奏的社会中&#xff0c;心理健康问题日益受到人们的关注。然而&#xff0c;传统的心理咨询模式往往受限于时间和地点&#xff0c;使得许多人在寻求心理帮助时感到不便。与此同时&#xff0c;心理课程的传播也面临着诸多挑战&#xff0c;如何高效地触达目标客户群体&a…...

[Unity] Text文本首行缩进两个字符

Text文本首行缩进两个字符的方法比较简单。通过代码把"\u3000\u3000"加到文本字符串前面即可。 比如&#xff1a; 效果&#xff1a; 代码&#xff1a; TMPtext1.text "\u3000\u3000" "选择动作类型&#xff1a;";...

探索 OpenTofu:开源基础设施即代码工具

引言 在现代云计算和 DevOps 实践中,基础设施即代码(IaC)已经成为不可或缺的一部分。它使得基础设施的管理更加自动化、可重复和可维护。HashiCorp 的 Terraform 是这一领域的领先工具,但随着时间的推移,开源社区也开始关注其许可证的变更。OpenTofu 作为 Terraform 的一…...

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办篇章

2024首届世界酒中国菜国际地理标志产品美食文化节成功举办&#xff0c;开启美食文化交流新篇章 近日&#xff0c;首届世界酒中国菜国际地理标志产品美食文化节在中国国际地理标志大厦成功举办&#xff0c;这场为期三天的美食文化盛会吸引了来自世界各地的美食爱好者、行业专家…...

宽字节注入

尽管现在呼吁所有的程序都使用unicode编码&#xff0c;所有的网站都使用utf-8编码&#xff0c;来一个统一的国际规范。但仍然有很多&#xff0c;包括国内及国外&#xff08;特别是非英语国家&#xff09;的一些cms&#xff0c;仍然使用着自己国家的一套编码&#xff0c;比如gbk…...

H5 scss 移动端的样式适配

在移动端样式的scss文件中&#xff0c;出现了这些变量 env() 与 constant() 设置安全区域&#xff0c;是css里IOS11新增的属性&#xff0c;webkit的css函数&#xff0c;用于设定安全区域与边界的距离&#xff0c;有4个预定义变量&#xff1a; safe-area-inset-left: 安全区域距…...

240004基于Jamva+ssm+maven+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

Word2Vec 模型 PyTorch 实现并复现论文中的数据集

详细注解链接&#xff1a;https://www.orzzz.net/directory/codes/Word2Vec/index.html 欢迎咨询&#xff01;...

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(一) 你好&#xff0c;我是拉依达。 感谢所有阅读关注我的同学支持&#xff0c;目前博客累计阅读 27w&#xff0c;关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析&#xff08;持续更新&#xff09;-CSDN博客》已经是 Lin…...

使用matlab对矩阵进行分块

1. 前言 由于matlab内存限制&#xff0c;导致无法处理较大尺寸的矩阵&#xff1b; 2. 解决思路 读取原始大尺寸矩阵&#xff0c;分块后处理&#xff0c;及时删除中间过程文件&#xff0c;只保留分块处理后的最终结果&#xff0c;最后合并结果文件&#xff0c;减少内存占用。 …...

MongoDB(上)

MongoDB 基础 MongoDB 是什么&#xff1f; MongoDB 是一个基于 分布式文件存储 的开源 NoSQL 数据库系统&#xff0c;由 C 编写的。MongoDB 提供了 面向文档 的存储方式&#xff0c;操作起来比较简单和容易&#xff0c;支持“无模式”的数据建模&#xff0c;可以存储比较复杂…...

超详细的pycharm+anaconda搭建python虚拟环境

&#xff08;一&#xff09;pycharm安装 1. 下载 &#xff08;1&#xff09;从官网下载 &#xff0c;一般来说选择社区版就够用了。我这里选择2024.1.6的windows版本Other Versions - PyCharmGet past releases and previous versions of PyCharm.https://www.jetbrains.com/…...

yarn修改缓存位置

查看缓存位置 以下三个命令分别为&#xff1a;bin是yarn存储命令的二进制文件&#xff0c;global存储全局node_modules &#xff0c;cache存储用下下载缓存&#xff0c;查看本机目前的目录&#xff1a; 查看bin目录命令&#xff1a;yarn global bin 查看global目录命令&…...

单元测试知识总结

我们希望每段代码都是自测试的&#xff0c;每次改动之后&#xff0c;都能自动发现对现有功能的影响。 1 测试要求 在对软件单元进行动态测试之前&#xff0c;应对软件单元的源代码进行静态测试&#xff1b; 应建立测试软件单元的环境&#xff0c;如数据准备、桩模块、模拟器…...

光谱相机

光谱相机是一种能够同时获取目标物体的空间图像信息和光谱信息的成像设备。 1、工作原理 光谱相机通过光学系统将目标物体的光聚焦到探测器上&#xff0c;在探测器前设置分光元件&#xff0c;如光栅、棱镜或滤光片等&#xff0c;将光按不同波长分解成多个光谱通道&#xff0c…...

账号下的用户列表表格分析

好的&#xff0c;这是您提供的 el-table 组件中所有列的字段信息&#xff0c;以表格形式展示&#xff1a; 列标题 (label)字段属性 (prop)对齐方式 (align)宽度 (width)是否可排序 (sortable)说明IDidcenter100否管理员的唯一标识符头像avatarcenter90否管理员的头像 URL 或路…...

软件开发中 Bug 为什么不能彻底消除

在软件开发中&#xff0c;Bug无法彻底消除的原因主要包括&#xff1a;软件复杂度高、人员认知与沟通受限、需求和环境不断变化、工具与测试覆盖不足、经济与时间成本制约。其中“需求和环境不断变化”尤为关键&#xff0c;因为在实际开发中&#xff0c;业务逻辑随着市场与用户反…...

Flutter 中的 Flexible 与 Expanded 的介绍、区别与使用

在 Flutter 中&#xff0c;布局是构建用户界面的重要部分。Flexible 和 Expanded 是两个常用的布局小部件&#xff0c;它们都用于控制子小部件在父容器中的空间分配。虽然它们有相似之处&#xff0c;但在使用上有一些关键的区别。本文将介绍这两个小部件的基本概念、区别、参数…...

从零开始学习 sg200x 多核开发之 sophpi 编译生成 fip.bin 流程梳理

本文主要介绍 sophpi 编译生成 fip.bin 流程。 1、编译前准备 sophpi 的基本编译流程如下&#xff1a; $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注&#xff1a; 需要在 bash 下运行clean_all 非必要可以不…...

通过一个例子学习回溯算法:从方法论到实际应用

回溯算法&#xff1a;从方法论到实际应用 回溯算法&#xff08;Backtracking&#xff09;是一种通过穷举法寻找问题所有解的算法&#xff0c;它的核心思想是逐步构建解空间树&#xff0c;在每个步骤中判断当前解是否合法。如果不合法&#xff0c;就“回溯”到上一步&#xff0…...

google 的guava 学习 基本工具类

Guava 是 Google 开发的一个 Java 核心库&#xff0c;它提供了一系列工具类&#xff0c;用于简化 Java 编程中的常见任务。以下是 Preconditions 和 Verify 两个工具类的使用示例&#xff1a; Preconditions 类 Preconditions 类提供了一组静态方法&#xff0c;用于在代码中插…...

【Linux金典面试题(上)】41道Linux金典面试问题+详细解答,包含基本操作、系统维护、网络配置、脚本编程等问题。

大家好&#xff0c;我是摇光~&#xff0c;用大白话讲解所有你难懂的知识点 之前写了一篇关于 python 的面试题&#xff0c;感觉大家都很需要&#xff0c;所以打算出一个面试专栏。 【数据分析岗】Python金典面试题 这个专栏主要针对面试大数据岗位、数据分析岗位、数据运维等…...

SpringBoot【九】mybatis-plus之自定义sql零基础教学!

一、前言&#x1f525; 环境说明&#xff1a;Windows10 Idea2021.3.2 Jdk1.8 SpringBoot 2.3.1.RELEASE mybatis-plus的基本使用&#xff0c;前两期基本讲的差不多&#xff0c;够日常使用&#xff0c;但是有的小伙伴可能就会抱怨了&#xff0c;若是遇到业务逻辑比较复杂的sq…...

CTF 攻防世界 Web: FlatScience write-up

题目名称-FlatScience 网址 index 目录中没有发现提示信息&#xff0c;链接会跳转到论文。 目前没有发现有用信息&#xff0c;尝试目录扫描。 目录扫描 注意到存在 robots.txt 和 login.php。 访问 robots.txt 这里表明还存在 admin.php admin.php 分析 在这里尝试一些 sql…...

【记录49】vue2 vue-office在线预览 docx、pdf、excel文档

vue2 在线预览 docx、pdf、excel文档 docx npm install vue-office/docx vue-demi0.14.6 指定版本 npm install vue-office/docx vue-demi <template><VueOfficeDocx :src"pdf" style"height: 100vh;" rendere"rendereHandler" error&…...

机器学习中的 Transformer 简介(第 1 部分)

目录 一、说明 二、为什么是 Transformer&#xff1f; 三、什么是 Transformer&#xff1f; 3.1 译者的类比 四、编码器部分 4.1 、从文本输入到输入嵌入 4.2 词嵌入 4.2 N倍编码器段 4.4 多头注意力机制 4.5 添加残差和层归一化 4.6 添加残差和层归一化 五、总结 一、说明 西如…...

宝塔-docker拉取宝塔镜像,并运行宝塔镜像

宝塔-拉取宝塔镜像&#xff0c;并运行镜像 第1步&#xff1a;查询 docker search btpanel/baota此docker镜像由堡塔安全官方发布&#xff0c;镜像版本为宝塔面板9.2.0正式版和9.0.0_lts 稳定版&#xff0c;镜像会随着宝塔面板更新。 目前支持x86_64和arm架构可供下载使用 版本…...

【从零开始入门unity游戏开发之——C#篇12】新的引用类型——数组array

文章目录 一、数组&#xff08;array&#xff09;&#xff08;一维数组&#xff09;1、声明数组2、初始化数组3、访问数组元素4 、修改数组元素5、获取数组的长度6、遍历数组使用 for 循环&#xff1a;使用 foreach 循环&#xff1a; 7、数组方法排序&#xff1a;逆序&#xff…...

人工智能在数字人的技术与应用

在人工智能领域&#xff0c;数字人技术正逐渐从科幻小说走向现实。数字人&#xff0c;也称为虚拟助手或虚拟形象&#xff0c;是通过AI技术模拟人类行为、语言和情感的数字化存在。本文将深入探讨数字人技术的核心原理、最新进展以及在不同领域的应用案例&#xff0c;为专业人士…...

【机器人】Graspness 端到端 抓取点估计 | 论文解读

在复杂场景中实现抓取检测&#xff0c;Graspness是一种端到端的方法&#xff1b; 输入点云数据&#xff0c;输出抓取角度、抓取深度、夹具宽度等信息。 开源地址&#xff1a;GitHub - rhett-chen/graspness_implementation: My implementation of Graspnet Graspness. 论文地…...

服务器Docker OOM RSS高问题排查思路

优质博文&#xff1a;IT-BLOG-CN 防走弯路为防止走弯路&#xff0c;强烈建议先仔细阅读以下加粗内容&#xff1a; 如果你的应用是因为公司最近降成本调小实例物理内存才出现docker oom&#xff0c;而之前从来没有出现过&#xff0c;那么大概率是堆内存太大导致&#xff0c;这种…...

动态导出word文件支持转pdf

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、功能说明二、使用步骤1.controller2.工具类 DocumentUtil 导出样式 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff…...

【文档搜索引擎】在内存中构造出索引结构(下)

文章目录 4.保存到磁盘中为什么要保存在磁盘中怎么保存操作步骤1. 前期准备2. 主要操作 5. 将磁盘中的数据加载到内存中Parser 类完整源码Index 类完整源码 4.保存到磁盘中 为什么要保存在磁盘中 索引本来是存储在内存中的&#xff0c;为什么要将其保存在硬盘中&#xff1f; …...

旅游资源系统|Java|SSM|VUE| 前后端分离

【技术栈】 1⃣️&#xff1a;架构: B/S、MVC 2⃣️&#xff1a;系统环境&#xff1a;Windowsh/Mac 3⃣️&#xff1a;开发环境&#xff1a;IDEA、JDK1.8、Maven、Mysql5.7 4⃣️&#xff1a;技术栈&#xff1a;Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html 5⃣️数据库可…...

如何用细节提升用户体验?

前端给用户反馈是提升用户体验的重要部分&#xff0c;根据场景选择不同的方式可以有效地提升产品的易用性和用户满意度。以下是常见的方法&#xff1a; 1. 视觉反馈 用户执行了某些操作后&#xff0c;需要即时确认操作结果。例如&#xff1a;按钮点击、数据提交、页面加载等。…...

容器设计模式:Sidecar

文章目录 容器设计模式&#xff1a;Sidecar 模式1. 什么是 Sidecar 模式&#xff1f;2. Sidecar 模式的原理2.1 工作机制2.2 常见用途 3. Sidecar 模式示例示例&#xff1a;日志收集 4. Sidecar 模式的架构图图例&#xff1a; 5. Sidecar 模式的优点6. Sidecar 模式的局限性7. …...

深入剖析MyBatis的架构原理

架构设计 简要画出 MyBatis 的架构图 >> ​​ Mybatis 的功能架构分为哪三层&#xff1f; API 接口层 提供给外部使用的接口 API&#xff0c;开发人员通过这些本地 API 来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。MyBatis 和数据库的…...

深入C语言文件操作:从库函数到系统调用

引言 文件操作是编程中不可或缺的一部分&#xff0c;尤其在C语言中&#xff0c;文件操作不仅是处理数据的基本手段&#xff0c;也是连接程序与外部世界的重要桥梁。C语言提供了丰富的库函数来处理文件&#xff0c;如 fopen、fclose、fread、fwrite 等。然而&#xff0c;这些库…...

【Linux】shell脚本二

2、接收用户的参数 shell脚本已经内设了用于接收用户输入参数的变量&#xff0c;变量之间可以使用空格隔开。 如&#xff1a;./test.sh one two three four $0&#xff1a;对应的是当前shell脚本程序的名称&#xff0c;即test.sh$#&#xff1a;对应的是总共有几个参数&#…...

从万维网到人工智能:改变生活的11项技术里程碑

1984 年 1 月 24 日&#xff0c;苹果公司推出了 Macintosh 128K&#xff0c;从此永远改变了个人电脑的面貌。 史蒂夫・乔布斯&#xff08;Steve Jobs&#xff09;这款小巧且用户友好的电脑向全世界引入了图形用户界面&#xff0c;标志着个人技术发展历程中的一个关键时刻。 从…...

Hyperledger Fabric 2.x 环境搭建

Hyperledger Fabric 是一个开源的企业级许可分布式账本技术&#xff08;Distributed Ledger Technology&#xff0c;DLT&#xff09;平台&#xff0c;专为在企业环境中使用而设计&#xff0c;与其他流行的分布式账本或区块链平台相比&#xff0c;它有一些主要的区别。 环境准备…...

【Maven】自定义Maven插件

场景&#xff1a; 1、自定义一个插件目标 timer&#xff0c;用于显示当前日期时间。 2、将 timer 绑定到 validate 阶段。 调研 1、maven-clean-plugin 下载 maven-clean-plugin 插件的源码&#xff0c;在本地使用 IDEA 打开 可以看到&#xff0c;maven-clean-plugin 插件是…...

修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号

效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改&#xff0c;增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…...

数据结构day3作业

一、完整功能【顺序表】的创建 【seqList.h】 #ifndef __SEQLIST_H__ #define __SEQLIST_H__#include <stdio.h> #include <string.h> #include <stdlib.h>//宏定义&#xff0c;线性表的最大容量 #define MAX 30//类型重定义&#xff0c;表示要存放数据的类…...