【python量化交易】qteasy使用教程05——创建第一个自定义交易策略

创建第一个自定义交易策略

  • 使用qteasy创建自定义交易策略
    • 开始前的准备工作
    • 本节的目标
    • 自定义策略的实现方法
    • 使用 `qteasy` 的 `Strategy` 策略类
    • 三种不同的自定义策略基类
    • 定义一个双均线择时交易策略
      • 定义策略运行时机
      • 定义策略需要的数据
      • 自定义交易策略的实现:`realize()`
        • 获取历史数据和可调参数值:
      • 第一个策略的回测结果
    • 本节回顾

使用qteasy创建自定义交易策略

qteasy是一个完全本地化部署和运行的量化交易分析工具包,Github地址在这里,并且可以通过pip安装:

$ pip install qteasy -U

qteasy具备以下功能:

  • 金融数据的获取、清洗、存储以及处理、可视化、使用
  • 量化交易策略的创建,并提供大量内置基本交易策略
  • 向量化的高速交易策略回测及交易结果评价,避免未来函数的内核设计
  • 交易策略参数的优化、评价、部署、以及实盘运行

通过本系列教程,您将会通过一系列的实际示例,充分了解qteasy的主要功能以及使用方法。

开始前的准备工作

在开始本节教程前,请先确保您已经掌握了下面的内容:

  • 安装、配置qteasy —— QTEASY教程1
  • 设置了一个本地数据源,并已经将足够的历史数据下载到本地——QTEASY教程2
  • 学会创建交易员对象,使用内置交易策略,——QTEASY教程3
  • 学会使用混合器,将多个简单策略混合成较为复杂的交易策略——QTEASY教程4

在QTEASY文档中,还能找到更多关于使用内置交易策略、创建自定义策略等等相关内容。对qteasy的基本使用方法还不熟悉的同学,可以移步那里查看更多详细说明。

本节的目标

qteasy的内核被设计为一个兼顾高速执行以及足够的灵活性的框架,理论上您可以实现您所设想的任何类型的交易策略。

同时,qteasy的回测框架也做了相当多的特殊设计,可以完全避免您无意中在交易策略中导入"未来函数",确保您的交易策略在回测时完全基于过去的数据,同时也使用了很多预处理技术以及JIT技术对内核关键函数进行了编译,以实现不亚于C语言的运行速度。

不过,为了实现理论上无限可能的交易策略,仅仅使用内置交易策略以及策略混合就不一定够用了,一些特定的交易策略,或者一些特别复杂的交易策略是无法通过内置策略混合而成的,这就需要我们使用qteasy提供的Strategy基类,基于一定的规则创建一个自定义交易策略。

在本节中,我们将介绍qteasy的交易策略基类,通过几个具体的例子详细讲解如何基于这几个基类,创建一个只属于您自己的交易策略。为了循序渐进,我们先从一个较为简单的例子开始。

自定义策略的实现方法

在量化交易的工作流程中,一个交易策略实际上就是一个函数,这个函数以已知的信息作为输入,通过一系列逻辑推演,输出交易决策。不管什么技术流派,不管哪种交易风格,不管任何分析方法,交易策略的最根本的定义,就是如此。

在这里插入图片描述

比如:

  • 技术分析派利用过去的股票价格(输入数据)计算技术指标(逻辑推演),进行买入/卖出操作(交易决策
  • 价值投资派利用上市公司的各项指标(输入数据),分析公司的成长潜力(逻辑推演),决定买入/卖出哪一支股票(交易决策
  • 宏观分析者即使不关心个股的价格,也需要参考热点新闻、市场景气(仍然是输入数据),分析市场的整体趋势(逻辑推演),决定是否入市(交易决策
  • 高频或超高频的套利交易,也需要根据短期内价格的实时变化(输入数据),分析套利空间大小(逻辑推演),以便迅速介入操作(交易决策

上面的交易策略,如果以较高的频率,跟踪少数投资品种,就是所谓的“择时交易策略”,如果以较低的频率,跟踪大量的投资品种,就是所谓的“选股策略”。

总之,一切量化交易,都是一套定期运行的逻辑推演,在每次运行时,提取当时的最新数据作为输入,输出一套交易决策。如此反复运行,形成稳定的交易操作流水,概莫能外,这就是交易策略的抽象概念。

使用 qteasyStrategy 策略类

qteasy的交易策略就是基于上面的概念定义的。qteasy提供了策略基类Strategy,定义交易策略时只需要继承Strategy类,并在初始化时定义下面三个方面的内容:

  • 策略的运行时机 —— 策略何时运行,以什么频率运行,例如,每分钟运行一次,每天运行一次,是开盘时运行,还是收盘时运行?在qteasy中,策略的运行时机是以策略的属性Strategy.strategy_run_timing来定义
  • 策略需要的数据 ——策略需要的数据输入;例如,需要过去10天的日K线数据,还是过去一年的市盈率?在qteasy中,策略所需的数据量可以以Strategy.strategy_data_types 等属性完全自由定义,并指定数据类型、频率以及窗口长度
  • 策略的逻辑 ——通过重写Strategy.realize()方法,用户可以自由定义如何使用输入数据,产生交易决策。

除了上面跟策略有关的信息以外,其余所有的工作qteasy都已经做好了,所有的交易数据都会根据策略属性被自动打包成一个ndarray数组,可以很方便地提取并使用;同一个交易策略,在实盘运行时会自动抽取交易数据,根据定义好的策略生成交易信号,在回测时也会自动提取历史数据,自动生成历史数据切片,不会形成未来函数。同时,所有交易数据都会

因此,在qteasy中的策略自定义非常简单:

  • __init__() 在此方法中定义策略的运行参数,包括运行的频率、视窗长度、使用的数据类型、可调参数数量类型等
  • realize() 在此方法中定义策略的运行逻辑:提取自动生成的交易数据,根据数据生成交易信号

在这里插入图片描述

除了上面所说的策略属性以外,自定义策略同样拥有与内置交易策略相同的基本属性,例如可调参数数量、类型等等,因为它们与内置交易策略相同,在这里就不赘述了。

三种不同的自定义策略基类

qteasy提供了三种不同的策略类,便于用户针对不同的情况创建自定义策略。

  • GeneralStg: 通用交易策略类,用户需要在realize()方法中给出所有交易资产的交易决策信号
  • FactorSorter: 因子选股类,用户只需要在realize()方法中定义出选股因子,便可以通过对象属性实现多种选股动作
  • RuleIterator: 循环规则类,用户只要针对一支股票定义选股或择时规则,则同样的规则会被循环作用于所有的股票,而且不同股票可以定义不同的参数

三种交易策略基类的属性、方法都完全相同,区别仅在于realize()方法的定义。

下面,我们通过几个循序渐进的例子来了解如何创建自定义策略。

定义一个双均线择时交易策略

我们的第一个例子是最简单的双均线择时交易策略,这是一个最经典的择时交易策略。
这个均线择时策略有两个可调参数:

  • FMA 快均线周期

  • SMA 慢均线周期
    策略根据过去一段时间的收盘价,计算上述两个周期产生的简单移动平均线,当两根均线发生交叉时产生交易信号:

  • 当快均线自下而上穿过上边界,发出全仓买入信号

  • 当快均线自上而下穿过上边界,发出全部卖出信号

在这里插入图片描述

这个策略的逻辑非常简单。那我们怎么定义这个策略呢?首先,我们需要决定使用哪一种交易策略基类。很多情况下,三种交易策略基类都可以用来生成同样的交易策略,只不过某些基类针对特定类型的策略提前做了一些定义,因而可以进一步简化策略的代码。这个策略是一个典型的择时策略,是针对不同投资品种应用同一规则的策略类型,因此,我们可以先用RuleIterator策略类来建立策略。在后面的例子中我们会陆续讲到另外两种策略类。

接下来,我们把这个策略的三大要素明确一下:

  • 策略的运行时机 —— 为了简单,我们定义这个策略每天收盘时运行
  • 策略需要的数据 ——为了计算两条均线,我们需要每次策略运行时的历史收盘价(“close”),而且需要过去连续至少SMA天的历史数据,才足够用来计算SMA慢均线
  • 策略的逻辑 ——提取收盘价后,首先计算两条均线,然后判断最近一天的均线是否有上穿/下穿。具体说来,就是比较昨天和今天两个移动平均价的相对关系,如果昨天SMA大于FMA,而今天SMA就小于FMA了,说明FMA从下方上穿了SMA,应该产生全仓买入信号,这个信号为1,如果情况正好相反,则输出全仓卖出信号-1,其他情况下则输出0,没有交易信号。

有了上面的准备,那我们来看看策略代码如何定义。一个最基本的策略代码,第一步就是继承策略基类(这里是RuleIterator),创建一个自定义类:

from qteasy import RuleIteratorclass Cross_SMA(RuleIterator):# 策略的属性定义在__init__()方法中def __init__(self):super().__init__()# 策略的具体实现代码写在策略的realize()函数中def realize(self, h, **kwargs):"""策略的具体实现代码:"""pass

好了,上面几行代码,就是我们第一个自定义交易策略的全部框架了,在这个框架中填充属性,补充逻辑,就能成为一个完整的交易策略。怎么做呢,我们首先定义这个策略的最基本属性——名称、描述、以及可调参数:

名称和描述都是策略的信息,在后续调用时方便了解策略的用途,咱们按照喜好定义即可,比较关键的属性是可调参数。

在我们这个策略中,我们希望快均线和慢均线的计算参数是可调的,因为这两个参数直接影响了快慢均线的具体位置,从而直接影响两条均线的交叉点,从而形成不同的买卖点,参见下面两张图,分别显示了同一只股票在同一段时间内不同速度均线的交叉情况,当均线的计算周期不同时,产生的买卖点也完全不同:

在这里插入图片描述
上图中均线周期分别为15天/40天,产生三次买入、两次卖出信号
在这里插入图片描述
上图中均线周期分别为5天/50天,产生两次买入、一次卖出信号

既然均线周期直接影响到策略的表现,因此我们自然希望找到最优的均线周期组合(参数组合),使得策略的表现最佳。为了达到这个目的,qteasy允许用户将这些参数定义为“可调参数”,并提供优化算法来寻找最优参数。对所有的内置交易策略来说,可调参数的数量和含义是定义好的,用户不能修改,但是在自定义策略这里,用户就有了很大的自由度,理论上讲,策略运行过程中用到的任何变量,都可以被定义为可调参数。

在这里,我们将快慢均线的周期定义为可调参数,在策略属性中进行以下定义

    def __init__(self):super().__init__(name='CROSSLINE',  # 策略的名称description='快慢双均线择时策略',  # 策略的描述pars=(30, 60),  # 策略默认参数是快均线周期30, 慢均线周期60par_count=2,  # 策略只有长短周期两个参数par_types=['int', 'int'],  # 策略两个参数的数据类型均为整型变量par_range=[(10, 100), (10, 200)],  # 两个策略参数的取值范围)

定义策略运行时机

接下来,我们开始定义策略的运行时机。运行时机由两个属性定义:
策略的运行时机可以定义为‘close’(收盘时)或者‘open’(开盘时)。这里的开盘与收盘并不仅仅指每个交易日的开盘与收盘,而是指广义的区间结束和开始,如果策略被定义为每分钟运行一次,那么close指的是在这个每分钟时间区间的结束时运行策略,也就是每分钟的最后一秒运行策略。因此,timing和freq两个属性共同定义了策略的运行时机。

如下面的属性定义了策略在每个交易日收盘时运行(实盘运行时策略会在收盘前一分钟运行以避免收盘后无法提交交易委托)

    def __init__(self):super().__init__(...  # 其他属性略strategy_run_timing = 'close'strategy_run_freq = 'd')

定义策略需要的数据

策略需要的数据由三个属性确定,分别定义数据类型(ID),数据频率以及采样窗口长度。

定义好策略数据后,qteasy会自动将窗口内的数据打包送入策略realize()函数,如果在回测的过程中,所有历史数据会根据同样的规则分别打包成一系列的数据窗口,因此,不管是回测还是实盘运行,realize()函数接受到的历史数据格式完全相同,处理方式也完全相同,确保实盘和回测运行的一致性,也避免了回测中可能出现的未来函数:

在这里插入图片描述

数据类型的定义如下,我们需要过去201天的每日收盘价,之所以需要201天的收盘价,是因为我们定义了可调参数的最大范围为200,为了计算周期为200的移动均线,需要201天的收盘价

    def __init__(self):super().__init__(...  # 其他属性略strategy_data_types='close',  # 策略基于收盘价计算均线,因此数据类型为'close'data_freq = 'd',  # 历史数据的频率为日window_length=201,  # 历史数据窗口长度为201,每一次交易信号都是由它之前前201天的历史数据决定的)

至此,自定义交易策略的所有重要属性就全部定义好了。接下来我们来定义策略的实现。

自定义交易策略的实现:realize()

在realize方法中,我们需要做三件事情,我们一件件解决:

  • 获取历史数据
  • 获取可调参数
  • 编写逻辑,产生输出
获取历史数据和可调参数值:

realize()方法的输入参数是一个标准定义,前面已经提到过了,所有需要的数据都会自动打包传入,这些数据就是参数hh代表“history data”

h的形态是一个Numpy ndarray,在RuleIterator策略中,它是一个二维数组,有N行、M列,其中每一列包含一种历史数据,每一行包含一个周期的数据。
在这个例子中,由于我们定义的数据类型为过去201天的收盘价,只有一种数据类型,因此h有201行,1列,每一行是一天的收盘价,数据是升序排列的,因此第一行为最早的数据,最后一行为最近的数据。我们要获取历史数据,直接从ndarray中切片即可。

前面已经提过,这个策略的可调参数就是均线的计算周期,因此,为了使用可调参数计算周期,我们需要取得可调参数的值,这些值保存在策略的pars属性中,通过self.pars即可获取。

    def realize(self, h, **kwargs):"""策略的具体实现代码"""close = h[:, 0]  # 通过切片获取最近201天的收盘价f, s= self.pars  # 读取快均线(f)和慢均线(s)的计算周期

到这里,实现策略逻辑所需要的元素都备齐了,接下来我们可以开始实现策略逻辑。

我们需要首先计算两组移动平均价,如果用户安装了ta-lib库,那么可以直接调用ta-lib的SMA函数计算移动平均价,如果没有安装,现在也没有太大关系,因为qteasy为用户提供了免ta-lib版本的SMA函数,(并不是所有的技术指标都有免ta-lib版本,详情参见参考文档)可以直接引用计算。

    def realize(self, h, **kwargs):"""策略的具体实现代码"""...from qteasy.tafuncs import sma# 使用qt.sma计算简单移动平均价s_ma = sma(close, s)f_ma = sma(close, f)# 为了考察两条均线的交叉, 计算两根均线昨日和今日的值,以便判断s_today, s_last = s_ma[-1], s_ma[-2]f_today, f_last = f_ma[-1], f_ma[-2]

计算出移动均线后,我们可以直接在realize方法中定义策略的输出,也就是交易决策。

对于RuleIterator类策略,不管我们的策略同时作用于多少支股票,我们都只需要定义一套规则即可,是为“规则迭代”,因此,我们只需要输出一个数字,代表交易决策即可。这个数字会被qteasy自动转化为不同的交易委托单。转化的规则由Operator对象的工作模式确定,关于这一点在前面的教程中已经介绍过了,这里不再赘述。

总之,如果我们计划让Operator工作在“PS”模式下,那么只需要在应当买入的当天,产生交易信号“1”,在应当卖出的当天,产生交易信号“-1”即可,如果不希望交易,则输出“0”:

    def realize(self, h, **kwargs):"""策略的具体实现代码"""...if (f_last < s_last) and (f_today > s_today):  return 1# 当快均线自上而下穿过上边界,发出全部卖出信号elif (f_last > s_last) and (f_today < s_today):  return -1else:  # 其余情况不产生任何信号return 0

至此,这个交易策略就定义完成了!qteasy会完成所有背后的复杂工作,用户仅需要集中精力解决策略的数据和逻辑定义即可。完整代码如下(为节约篇幅,删除了所有注释):

from qteasy import RuleIterator
# 创建双均线交易策略类
class Cross_SMA(RuleIterator):def __init__(self):super().__init__(name='CROSSLINE',  # 策略的名称description='快慢双均线择时策略',  # 策略的描述pars=(30, 60),  # 策略默认参数是快均线周期30, 慢均线周期60par_count=2,  # 策略只有长短周期两个参数par_types=['int', 'int'],  # 策略两个参数的数据类型均为整型变量par_range=[(10, 100), (10, 200)],  # 两个策略参数的取值范围strategy_run_timing = 'close'strategy_run_freq = 'd'strategy_data_types='close',  # 策略基于收盘价计算均线,因此数据类型为'close'data_freq = 'd',  # 历史数据的频率为日window_length=201,  # 历史数据窗口长度为201,每一次交易信号都是由它之前前201天的历史数据决定的)def realize(self, h, **kwargs):from qteasy.tafuncs import smaf, s= parsclose = h[:, 0]s_ma = sma(close, s)f_ma = sma(close, f)s_today, s_last = s_ma[-1], s_ma[-2]f_today, f_last = f_ma[-1], f_ma[-2]if (f_last < s_last) and (f_today > s_today):  return 1  # 全仓买入信号elif (f_last > s_last) and (f_today < s_today):  return -1  # 全仓卖出信号else:  # 其余情况不产生任何信号return 0

接下来,我们就可以像使用任何内置交易策略一样使用这个自定义策略了。

op = qt.Operator(strategy=[Cross_SMA()], signal_type='PS'))

让我们看看这个策略的回测结果。

第一个策略的回测结果

策略回测的参数设置与内置交易策略完全一样

op = qt.Operator([Cross_SMA_PS()], signal_type='PS')# 设置op的策略参数
op.set_parameter(0, pars= (20, 60)  # 设置快慢均线周期分别为20天、60天)# 设置基本回测参数,开始运行模拟交易回测
res = qt.run(op, mode=1,  # 运行模式为回测模式asset_pool='000300.SH',  # 投资标的为000300.SH即沪深300指数invest_start='20110101',  # 回测开始日期visual=True  # 生成交易回测结果分析图)

回测的结果如下:

在这里插入图片描述

下面,我们可以尝试一下修改策略的可调参数,再重新跑一遍回测,回测区间与前一次相同:

op.set_parameter(0, pars= (25, 166)  # 设置快慢均线周期分别为25天、166天)# 设置基本回测参数,开始运行模拟交易回测,回测参数完全一样
res = qt.run(op, mode=1,  # 运行模式为回测模式asset_pool='000300.SH',  # 投资标的为000300.SH即沪深300指数invest_start='20110101',  # 回测开始日期visual=True  # 生成交易回测结果分析图)

可以看到,改变参数后,策略的回测结果大为改观:要了解如何进行策略参数优化,请参考本教程的后续章节

在这里插入图片描述

至此,我们已经实现了一个简单的自定义择时交易策略,那么另外两种策略类如何实现呢?下面我们再用两个例子来说明。

本节回顾

在这一节中,我们了解了qteasy中对交易策略的抽象定义,了解了一个交易策略所包含的基本要素以及它们的定义方法,并且通过一个最简单的例子,实际创建了一个自定义双均线交易策略。

接下来,我们还将继续介绍自定义交易策略,因为相关的内容比较多,所以自定义交易策略相关的教程将占用三个章节。在下一章节中,我们将学习如何使用另外两种自定义策略基类(FactorSorter因子选股基类和GeneralStg通用策略基类)来创建交易策略。接着,我们将再用一个章节的篇幅,来介绍一个比较复杂的自定义交易策略,展示qteasy的灵活性,敬请期待!

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

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

相关文章

OpenGL入门第四步:摄像机视角变换与交互

OpenGL入门第一步:创建窗口、重写虚函数-CSDN博客 OpenGL入门第二步:颜色、纹理设置(解析)-CSDN博客 OpenGL入门第三步:矩阵变换、坐标系统-CSDN博客 目录 函数解析 具体代码 函数解析 相机视角变换需要与鼠标键盘进行交互,需要重写鼠标和键盘响应函数。 初始化 …

【Java】获取近六个月的年月

数据库里面存储的字段类型就是varchar&#xff0c;数据格式就是类似2024-12这样的年月格式。 目标&#xff1a; 以当前月份为标准&#xff0c;向前获取近6个月的年月&#xff08;year_month&#xff09;形成列表 // 获取近6个月的年月列表List<String> recentMonths ge…

java项目之相亲网站的设计与实现源码(springboot+mysql+vue)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的相亲网站的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 相亲网站的设计与实…

Unable to locate the .NET SDK

问题描述&#xff1a; vs2019 加载项目时&#xff0c;提示如下&#xff1a; Unable to locate the .NET SDK as specified by global.json, please check that the specified version is installed. 项目中没有globan找al.json 文件 先使用&#xff1a; dotnet --list-sdks 命…

论文研读 Disentangled Information Bottleneck

解耦信息瓶颈 摘要&#xff1a; 信息瓶颈方法是一种从源随机变量中提取与预测目标随机变量相关的信息的技术&#xff0c;通常通过优化平衡压缩和预测项的IB拉格朗日乘子f来实现&#xff0c;然而拉格朗日乘子很难优化&#xff0c;需要多次实验来调整拉格朗日乘子的值&#xff0c…

mybatis 跨库查询 mysql

跨库&#xff0c;表关联的查询&#xff0c;实现起来很简单&#xff1a; select a.uid from ucenter.user a , database user_profile b where a.uid b.uid;只要在表的前边加上库名即可。 这个是我项目中xml 中的一个例子&#xff0c;项目采用的是springmvc,持久层框架就是my…

Screeps工程化之配置化

目录 前言一、抽取配置项二、读取配置项 前言 Screeps中所有代码都会在一个tick&#xff08;游戏内的世间&#xff09;内执行完成&#xff0c;想要做到代码的高度复用&#xff0c;和隔离各个房间creep的行为就需要将部分代码进行配置化&#xff0c;本文仅为作者本人的游戏思路…

反了!美国假冒邮政服务钓鱼网站访问量竟然超过正规官网

美国邮政是美国主要的包裹信件投递机构之一&#xff0c;长期以来该单位都是网络钓鱼和诈骗的针对目标。对美国公民来说&#xff0c;在假期通常都会收到声称来自美国邮政的诈骗。美国邮政甚至单独建设的网页提醒消费者警惕诈骗信息&#xff1a; 专用提醒网页 Akamai 的研究人员…

ABB机器人转角路径故障报警消除方法

ABB机器人在现场调试时&#xff0c;有时候会出现以下报警&#xff1a;“转角路径故障”的错误。 但这个报错不影响机器人的使用。也可以在指令中设置将其屏蔽。 1、打开一个例行程序&#xff0c;在Settings指令下添加CornerPathWarning设置语句&#xff1b; 2、将CornerPathWa…

使用Pandas对Data列进行基于顺序的分组排列

目录 一、引言 二、Pandas库简介 三、按照数据列中元素出现的先后顺序进行分组排列 四、案例分析 五、技术细节探讨与扩展应用 1. 技术细节 2. 扩展应用 3. 示例代码&#xff1a;用户行为分析 4. 进阶应用&#xff1a;分组后的聚合操作 5. 分组后的数据筛选 6. 分组…

信息系统安全与对抗-网络侦查技术与网络扫描技术(期末复习简答题)

1、网络拓扑结构在网络攻击中的作用 查明目标网络的拓扑结构&#xff0c;有利于找到目标网络的关键节点&#xff0c;从而提高攻击效率&#xff0c;达到最大攻击效果。 2、网络侦查在网络攻击中的作用 识别潜在目标系统&#xff0c;确认目标系统适合哪种类型的攻击。 3、百度…

视频号小店究竟有什么秘密,值得商家疯狂入驻,商家必看!

大家好&#xff0c;我是电商花花。 我们都知道视频号和抖音本身都是一个短视频平台&#xff0c;但是随着直播电商的发展&#xff0c;背后的流量推动逐步显露出强大的红利市场和变现机会。 视频号小店流量大和赚钱之外&#xff0c;还非常适合普通人创业。 这也使得越来越多的…

[机器学习-03] Scikit-Learn机器学习工具包学习指南:主要功能与用法解析

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

robobrowser,一个有趣的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个有趣的 Python 库 - robobrowser。 Github地址&#xff1a;https://github.com/jmcarp/robobrowser 在网络爬虫和自动化领域&#xff0c;Python开发者拥有众多强大的工具&…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

YOLOv8火焰与烟雾智能检测系统

项目概述&#xff1a; 本项目旨在开发一款高效、实时的火焰与烟雾检测系统&#xff0c;利用先进的深度学习技术——YOLOv8&#xff0c;为安全监控领域提供智能化解决方案。系统不仅能够准确识别视频流或静态图像中的火焰与烟雾&#xff0c;还配备了用户友好的图形界面&#xff…

AI 绘画神器 Fooocus 2.3.1 汉化教程(中文界面/汉化包下载/持续更新最新版本...)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里&#xff0c;订阅后可阅读专栏内所有文章。 大家好&#xff0c;我是水滴~~ Fooocus 是一款功能强大的 AI 绘画神器&#xff0c;它能够帮助我们以更高效、更创意的方式进行绘画创作。本教程将详细…

学习Java的日子 Day44 初识前端

Day44 HTML 学习路线&#xff1a; 前端&#xff1a;展示页面、与用户交互 — HTML 后端&#xff1a;数据的交互和传递 — JavaEE/JavaWeb 1.B/S和C/S B/S&#xff1a;浏览器/服务器 教务系统 C/S&#xff1a;客户端/服务器 优缺点 1.开发/维护成本&#xff1a;B/S相对低 2.运算…

GEE数据集——高分辨率全球树冠高度地图(1 米)Meta 公司

高分辨率 1 米全球树冠高度地图 简介 全球树冠高度地图数据集提供了对全球树冠高度的全面了解,有助于对森林生态系统、碳固存和气候变化减缓工作进行精确监测。该数据集由 Meta 和世界资源研究所合作开发,是了解森林结构和动态的基石。通过融合最先进的卫星图像和先进的人工…

C#编程模式之享元模式

创作背景&#xff1a;各位朋友&#xff0c;我们继续学习C#的编程模式&#xff0c;本文主要介绍享元模式。享元模式是一种结构型设计模式&#xff0c;它主要用于减少创建对象的数量&#xff0c;从而提高程序性能。它通过共享对象的方式来减少内存的使用&#xff0c;特别是系统中…