【python量化交易】qteasy使用教程06——创建自定义因子选股交易策略

创建自定义因子选股策略

  • 使用`qteasy`创建自定义因子选股交易策略
    • 开始前的准备工作
    • 本节的目标
    • Alpha选股策略的选股思想
    • 计算选股指标
    • 用`FactorSorter`定义Alpha选股策略
    • 交易策略的回测结果
    • 用`GeneralStg`定义一个Alpha选股策略
    • 回测结果:
    • 本节回顾

使用qteasy创建自定义因子选股交易策略

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

$ pip install qteasy -U

qteasy具备以下功能:

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

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

开始前的准备工作

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

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

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

本节的目标

在本节中,我们将承接上一节开始的内容,介绍qteasy的交易策略基类,在介绍过一个最简单的择时交易策略类以后,我们将介绍如何使用qteasy提供的另外两种策略基类,创建一个多因子选股策略。

为了提供足够的使用便利性,qteasy的提供的各种策略基类本质上并无区别,只是为了减少用户编码工作量而提供的预处理形式,甚至可以将不同的交易策略基类理解成,为了特定交易策略设计的“语法糖”,因此,同一交易策略往往可以用多种不同的交易策略基类实现,因此,在本节中,我们将用两种不同的策略基类来实现一个Alpha选股交易策略。

Alpha选股策略的选股思想

我们在这里讨论的Alpha选股策略是一个低频运行的选股策略,这个策略可以每周或者每月运行一次,每次选股时会遍历HS300指数的全部成分股,依照一定的标准将这300支股票进行优先级排序,从中选择出排位靠前的30支股票,等权持有,也就是说,每个月进行一次调仓换股,调仓时将排名靠后的股票卖掉,买入排名靠前的股票,并确保股票的持有份额相同。

Alpha选股策略的排名依据每一支股票的两个财务指标:EV(企业市场价值)以及EBITDA(息税折旧摊销前利润)来计算,对每一支股票计算EV与EBITDA的比值,当这个比值大于0的时候,说明该上市公司是盈利的(因为EBITDA为正)。这时,这个比值代表该公司每赚到一块钱利润,需要投入的企业总价值。自然,这个比值越低越好。例如,下面两家上市公司数据如下:

  • A公司的EBITDA为一千万,而企业市场价值为一百亿,EV/EBITDA=1000.。说明该公司每一千元的市场价值可以挣到一元钱利润
  • B公司的EBITDA同样为一千万,企业市场价值为一千亿,EV/EBITDA=10000,说明该公司每一万元的市场价值可以挣到一元钱利润

从常理分析,我们自然会觉得A公司比较好,因为靠着较少的公司市场价值,就挣到了同样的利润,这时我们认为A公司的排名比较靠前。

按照上面的规则,我们在每个月的最后一天,将HS300成分股的所有上市公司全部进行一次从小到大排名,剔除掉EV/EBITDA小于0的公司(盈利为负的公司当然应该剔除)以后,选择排名最靠前的30个公司持有,就是Alpha选股交易策略。

其实,类似于这样的指标排序选股策略,qteasy提供了一个内置交易策略可以直接实现:

>>> import qteasy as qt
>>> qt.built_ins('finance')以股票过去一段时间内的财务指标的平均值作为选股因子选股基础选股策略。以股票的历史指标的平均值作为选股因子,因子排序参数可以作为策略参数传入改变策略数据类型,根据不同的历史数据选股,选股参数可以通过pars传入策略参数:- sort_ascending: enum, 是否升序排列因子- True: 优先选择因子最小的股票,- False, 优先选择因子最大的股票- weighting: enum, 股票仓位分配比例权重- 'even'       :默认值, 所有被选中的股票都获得同样的权重- 'linear'     :权重根据因子排序线性分配- 'distance'   :股票的权重与他们的指标与最低之间的差值(距离)成比例- 'proportion' :权重与股票的因子分值成正比- condition: enum, 股票筛选条件- 'any'        :默认值,选择所有可用股票- 'greater'    :筛选出因子大于ubound的股票- 'less'       :筛选出因子小于lbound的股票- 'between'    :筛选出因子介于lbound与ubound之间的股票- 'not_between':筛选出因子不在lbound与ubound之间的股票- lbound: float, 股票筛选下限值, 默认值np.-inf- ubound: float, 股票筛选上限值, 默认值np.inf- max_sel_count: float, 抽取的股票的数量(p>=1)或比例(p<1), 默认值:0.5,表示选中50%的股票信号类型:PT型:百分比持仓比例信号信号规则:使用data_types指定一种数据类型,将股票过去的datatypes数据取平均值,将该平均值作为选股因子进行选股策略属性缺省值:默认参数:(True, 'even', 'greater', 0, 0, 0.25)数据类型:eps 每股收益,单数据输入采样频率:年窗口长度:270参数范围:[(True, False),('even', 'linear', 'proportion'),('any', 'greater', 'less', 'between', 'not_between'),(-np.inf, np.inf),(-np.inf, np.inf),(0, 1.)]策略不支持参考数据,不支持交易数据<class 'qteasy.built_in.SelectingAvgIndicator'>

不过这个内置交易策略仅支持以qteasy内置历史数据类型为选股因子,例如pe市盈率、profit利润等数据是qteasy的内置历史数据,可以直接引用。但如果是qteasy内置历史数据中找不到的选股因子,就不能直接使用内置交易策略了。EV/EBITDA这个指标是一个计算指标,因此,我们必须使用自定义交易策略。并在自定义策略中计算该指标。

计算选股指标

为了计算EV/EBITDA,我们必须至少先确认qteasy中是否已经提供了EV和EBITDA这两种历史数据:

我们可以使用find_history_data()来查看历史数据是否被qteasy支持

>>> import qteasy as qt
>>> qt.find_history_data('ev')
matched following history data, 
use "qt.get_history_data()" to load these historical data by its data_id:
------------------------------------------------------------------------
Empty DataFrame
Columns: [freq, asset_type, table_name, description]
Index: []
========================================================================
[]
>>> qt.find_history_data('ebitda')
matched following history data, 
use "qt.get_history_data()" to load these historical data by its data_id:
------------------------------------------------------------------------freq asset      table                  desc
data_id                                                  
income_ebitda    q     E     income   上市公司利润表 - 息税折旧摊销前利润
ebitda           q     E  financial  上市公司财务指标 - 息税折旧摊销前利润
========================================================================
['income_ebitda', 'ebitda']

从上面的返回值可以看出,在qteasy的内置历史数据类型中,EBITDA是一个标准的历史数据类型,可以通过’ebitda‘ / income_ebitda 这两个ID来获取(我们将使用’ebitda’),但是EV企业现金价值并不在内置数据类型中,但我们知道EV可以通过下面的公式计算:

E V = 总市值 + 总负债 − 总现金 EV = 总市值 + 总负债 - 总现金 EV=总市值+总负债总现金

而上面几个财务指标都是qteasy直接支持的:

  • 总市值 - 数据类型: total_mv
  • 总负债 - 数据类型: total_liab
  • 总现金 - 数据类型: c_cash_equ_end_period

我们可以测试一下:

htypes = 'total_mv, total_liab, c_cash_equ_end_period, ebitda'
# 获取沪深300指数成分股
shares = qt.filter_stock_codes(index='000300.SH', date='20220131')  
# 获取所有股票的总市值、总负债、总现金、EBITDA数据
dt = qt.get_history_data(htypes, shares=shares, asset_type='any', freq='m')
# 随便选择一支股票,转化为DataFrame检查数据是否正确获取
one_share = shares[24]
df = dt[one_share]
# 计算EV/EBITDA选股因子
df['ev_to_ebitda'] = (df.total_mv + df.total_liab - df.c_cash_equ_end_period) / df.ebitda

可以看到选股因子已经计算出来了,那么我们可以开始定义交易策略了。

FactorSorter定义Alpha选股策略

针对这种定时选股类型的交易策略,qteasy提供了FactorSorter交易策略类,顾名思义,这个交易策略基类允许用户在策略的实现方法中计算一组选股因子,这样策略就可以自动将所有的股票按照选股因子的值排序,并选出排名靠前的股票。至于排序方法、筛选规则、股票持仓权重等都可以通过策略参数设置。

如果符合上面定义的交易策略,使用FactorSorter策略基类将会非常方便。

下面我们就来一步步定义看看,首先继承FactorSorter并定义一个类,在上一个章节中,我们在自定义策略的__init__()方法中定义名称、描述以及默认参数等信息,然而我们也可以忽略__init__方法,仅仅在创建策略对象时传入参数等信息,这也是可以的,我们在这里就这样做:

class AlphaFac(qt.FactorSorter):  # 注意这里使用FactorSorter策略类# 忽略__init__()方法,直接定义realize()方法def realize(self, h, **kwargs):pass  

与上一节相同,在realize()中需要做的第一步是获取历史数据。我们知道历史数据包括’total_mv, total_liab, c_cash_equ_end_period, ebitda’等四种,这些历史数据同样是打包后存储在历史数据属性h中的。与上一章节不同的是,h是一个三维ndarray,形状(shape)为(L, M, N),包含L层,M行、N列,分别代表每个股票、每个日期以及每种数据类型。

因此,要获取四种数据类型最后一个周期的所有股票的数据,应该使用如下方法切片:

class AlphaFac(qt.FactorSorter):  # 注意这里使用FactorSorter策略类def realize(self, h, **kwargs):# 从历史数据编码中读取四种历史数据的最新数值total_mv = h[:, -1, 0]  # 总市值total_liab = h[:, -1, 1]  # 总负债cash_equ = h[:, -1, 2]  # 现金及现金等价物总额ebitda = h[:, -1, 3]  # ebitda,息税折旧摊销前利润...

这样我们获取到的每一种数据类型都是一个一维数组,这个数组的长度与我们传入的备选股票池中的股票数量相同,每一个元素代表该股票的数据。加入我们的投资股票池中有三支股票,那么total_mv中就会有三个数字,分别代表三支股票的总市值,以此类推。

做好上述准备后,计算选股因子就非常方便了,而且,由于我们使用了FactorSorter策略基类,计算好选股因子后,直接返回选股因子就可以了,qteasy会处理剩下的选股操作:

class AlphaFac(qt.FactorSorter):  # 注意这里使用FactorSorter策略类def realize(self, h, **kwargs):... # 略# 选股因子为EV/EBIDTA,使用下面公式计算factor = (total_mv + total_liab - cash_equ) / ebitdareturn factor  # 直接返回选股因子,策略就定义完了

至此,仅仅用六行代码,一个自定义Alpha选股交易策略就定义好了。是不是非常简单?

好了,我们来看看回测的结果如何?

交易策略的回测结果

由于我们忽略了策略类的__init__()方法,因此在实例化策略对象时,必须输入完整的策略参数:

alpha = AlphaFac(pars=(),par_count=0,par_types=[],par_range=[],name='AlphaSel',description='本策略每隔1个月定时触发计算SHSE.000300成份股的过去的EV/EBITDA并选取EV/EBITDA大于0的股票',data_types='total_mv, total_liab, c_cash_equ_end_period, ebitda',strategy_run_freq='m',data_freq='d',window_length=100,max_sel_count=30,  # 设置选股数量,最多选出30个股票condition='greater',  # 设置筛选条件,仅筛选因子大于ubound的股票ubound=0.0,  # 设置筛选条件,仅筛选因子大于0的股票weighting='even',  # 设置股票权重,所有选中的股票平均分配权重sort_ascending=True)  # 设置排序方式,因子从小到大排序选择头30名

然后创建一个Operator对象,因为我们希望控制持仓比例,因此最好使用“PT”信号类型:

op = qt.Operator(alpha, signal_type='PT')
res = op.run(mode=1,asset_type='E',asset_pool=shares,PT_buy_threshold=0.0,PT_sell_threshold=0.0,trade_batch_size=100,sell_batch_size=1)

回测结果如下:

     ====================================|                                  ||       BACK TESTING RESULT        ||                                  |====================================qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 9.4ms
time consumption for operation back looping:  5s 831.0msinvestment starts on      2016-04-05 00:00:00
ends on                   2021-02-01 00:00:00
Total looped periods:     4.8 years.-------------operation summary:------------
Only non-empty shares are displayed, call 
"loop_result["oper_count"]" for complete operation summarySell Cnt Buy Cnt Total Long pct Short pct Empty pct
000301.SZ    1        2       3   10.3%      0.0%     89.7%  
000786.SZ    2        3       5   27.5%      0.0%     72.5%  
000895.SZ    1        0       1   62.6%      0.0%     37.4%  
002001.SZ    2        2       4   55.8%      0.0%     44.2%  
002007.SZ    3        1       4   68.3%      0.0%     31.7%  
002027.SZ    2        9      11   41.3%      0.0%     58.7%  
002032.SZ    2        0       2    5.9%      0.0%     94.1%  
002044.SZ    1        1       2    1.8%      0.0%     98.2%  
002049.SZ    1        1       2    5.1%      0.0%     94.9%  
002050.SZ    4        5       9   13.8%      0.0%     86.2%  
...            ...     ...   ...      ...       ...       ...
603517.SH    1        1       2    1.8%      0.0%     98.2%  
603806.SH    6        3       9   39.8%      0.0%     60.2%  
603899.SH    1        1       2   31.0%      0.0%     69.0%  
000408.SZ    3        6       9   35.5%      0.0%     64.5%  
002648.SZ    1        1       2    5.2%      0.0%     94.8%  
002920.SZ    1        1       2    1.7%      0.0%     98.3%  
300223.SZ    1        1       2    5.2%      0.0%     94.8%  
600219.SH    1        1       2    6.1%      0.0%     93.9%  
603185.SH    1        1       2    5.2%      0.0%     94.8%  
688005.SH    1        1       2    5.2%      0.0%     94.8%   Total operation fee:     ¥      928.22
total investment amount: ¥  100,000.00
final value:              ¥  159,072.14
Total return:                    59.07% 
Avg Yearly return:               10.09%
Skewness:                         -0.28
Kurtosis:                          3.29
Benchmark return:                65.96% 
Benchmark Yearly return:         11.06%------strategy loop_results indicators------ 
alpha:                           -0.012
Beta:                             1.310
Sharp ratio:                      1.191
Info ratio:                      -0.010
250 day volatility:               0.105
Max drawdown:                    20.49% peak / valley:        2018-05-22 / 2019-01-03recovered on:         2019-12-26===========END OF REPORT=============

在这里插入图片描述

回测结果显示这个策略并不能非常有效地跑赢沪深300指数,不过总体来说回撤较小一些,风险较低,是一个不错的保底策略。

但策略的表现并不是我们讨论的重点,下面我们再来看一看,如果不用FactorSorter基类,如何定义同样的Alpha选股策略。

GeneralStg定义一个Alpha选股策略

前面已经提过了两种策略基类:

  • RuleIterator: 用户只需要针对一支股票定义选股规则,qteasy便能将同样的规则应用到股票池中所有的恶股票上,而且还能针对不同股票设置不同的可调参数
  • FactorSorter:用户只需要定义一个选股因子,qteasy便能根据选股因子自动排序后选择最优的股票持有,并卖掉不够格的股票。

而GeneralStg是qteasy提供的一个最基本的策略基类,它没有提供任何“语法糖”功能,帮助用户降低编码工作量,但是正是因为没有语法糖,它才是一个真正的“万能”策略类,可以用来更加自由地创建交易策略。

上面的Alpha选股交易策略可以很容易用FactorSorter实现,但为了了解GeneralStg,我们来看看如何使用它来创建相同的策略:

直接把完整的代码贴出来:


class AlphaPT(qt.GeneralStg):def realize(self, h, r=None, t=None, pars=None):# 从历史数据编码中读取四种历史数据的最新数值total_mv = h[:, -1, 0]  # 总市值total_liab = h[:, -1, 1]  # 总负债cash_equ = h[:, -1, 2]  # 现金及现金等价物总额ebitda = h[:, -1, 3]  # ebitda,息税折旧摊销前利润# 选股因子为EV/EBIDTA,使用下面公式计算factors = (total_mv + total_liab - cash_equ) / ebitda# 处理交易信号,将所有小于0的因子变为NaNfactors = np.where(factors < 0, np.nan, factors)# 选出数值最小的30个股票的序号arg_partitioned = factors.argpartition(30)selected = arg_partitioned[:30]  # 被选中的30个股票的序号not_selected = arg_partitioned[30:]  # 未被选中的其他股票的序号(包括因子为NaN的股票)# 开始生成PT交易信号signal = np.zeros_like(factors)# 所有被选中的股票的持仓目标被设置为0.03,表示持有3.3%signal[selected] = 0.0333# 其余未选中的所有股票持仓目标在PT信号模式下被设置为0,代表目标仓位为0signal[not_selected] = 0  return signal    

将上面的代码与FactorSorter的代码对比,可以发现,GeneralStg的代码在计算出选股因子以后,还多出了因子处理的工作:

  • 剔除小于零的因子
  • 排序并选出剩余因子中最小的30个
  • 选出股票后将他们的持仓比例设置为3.3%

事实上,上面的这些工作都是FactorSorter提供的“语法糖”,在这里我们必须手动实现而已。值得注意的是,我在上面例子中使用的排序等代码都是从FactorSorter中直接提取出来的高度优化的numpy代码,它们的运行速度是很快的,比一般用户能写出的代码快很多,因此,只要条件允许,用户都应该尽量利用这些语法糖,只有在不得已的情况下才自己编写排序代码。

大家可以研究一下上面的代码,但是请注意,如果使用GeneralStg策略类,策略的输出应该是股票的目标仓位,而不是选股因子。

下面看看回测结果:

回测结果:

使用同样的数据进行回测:

alpha = AlphaPT(pars=(),par_count=0,par_types=[],par_range=[],name='AlphaSel',description='本策略每隔1个月定时触发计算SHSE.000300成份股的过去的EV/EBITDA并选取EV/EBITDA大于0的股票',data_types='total_mv, total_liab, c_cash_equ_end_period, ebitda',strategy_run_freq='m',data_freq='d',window_length=100)
op = qt.Operator(alpha, signal_type='PT')
res = op.run(mode=1,asset_type='E',asset_pool=shares,PT_buy_threshold=0.00,  # 如果设置PBT=0.00,PST=0.03,最终收益会达到30万元PT_sell_threshold=0.00,trade_batch_size=100,sell_batch_size=1,maximize_cash_usage=True,trade_log=True)

回测结果如下:

     ====================================|                                  ||       BACK TESTING RESULT        ||                                  |====================================qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 7.2ms
time consumption for operation back looping:  6s 308.5msinvestment starts on      2016-04-05 00:00:00
ends on                   2021-02-01 00:00:00
Total looped periods:     4.8 years.-------------operation summary:------------
Only non-empty shares are displayed, call 
"loop_result["oper_count"]" for complete operation summarySell Cnt Buy Cnt Total Long pct Short pct Empty pct
000301.SZ    1        1       2   10.3%      0.0%     89.7%  
000786.SZ    2        3       5   27.5%      0.0%     72.5%  
000895.SZ    1        1       2   68.7%      0.0%     31.3%  
002001.SZ    2        2       4   57.5%      0.0%     42.5%  
002007.SZ    0        1       1   68.3%      0.0%     31.7%  
002027.SZ    6        7      13   41.3%      0.0%     58.7%  
002032.SZ    3        1       4    7.5%      0.0%     92.5%  
002044.SZ    1        1       2    1.8%      0.0%     98.2%  
002049.SZ    1        1       2    5.1%      0.0%     94.9%  
002050.SZ    4        4       8   13.8%      0.0%     86.2%  
...            ...     ...   ...      ...       ...       ...
603806.SH    5        3       8   62.1%      0.0%     37.9%  
603899.SH    2        3       5   36.3%      0.0%     63.7%  
000408.SZ    3        5       8   35.5%      0.0%     64.5%  
002648.SZ    1        1       2    5.2%      0.0%     94.8%  
002920.SZ    1        1       2    5.1%      0.0%     94.9%  
300223.SZ    1        2       3    5.2%      0.0%     94.8%  
300496.SZ    1        1       2   10.5%      0.0%     89.5%  
600219.SH    1        1       2    6.1%      0.0%     93.9%  
603185.SH    1        1       2    5.2%      0.0%     94.8%  
688005.SH    1        2       3    5.2%      0.0%     94.8%   Total operation fee:     ¥      985.25
total investment amount: ¥  100,000.00
final value:              ¥  189,723.44
Total return:                    89.72% 
Avg Yearly return:               14.18%
Skewness:                         -0.41
Kurtosis:                          2.87
Benchmark return:                65.96% 
Benchmark Yearly return:         11.06%------strategy loop_results indicators------ 
alpha:                            0.044
Beta:                             1.134
Sharp ratio:                      1.284
Info ratio:                       0.011
250 day volatility:               0.120
Max drawdown:                    20.95% peak / valley:        2018-05-22 / 2019-01-03recovered on:         2019-09-09===========END OF REPORT=============

在这里插入图片描述

两种交易策略的输出结果基本相同

本节回顾

通过本节的学习,我们了解了qteasy提供的另外两种交易策略基类FactorSorter和GeneralStg的使用方法,实际创建了两个交易策略,虽然使用不同的基类,但是创建出了基本相同的Alpha选股交易策略。

在下一个章节中,我们仍然将继续介绍自定义交易策略,但是会用一个更加复杂的例子来演示自定义交易策略的使用方法。敬请期待!

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

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

相关文章

Electron、QT、WPF三强争霸,该支持谁呢?

Electron、QT、WPF都是跨平台的桌面应用开发框架&#xff0c;都是非常流行的&#xff0c;作为开发者该选用哪个呢&#xff1f;本文从多个角度分析一下。 一、定义 Electron、Qt 和 WPF 都是用于创建桌面应用程序的框架或工具&#xff0c;它们各自有着不同的特点和优势。 Elec…

Linux-笔记 开发板Uboot命令使用

将之前自学的知识整理了一下笔记&#xff0c;以便回忆 信息查询命令 1、help/?&#xff1a;查看所支持命令 > ? md md - memory displayUsage: md [.b, .w, .l] address [# of objects]2、bdinfo&#xff1a;查询板子信息 > bdinfo arch_number 0x00000000 boot_p…

匿名管道及其应用

目录 一、什么是匿名管道&#xff1f; 三、创建与使用匿名管道 三、匿名管道的特点 匿名管道的四种情况 匿名管道的五种特性 四、匿名管道的实践应用---进程池 在编程的世界中&#xff0c;匿名管道是一种非常重要的通信机制。今天&#xff0c;让我们一起来深入探讨一下匿…

vivado Virtex-7 配置存储器器件

Virtex-7 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Virtex -7 器件执行擦除、空白检查、编程和验证等配置操作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列非易失性存储器 进行擦除、…

单链表经典算法OJ题---力扣206,876(带图详解

1.链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09;【点击即可跳转】 思路&#xff1a;创建三个指针&#xff0c;看下图 注意&#xff1a;n3如果为空&#xff0c;则不能继续指向下一节点&#xff0c;需要进行判断 代码实现&#xff1a; struct ListNode* reverseLi…

第二课,python基础语法(一),认识字面量和变量、注释

一&#xff0c;字面量 &#xff08;一&#xff09;什么是字面量 被写下来的的固定的值&#xff0c;称之为字面量 &#xff08;二&#xff09;常见的三种字面量类型 &#xff08;三&#xff09;练习一下&#xff0c;使用print去输出三种不同类型的字面量&#xff1a;10&#x…

树莓派安装opencv

安装opencv 上述步骤完成后&#xff0c;输入以下代码(基于python3) sudo apt-get install python3-opencv -y不行的话&#xff0c;试试换源&#xff0c;然后 sudo apt-get update成功&#xff01; 测试opencv是否安装成功 输入 python3 然后再输入 import cv2 没有报错就…

【Java】:向上转型、向下转型和ClassCastException异常

目录 先用一个生动形象的例子来解释向上转型和向下转型 向上转型&#xff08;Upcasting&#xff09; 向下转型&#xff08;Downcasting&#xff09; 向上转型 概念 例子 发生向上转型的情况 1.子类对象赋值给父类引用 2.方法参数传递 3.返回值 向下转型 概念 注意…

扩散模型(Diffusion Model)学习笔记

目录 Diffusion Model 基本原理 预测原理 ddpm 实例 ddmp数字图片生成 有的还没看完 Diffusion Model 基本原理 扩散模型1&#xff1a;基本原理 - 知乎 前向扩散过程可以理解为一个马尔可夫链&#xff0c;即通过逐步对一张真实图片添加高斯噪声直到最终变成纯高斯噪声图片…

labview技术交流-字符串数组连接成字符串

应用场景 我们可能需要将一维的字符串数组转换成一整条字符串&#xff0c;然后方便记录在数据库或表格中的一个单元格中。 代码展示 方案一 我们使用for循环完成这样的功能需求&#xff0c;见下图&#xff1a; 这种方案可能相对基础和普通&#xff0c;但是它更方便和易于扩展…

【科研绘图 基础版】01 使用Python绘制时间序列折线图

下面这段代码绘制了一个折线图&#xff0c;其中包含了实际平均温度数据和使用线性回归模型预测的平均温度数据&#xff08;用来近似地表示数据的整体趋势&#xff09;。 具体来说&#xff0c;图中的横轴表示年份&#xff0c;纵轴表示平均温度。蓝色的实心线代表了实际的平均温度…

《Python机器学习 》书籍分享

文章目录 前言内容介绍作者简介书籍目录 前言 随着计算能力的快速增长&#xff0c;大量任务都可在台式机上完成&#xff1b;在这样的背景下&#xff0c;机器学习应运而生&#xff0c;成为当今炙手可热的话题。但初出茅庐的新手常对机器学习感到十分畏惧&#xff1b;为给这些新…

面试集中营—Seata分布式事务

一、分布式事务 本地事务 在计算机系统中&#xff0c;更多的是通过关系型数据库来控制事务&#xff0c;这是利用数据库本身的事务特性来实现的&#xff0c; 因此叫数据库事务&#xff0c;由于应用主要靠关系数据库来控制事务&#xff0c;而数据库通常和应用在同一个服务器&am…

数据结构:包装类初始泛型

目录 1.包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱 2.什么是泛型3.引出泛型3.1 语法3.2 泛型的使用 4.泛型是如何编译的4.1 擦除机制4.2 为什么不能实例化泛型类型数组 5.泛型的上界5.1 语法5.2 示例5.3 复杂示例 6.泛型方法6.1 定义语法6.2 示例6.3 使用示例-可以类…

【CMU 15-445】Proj4 Concurrency Control

Concurrency Control 通关记录Task1 TimestampsTask2 Storage Format and Sequential ScanTask3 MVCC ExecutorsTask3.1 Insert ExecutorTask3.2 CommitTask3.3 Update and Delete ExecutorTask3.4 Stop-the-world Garbage Collection Task4 Primary Key IndexTask4.0 Index Sc…

Springboot+logback 详细配置

一、添加依赖 这里使用springboot3.0.2 依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId> </dependency><dependency><groupId>org.projectlombok</grou…

macos使用yarn创建vite时出现Usage Error: The nearest package directory问题

步骤是macos上使用了yarn create vite在window上是直接可以使用了yarn但是在macos上就出现报错 我们仔细看&#xff0c;它说的If /Users/chentianyu isnt intended to be a project, remove any yarn.lock and/or package.json file there.说是要我们清除yarn.lock和package.js…

yolo world 瑞芯微芯片rknn部署、地平线芯片Horizon部署、TensorRT部署

特别说明&#xff1a;参考官方开源的 yoloworld 代码、瑞芯微官方文档、地平线的官方文档&#xff0c;如有侵权告知删&#xff0c;谢谢。 模型和完整仿真测试代码&#xff0c;放在github上参考链接 模型和代码。 yoloworld出来的有一段时间了&#xff0c;还没有盘到板端上玩一玩…

芸众商城电商专业版400+插件源码+搭建教程

介绍&#xff1a; 芸众商城社交电商系统SAAS平台前端基于vue开发&#xff0c;后端基于研发积分商城系统源码 php&#xff0c;本文安装芸众商城全插件&#xff08;400多个&#xff09;商业版平台源码&#xff0c;可同时支持多端口部署运行&#xff1b;使用宝塔面板一键部署的形…

LibreNMS简介

目录 1 LibreNMS简单介绍1.1 LibreNMS介绍 2 安装2.1 Ubuntu安装1、安装依赖2、添加 librenms 用户3、下载 LibreNMS4、设置权限5、安装 PHP 依赖项6、设置时区7、配置 MariaDB8、配置 PHP-FPM9、配置 Web 服务器10、启用 lnms 命令11、配置 snmpd12、cron13、启用调度程序14、…