用 Python 构建高级配对交易策略
作者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:
本文阐述通过分析加密货币和传统金融工具之间的相关性和协整性,以及实施 Z-score 方法来生成交易信号,然后介绍如何使用 Python 构建配对交易策略,从而在市场中寻找交易机会。最后还讨论了实际遇到的交易挑战,强调评估策略要考虑风险调整指标。
配对交易作为一种复杂的策略,常常被交易者运用以管理投资组合,而非仅仅聚焦于单个资产。本文将深入探讨这种市场中性策略,其旨在从两种密切相关的金融工具的相对价格变动中获取利润。本文我们还是借助可免费获取的雅虎财经数据展开模拟分析。
这种策略的核心是相信,随着时间的推移,两种资产的价格会保持稳定的价差。因此,无论市场大趋势如何,交易者都能从价格趋同中获利。配对交易的目标是所选资产之间的关系,而不是整体市场方向。
1. 环境配置
要在 Jupyter 环境中设置必要的库,请使用以下命令:
!pip install numpy
!pip install pandas
!pip install yfinance
在 Jupyter Notebook 单元里运行这些命令,便能将指定的库直接安装到环境当中。安装完毕后,我们就能够继续展开分析了。
2. 收集数据
要使用 Yahoo Finance 数据为涉及加密货币的配对交易策略实施数据收集和清理,请遵循以下步骤:
- 插补缺失值:填补数据中的空白,以保持数据的连续性。
- 平滑异常值:应用平滑极端数据点的方法,以避免分析失真。
- 确保时间序列长度一致:尽管加密货币市场存在持续的交易活动,但要对时间序列数据进行标准化,以确保长度一致。
下面是 Python 的实现方法:
crypto_forex_stocks = ['BTC-USD', 'ETH-USD', 'BNB-USD', 'XRP-USD', 'ADA-USD', 'DOGE-USD', 'ETC-USD', 'XLM-USD', 'AAVE-USD', 'EOS-USD', 'XTZ-USD', 'ALGO-USD', 'XMR-USD', 'KCS-USD','MKR-USD', 'BSV-USD', 'RUNE-USD', 'DASH-USD', 'KAVA-USD', 'ICX-USD', 'LINA-USD', 'WAXP-USD', 'LSK-USD', 'EWT-USD', 'XCN-USD', 'HIVE-USD', 'FTX-USD', 'RVN-USD', 'SXP-USD', 'BTCB-USD']
bank_stocks = ['JPM', 'BAC', 'WFC', 'C', 'GS', 'MS', 'DB', 'UBS', 'BBVA', 'SAN', 'ING', ' BNPQY', 'HSBC', 'SMFG', 'PNC', 'USB', 'BK', 'STT', 'KEY', 'RF', 'HBAN', 'FITB', 'CFG','BLK', 'ALLY', 'MTB', 'NBHC', 'ZION', 'FFIN', 'FHN', 'UBSI', 'WAL', 'PACW', 'SBCF', 'TCBI', 'BOKF', 'PFG', 'GBCI', 'TFC', 'CFR', 'UMBF', 'SPFI', 'FULT', 'ONB', 'INDB', 'IBOC', 'HOMB']
global_indexes = ['^DJI', '^IXIC', '^GSPC', '^FTSE', '^N225', '^HSI', '^AXJO', '^KS11', '^BFX', '^N100','^RUT', '^VIX', '^TNX']START_DATE = '2021-01-01'
END_DATE = '2023-10-31'
universe_tickers = crypto_forex_stocks + bank_stocks + global_indexes
universe_tickers_ts_map = {ticker: load_ticker_ts_df(ticker, START_DATE, END_DATE) for ticker in universe_tickers}def sanitize_data(data_map):TS_DAYS_LENGTH = (pd.to_datetime(END_DATE) -pd.to_datetime(START_DATE)).daysdata_sanitized = {}date_range = pd.date_range(start=START_DATE, end=END_DATE, freq='D')for ticker, data in data_map.items():if data is None or len(data) < (TS_DAYS_LENGTH / 2):# We cannot handle shorter TSscontinueif len(data) > TS_DAYS_LENGTH:# Normalize to have the same length (TS_DAYS_LENGTH)data = data[-TS_DAYS_LENGTH:]# Reindex the time series to match the date range and fill in any blanks (Not Numbers)data = data.reindex(date_range)data['Adj Close'].replace([np.inf, -np.inf], np.nan, inplace=True)data['Adj Close'].interpolate(method='linear', inplace=True)data['Adj Close'].fillna(method='pad', inplace=True)data['Adj Close'].fillna(method='bfill', inplace=True)assert not np.any(np.isnan(data['Adj Close'])) and not np.any(np.isinf(data['Adj Close']))data_sanitized[ticker] = datareturn data_sanitized
# Sample some
uts_sanitized = sanitize_data(universe_tickers_ts_map)
uts_sanitized['JPM'].shape, uts_sanitized['BTC-USD'].shape
日期范围 "变量用 "pd.date_range(start=START_DATE, end=END_DATE, freq='D') "定义,为数据建立所需的时间范围。接下来,我们使用线性插值法填补所有缺失值(NaN 或 Nones),如果线性插值法失败,则使用最近的有效值进行回填。
我们运用断言语句来校验数据的完整性,同时检查随机选取的两个仪器的形状,以确保它们能相匹配。
3. 深入探讨
大家也许还记得 FTX丑闻 吧?伴随这家交易所的倒闭,投资者或许会对加密货币交易所丧失信心,暂且转向传统银行进行金融交易,直至丑闻被淡忘。
为了探究这一假设,我们能够运用相关性分析与协整分析,来判定加密货币市场和传统银行业表现之间的任何模式或者关系。相关性分析会助力我们知晓两个数据集之间的线性关系程度,而协整性分析则会明确它们之间是否存在长期关系,进而提示潜在的配对交易契机。
通过研究这些指标,我们可以评估丑闻是否影响了市场对加密货币和传统银行业的情绪。
4. 相关性和协整性
相关性使用皮尔逊相关系数 Pearson correlation coefficient (r) 来衡量两个变量之间的关系,其范围为-1 到 1。1 表示完全的负线性关系,0 表示没有线性关系,1 表示完全的正线性关系。

而协整则是评估两种资产是否随着时间的推移而联系在一起,表明它们的价差倾向于回归均值。当它们暂时偏离历史关系时,这就为交易创造了机会。协整关系是通过统计检验来评估的,如扩增迪基-富勒 Dickey-Fuller (ADF) 检验,该检验可检查两种资产之间的价差是否静止。如果价差是静态的,则表明这两种资产是协整的,并且具有长期关系。

幸运的是,numpy 和 stats 库提供了简化这些统计测试的函数,使相关性和协整分析的执行变得更加容易。
5. 寻找配对
在交易中,当资产间的价差背离历史均值之际,分析师会借助协整检验来生成买入与卖出信号。当价差回归至长期均衡状态时,此般偏离便会造就获利契机。故而,对这种分析而言,掌控全面的数据极为关键。
下面的代码将检验一系列股票和其他金融工具,以发现任何隐藏的关系。它将检验零假设 (H0),即假设资产之间没有影响或关系。一般来说,如果检验的 p 值 低于 0.02,则拒绝零假设 (H0),表明这对资产之间存在一定程度的协整关系或值得进一步研究的关系。
from statsmodels.tsa.stattools import coint
from itertools import combinations
from statsmodels.tsa.stattools import cointdef find_cointegrated_pairs(tickers_ts_map, p_value_threshold=0.2):"""Find cointegrated pairs of stocks based on the Augmented Dickey-Fuller (ADF) test.Parameters:- tickers_ts_map (dict): A dictionary where keys are stock tickers and values are time series data.- p_value_threshold (float): The significance level for cointegration testing.Returns:- pvalue_matrix (numpy.ndarray): A matrix of cointegration p-values between stock pairs.- pairs (list): A list of tuples representing cointegrated stock pairs and their p-values."""tickers = list(tickers_ts_map.keys())n = len(tickers)# Extract 'Adj Close' prices into a matrix (each column is a time series)adj_close_data = np.column_stack([tickers_ts_map[ticker]['Adj Close'].values for ticker in tickers])pvalue_matrix = np.ones((n, n))# Calculate cointegration p-values for unique pair combinationsfor i, j in combinations(range(n), 2):result = coint(adj_close_data[:, i], adj_close_data[:, j])pvalue_matrix[i, j] = result[1]pairs = [(tickers[i], tickers[j], pvalue_matrix[i, j])for i, j in zip(*np.where(pvalue_matrix < p_value_threshold))]return pvalue_matrix, pairs
# This section can take up to 5mins
P_VALUE_THRESHOLD = 0.02
pvalues, pairs = find_cointegrated_pairs(uts_sanitized, p_value_threshold=P_VALUE_THRESHOLD)
将资产间的关系予以可视化,对于人工解读与决策而言至关重要,即便在算法交易中亦是如此。热图能够依据协整检验所得出的 p 值,直观地展现哪些资产属于配对资产。该热图有益于识别具有重要关系的潜在配对,从而为进一步分析以及探寻交易机会提供助力。
5.1 创建和显示热图
import seaborn as snsplt.figure(figsize=(26, 26))
heatmap = sns.heatmap(pvalues, xticklabels=uts_sanitized.keys(),yticklabels=uts_sanitized.keys(), cmap='RdYlGn_r',mask=(pvalues > (P_VALUE_THRESHOLD)),linecolor='gray', linewidths=0.5)
heatmap.set_xticklabels(heatmap.get_xticklabels(), size=14)
heatmap.set_yticklabels(heatmap.get_yticklabels(), size=14)
plt.show()

为了简化我们的分析,并专注于加密货币之间最紧密的关系,我们可以选择 p 值 最低的前三个货币对。这些货币对表明了最强的协整关系,因此也是潜在的交易机会。我们可以用柱状图来直观地显示这些货币对及其各自的 p 值。下面介绍如何实现这一点:
5.2 抽取前三名,绘制柱形图,直观显示 P 值。
sorted_pairs = sorted(pairs, key=lambda x: x[2], reverse=False)
sorted_pairs = sorted_pairs[0:35]
sorted_pairs_labels, pairs_p_values = zip(*[(f'{y1} <-> {y2}', p*1000) for y1, y2, p in sorted_pairs])
plt.figure(figsize=(12, 18))
plt.barh(sorted_pairs_labels,pairs_p_values, color='red')
plt.xlabel('P-Values (1000)', fontsize=8)
plt.ylabel('Pairs', fontsize=6)
plt.title('Cointegration P-Values (in 1000s)', fontsize=20)plt.grid(axis='both', linestyle='--', alpha=0.7)
plt.show()

为了将已确定的货币对交易的时间序列数据(花旗集团的 AAVE-USD 交易、花旗集团的 XMR-USD 交易以及 Ally Financial Inc (ALLY) 的 FTX-USD 交易)进行可视化,同时便于对加密货币和股票进行比较,我们将采用 scikit-learn 的 MinMax 缩放功能来对价格进行缩放处理。另外,我们还会运用滚动窗口进行平滑操作,以增强货币对之间固定性的可视程度。
下面是如何实现这一点的方法:
from sklearn.preprocessing import MinMaxScalerticker_pairs = [("AAVE-USD", "C"), ("XMR-USD", "C"), ("FTX-USD", "ALLY")]
fig, axs = plt.subplots(3, 1, figsize=(18, 14))
scaler = MinMaxScaler()
for i, (ticker1, ticker2) in enumerate(ticker_pairs):# Scale the price data for each pair using MIN MAXscaled_data1 = scaler.fit_transform(uts_sanitized[ticker1]['Adj Close'].values.reshape(-1, 1))scaled_data2 = scaler.fit_transform(uts_sanitized[ticker2]['Adj Close'].values.reshape(-1, 1))axs[i].plot(scaled_data1, label=f'{ticker1}', color='lightgray', alpha=0.7)axs[i].plot(scaled_data2, label=f'{ticker2}', color='lightgray', alpha=0.7)# Apply rolling mean with a window of 15scaled_data1_smooth = pd.Series(scaled_data1.flatten()).rolling(window=15, min_periods=1).mean()scaled_data2_smooth = pd.Series(scaled_data2.flatten()).rolling(window=15, min_periods=1).mean()axs[i].plot(scaled_data1_smooth, label=f'{ticker1} SMA', color='red')axs[i].plot(scaled_data2_smooth, label=f'{ticker2} SMA', color='blue')axs[i].set_ylabel('*Scaled* Price $', fontsize=12)axs[i].set_title(f'{ticker1} vs {ticker2}', fontsize=18)axs[i].legend()axs[i].set_xticks([])
plt.tight_layout()
plt.show()

以下是对上述内容的解释:
为了探究 AAVE-USD 和花旗集团之间的潜在交易信号,我们观察到,尽管序列中最初存在差异,但它们的价格表现出相对稳定。在生成交易信号时,我们将采用滚动窗口法的 Z 值法,从而无需单独的训练集和测试集。Z 值将价格序列与其历史均值标准化:

6. Where?
X 是标准化的价格;U 是滚动窗口的均值(平均值);Sigma 是滚动窗口的标准差。
Z 值衡量当前价格比偏离历史平均值的程度。Z 值高于 +1 或低于 -1 通常会触发交易信号。Z 值高于 +1 表明一种资产相对于另一种资产被高估了,这意味着卖出被高估的资产,买入被低估的资产。
反之,如果 Z 值低于-1,则表明被低估的资产已被高估,建议卖出前者,买入后者。该策略利用均值回复动态,充分利用暂时性背离和预期回归历史均值的机会。
TRAIN = int(len(uts_sanitized["AAVE-USD"]) * 0.85)
TEST = len(uts_sanitized["AAVE-USD"]) - TRAIN
AAVE_ts = uts_sanitized["AAVE-USD"]["Adj Close"][:TRAIN]
C_ts = uts_sanitized["C"]["Adj Close"][:TRAIN]
# Calculate price ratio (AAVE-USD price / C price)
ratios = C_ts/AAVE_ts
fig, ax = plt.subplots(figsize=(12, 8))
ratios_mean = np.mean(ratios)
ratios_std = np.std(ratios)
ratios_zscore = (ratios - ratios_mean) / ratios_std
ax.plot(ratios.index, ratios_zscore, label="Z-Score", color='blue')
# Plot reference lines
ax.axhline(1.0, color="green", linestyle='--', label="Upper Threshold (1.0)")
ax.axhline(-1.0, color="red", linestyle='--', label="Lower Threshold (-1.0)")
ax.axhline(0, color="black", linestyle='--', label="Mean")
ax.set_title('AAVE-USD / C: Price Ratio and Z-Score', fontsize=18)
ax.set_xlabel('Date')
ax.set_ylabel('Price Ratio / Z-Score')
ax.legend()
plt.tight_layout()
plt.show()

下图是一种可视化表示法,其中绿色水平线表示买入 Citigroup Inc ©,交叉时表示卖出 Aave (AAVE),而红线则表示相反。值得注意的是,该图表主要是将静止状态可视化。实际上,在应用我们的交易信号时,阈值会随着滚动窗口进行调整,以适应市场动态的变化。

现在,让我们开始执行交易信号:
def signals_zscore_evolution(ticker1_ts, ticker2_ts, window_size=15, first_ticker=True):"""Generate trading signals based on z-score analysis of the ratio between two time series.Parameters:- ticker1_ts (pandas.Series): Time series data for the first security.- ticker2_ts (pandas.Series): Time series data for the second security.- window_size (int): The window size for calculating z-scores and ratios' statistics.- first_ticker (bool): Set to True to use the first ticker as the primary signal source, and False to use the second.Returns:- signals_df (pandas.DataFrame): A DataFrame with 'signal' and 'orders' columns containing buy (1) and sell (-1) signals."""ratios = ticker1_ts / ticker2_tsratios_mean = ratios.rolling(window=window_size, min_periods=1, center=False).mean()ratios_std = ratios.rolling(window=window_size, min_periods=1, center=False).std()z_scores = (ratios - ratios_mean) / ratios_stdbuy = ratios.copy()sell = ratios.copy()if first_ticker:# These are empty zones, where there should be no signal# the rest is signalled by the ratio.buy[z_scores > -1] = 0sell[z_scores < 1] = 0else:buy[z_scores < 1] = 0sell[z_scores > -1] = 0signals_df = pd.DataFrame(index=ticker1_ts.index)signals_df['signal'] = np.where(buy > 0, 1, np.where(sell < 0, -1, 0))signals_df['orders'] = signals_df['signal'].diff()signals_df.loc[signals_df['orders'] == 0, 'orders'] = Nonereturn signals_dfAAVE_ts = uts_sanitized["AAVE-USD"]["Adj Close"]
C_ts = uts_sanitized["C"]["Adj Close"]
plt.figure(figsize=(26, 18))
signals_df1 = signals_zscore_evolution(AAVE_ts, C_ts)
profit_df1 = calculate_profit(signals_df1, AAVE_ts)
ax1, _ = plot_strategy(AAVE_ts, signals_df1, profit_df1)
signals_df2 = signals_zscore_evolution(AAVE_ts, C_ts, first_ticker=False)
profit_df2 = calculate_profit(signals_df2, C_ts)
ax2, _ = plot_strategy(C_ts, signals_df2, profit_df2)
ax1.legend(loc='upper left', fontsize=10)
ax1.set_title(f'Citigroup Paired with Aave', fontsize=18)
ax2.legend(loc='upper left', fontsize=10)
ax2.set_title(f'Aave Paired with Citigroup', fontsize=18)
plt.tight_layout()
plt.show()

在算法交易系统中,多个交易信号往往同时运行。因此,为了捕捉整体表现,通常会汇总所有信号的收益。让我们继续计算相应的累计回报。
plt.figure(figsize=(12, 6))
cumulative_profit_combined = profit_df1 + profit_df2
ax2_combined = cumulative_profit_combined.plot(label='Profit%', color='green')
plt.legend(loc='upper left', fontsize=10)
plt.title(f'Aave & Citigroup Paired - Cumulative Profit', fontsize=18)
plt.tight_layout()
plt.show()

在分析的这段时间里,尽管货币对交易策略缩水了 50%,但它的表现依然强劲,账面回报率高达 100%。这一成绩超过了标准普尔 500 指数两年 10% 的回报率。不过,该策略的方差较高,这可能是由于与花旗集团配对的加密货币存在不稳定性。
6. 观点回顾
在实践中,量化分析师使用风险调整指标(如 Sortino 比率)来评估策略绩效,该指标侧重于下行风险。
总之,我们对配对交易策略的关键要点进行了探讨,涵盖了其市场中性的方式、对 Z 值和协整等统计工具的依赖,以及对均值回归的运用。不过,在实际应用这一策略时,可能会面临一些挑战,例如交易成本以及资产相关性或协整性的非平稳性风险。最后回顾本文如下:
配对交易策略:依赖于两个资产价格稳定性的策略,利用价格趋同获利。
数据处理:重要性在于确保数据的完整性和准确性,以便进行准确的分析。
市场事件影响:市场事件(如 FTX 丑闻)可能影响资产之间的关系,协整性分析有助于识别这些变化。
统计方法:使用相关性、协整性和 Z-score 等统计方法来识别交易机会和生成交易信号。
风险和实际应用:在实际交易中,需要考虑交易成本和资产相关性的非平稳性,并使用风险调整指标来评估策略表现。
可视化:通过热图和柱状图等可视化工具,有助于直观地理解资产关系和交易策略的效果。
策略评估:使用风险调整的指标(如 Sortino 比率)来评估策略的实际表现。
本文内容仅仅是技术探讨和学习,并不构成任何投资建议。
转发请注明原作者和出处。
相关文章:
用 Python 构建高级配对交易策略
作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文阐述通过分析加密货币和传统金融工具之间的相关性和协整性,以及实施 Z-score 方法来生成交易信号,然后介绍如何使用 Python 构建配对交易策…...
Java 引用数据类型详解、字符串的不可变性、如何处理字符串的内存管理、String Pool 及其优化
文章目录 1. 引用数据类型1.1 常见引用数据类型 2. 字符串的不可变性2.1 不可变性的优点2.2 不可变性示例 3. 如何处理字符串的内存管理3.1 String Pool3.2 String 内存优化 4. String Pool 及其优化4.1 String Pool的工作原理4.2 String Pool的优化4.3 使用 intern() 进一步优…...
Babel使用
初始化项目 npm init -y 创建文件 // 转码前 // 定义数据 let input [1, 2, 3] // 将数组的每个元素 1 input input.map(item > item 1) console.log(input)配置.babelrc Babel的配置文件是.babelrc,presets字段设定转码规则,将es2015规则加入…...
自动机器学习(AutoML)
utoML是PAI的提供的自动寻找超参组合的机器学习增强型服务。您在训练模型时,如果超参组合复杂度过高,需大量训练资源和手工调试工作,可以使用AutoML来节省模型调参时间,提升模型调优效率和模型质量。 基础概念 超参数:…...
Vivado时序报告六:Report Timing详解
目录 一、前言 二、配置选项概览图 三、配置选项详解 3.1 Targets 3.2 Options 3.1.1 Report 3.1.2 Path limits 3.1.3 Path display 3.2 Advanced 3.2.1 Report 3.2.2 File Output 3.2.3 miscellaneous 3.3 Timer Settings 3.4 共有部分 四、 设计示例 4.1 设…...
java基础:数据类型的总结
一、Java 常用数据类型 1.数据类型分为:(1)基本数据类型 (2)引用数据类型 2.基本数据类型分类:数值型,非数值型。 3.数值型:(1) 整数类型(byte,short,int,long) (2) …...
【目标检测论文解读复现NO.39】基于改进 YOLOv8 的轻量级复杂环境苹果叶片病害检测方法
前言 此前出了目标改进算法专栏,但是对于应用于什么场景,需要什么改进方法对应与自己的应用场景有效果,并且多少改进点能发什么水平的文章,为解决大家的困惑,此系列文章旨在给大家解读最新目标检测算法论文,…...
python 基础笔记 2(函数, 类)
起因, 目的: 把很久以前,自己写的笔记发布出来。 现在粉丝多了,也不觉得丢人了。 为什么这些序号不连贯,因为有些很熟悉的东西,我都删了。 内建函数, 函数 zip()函数,利用 * 号操作符,可以将元组解压为列表。 我怀疑是zip的解包只能用一次。在内存中解开一次之后就销…...
LeetCode 2090.半径为K的子数组平均值
题目: 给你一个下标从 0 开始的数组 nums ,数组中有 n 个整数,另给你一个整数 k 。 半径为 k 的子数组平均值 是指:nums 中一个以下标 i 为 中心 且 半径 为 k 的子数组中所有元素的平均值,即下标在 i - k 和 i k 范…...
Qt C++ 编程中定义了一个槽函数(slot)deleteLater的作用
这行代码是在 Qt C编程中定义了一个槽函数(slot)deleteLater。 在 Qt 框架中,Q_SLOTS关键字用于声明类中的槽函数。deleteLater是一个非常有用的函数,它会安排接收对象在事件循环返回后被删除。 通常在以下情况下会使用deleteLa…...
【Hive】8-Hive性能优化及Hive3新特性
Hive性能优化及Hive3新特性 Hive表设计优化 Hive查询基本原理 Hive的设计思想是通过元数据解析描述将HDFS上的文件映射成表 基本的查询原理是当用户通过HQL语句对Hive中的表进行复杂数据处理和计算时,默认将其转换为分布式计算 MapReduce程序对HDFS中的数据进行…...
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-18目录1. On the Reliability of Large Language Models to Misinformed and Demographically-Informed Prompts2. SafeLLM: Dom…...
CTF(四)
导言: 本文主要讲述在CTF竞赛中,web类题目file_include。 靶场链接:攻防世界 (xctf.org.cn) 一,观察页面。 可以看到一段php代码。从则段代码中我们可以知道: 1,使用include引入check.php文件ÿ…...
智慧商城项目1-项目初始化创建
这是一个面向移动端的项目,先看看做了这个项目能收获什么,注意这是vue2的项目, 是个经典项目,能为未来学习vue3项目打下基础。 首先来说一下为啥是vue2,因为vue3还没有大范围普及,目前大部分企业还在用vue2…...
Java集合(四)--treeset/treemap/章节练习题目/去重原理的解读和应用
文章目录 1.treeset结构2.treemap结构3.集合去重辨析总结4.对于arraylist的练习题目5.对于HashMap的练习题目6.第三点的去重运用7.HashSe练习题目 1.treeset结构 下面的这个就是对于这个treeset结构进行测试的一个程序,在这个里面,add表示的就是对于这个…...
如何开启华为交换机 http
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目…...
SpringBoot中的RedisTemplate对象中的setIfAbsent()方法有什么作用?
文章目录 原子性操作用于分布式锁可选的过期时间 setIfAbsent() 方法是 Redis 中用于设置一个键值对的命令,只有在该键不存在时才会设置成功。它通常用于实现分布式锁的逻辑 主要功能: 原子性操作 setIfAbsent() 是一个原子性操作,意味着在执行该操作的…...
《合肥工业大学学报(自然科学版)》
《合肥工业大学学报(自然科学版)》以基础理论、应用科学和工程技术为主的综合性学术刊物,主要刊登机械工程、仪器科学与光电工程、材料科学与工程、电气与自动化工程、计算机与信息工程、电子科学与应用物理、土木与水利工程、资源与环境工程、汽车与交通工程、化学…...
Android11 USB Camera会出现预览绿屏问题
目录 一、问题描述 二、问题原因 三、解决方法 一、问题描述 DDR容量是4G及以上的机器,USB Camera会出现预览绿屏问题。 串口中会刷如下log: 二、问题原因 RGA2使用超过4G内存会异常,导致USB Camera调用rga相关操作报错,从而预览绿屏 三…...
Mongodb 获取集合(collection)的统计信息
在MongoDB中,获取指定集合(collection)的统计信息可以通过执行collStats命令来实现。这个命令提供了关于集合的详细信息,包括: 集合的大小索引的大小和数量文档的数量存储空间的使用情况各种统计数据,如平…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
相关类相关的可视化图像总结
目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系,可直观判断线性相关、非线性相关或无相关关系,点的分布密…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
