【量化】蜘蛛网策略复现

文章目录

  • 蜘蛛网策略
    • 研报概述
    • 持仓数据整理
      • 三大商品交易所的数据统一
      • 筛选共有会员
      • 清洗数据
      • 计算研报要求数据
      • 全部代码
    • 策略
    • 结果分析
      • 无参数策略
      • 有参数策略
        • 正做
        • 反做
      • MSD技术指标化

蜘蛛网策略

在这里插入图片描述

策略来自《东方证券-股指期货趋势交易之蜘蛛网策略——从成交持仓表中捕捉知情投资者行为-高子剑、魏建榕》

研报概述

结算会员成交持仓排名是每各交易日收盘后,交易所官网会公布的内容,披露信息为每个商品期货合约前20名结算会员的成交量与持仓量。

投资者的交易行为包含了对市场走势的预期,并最终反映到成交量和持仓量的变化之中。

将投资者分为两类:知情投资者和非知情投资者,前者在交易时更加坚定地偏向于卖或买地某一边,单位持仓量创造的成交量较小,后者交易行为较为反复、单位持仓量创造的成交量较大。

由于成交量、持买单量、持卖单量的前20名会员各不相同,挑出当月合约成交持仓表中3个排行榜共有的结算会员,个数记为m(m$<= 20 ) ,将当月合约剔除该 m 个结算会员后剩余的成交量、持买单量、持卖单量等效的视为一个会员单位,如此有 n = m + 1 个会员单位,针对该 n 个会员单位,成交量为 20),将当月合约剔除该m个结算会员后剩余的成交量、持买单量、持卖单量等效的视为一个会员单位,如此有n=m+1个会员单位,针对该n个会员单位,成交量为 20),将当月合约剔除该m个结算会员后剩余的成交量、持买单量、持卖单量等效的视为一个会员单位,如此有n=m+1个会员单位,针对该n个会员单位,成交量为V_i ,持买单量为 ,持买单量为 ,持买单量为b_i ,持卖单量为 ,持卖单量为 ,持卖单量为s_i ,构建统计量 ,构建统计量 ,构建统计量Stat_i=\frac{b_i+s_i}{V_i} ,越大说明其知情成分越高,针对前 20 名会员公司的总量构建统计量 ,越大说明其知情成分越高,针对前20名会员公司的总量构建统计量 ,越大说明其知情成分越高,针对前20名会员公司的总量构建统计量IF=\frac{OI}{Vol}$,其中OI为未平仓量(持买单量+持卖单量)、Vol为成交量。

构建ITS(知情投资者情绪,Informed Trader Sentiment)指标,计算n个会员单位的Stat,筛选Stat大于IF的会员单位,将筛选出的会员单位作为知情投资者,这些筛选出来的会员的持买单量之和为B、持卖单量之和为S, I T S = B − S B + S ITS=\frac{B-S}{B+S} ITS=B+SBS

构建UTS(非知情投资者情绪,Uninformed Trader Sentiment)指标,筛选Stat小于IF的会员单位,作为非知情投资者, U T S = B − S B + S UTS=\frac{B-S}{B+S} UTS=B+SBS

构建MSD(市场情绪差异,Market Sentiment Difference)指标, M S D ≡ I T S − U T S MSD\equiv ITS-UTS MSDITSUTS,描述了知情投资者与非知情投资者看多市场的力度差异。

策略

  • ITS>0买入,收盘价平仓。反之卖出,收盘价平仓。(我们可以第二日平仓)。
  • 遍历参数,ITS> λ \lambda λ买入,反之卖出。
  • 遍历参数,UTS< λ \lambda λ买入,反之卖出。
  • MSD> λ \lambda λ买入,反之卖出。
  • MSD技术指标化,MSD>MA(MSD, n)买入,反之卖出。

持仓数据整理

本次基础数据需要整理的内容有四点:

  1. 三大商品交易所的数据统一;
  2. 筛选共有会员;
  3. 清洗数据;
  4. 计算研报要求数据;

三大商品交易所的数据统一

商品期货交易所目前有四个:郑州商品交易所、上海期货交易所、大连商品交易所、广州期货交易所。由于广期所目前只有工业硅一个品种,不在我们统计范围内。

其它三个交易所,他们的数据各自有各自的一些特点,需要我们统一起来。

郑州商品交易所,19年以后给出了纯英文和中英结合的文件,前者给出了所有合约、后者只有主力合约,因为我们不确定每次用的是交易所给到的合约还是没给到的,因此我们筛选出后者:

# 筛选不含中文的文件
def contains_chinese(file_path):return any(u'\u4e00' <= char <= u'\u9fff' for char in file_path)
if exchange == 'ZhenZhou':futures_hold_folder_path_list = [path for path in futures_hold_folder_path_list if not contains_chinese(path)]

上期所和大商所有共同的问题就是没有时间,因此:

 _, date_string = os.path.split(os.path.split(path)[0])
temp_df = pd.read_csv(path, encoding='gbk', skiprows=1)
temp_df['交易时间'] = pd.to_datetime(date_string)

上期所还有个问题是他的原始列名都是英文,因此需要改成中文:

if exchange == 'ShangHai':temp_df.rename(columns={"INSTRUMENTID": "品类","PARTICIPANTABBR1": "会员简称_总成交量", "PARTICIPANTABBR2": "会员简称_总持买单量","PARTICIPANTABBR3": "会员简称_总持卖单量","CJ1": "成交量_总成交量", "CJ2": "成交量_总持买单量", "CJ3": "成交量_总持卖单量","CJ1_CHG": "增减_总成交量", "CJ2_CHG": "增减_总持买单量", "CJ3_CHG": "增减_总持卖单量", }, inplace=True)

筛选共有会员

因为原始数据是一日一日的,因此可以直接用groupby的方法分类,这样就可以获取同一交易时间内的数据,对其寻找交集字符也就是筛选共有会员公司:

# 计算每日每个品种的交集字符
def find_intersection_chars(group):member_cols = ['会员简称_总成交量', '会员简称_总持买单量', '会员简称_总持卖单量']intersection = set(group[member_cols[0]])for col in member_cols[1:]:intersection = intersection.intersection(set(group[col]))return list(intersection)
grouped = temp_df.groupby(["品类", "交易时间"])
for group_name, group_df in grouped:intersection_chars = find_intersection_chars(group_df)  # 计算每日每个品种的交集字符

清洗数据

原始数据都是str格式的,也就是上了千的数字都有逗号,这是第一点;其次里面有些合约不活跃导致前二十名会员公司不全,就会出现空值‘-’,这个空值不能加减,我们把他替换为0,但是这里面有数据是负数,相当于把其它的负值符号给消除了,也是个问题,我的解决方案是要求整个值完全相当于‘-’才做,否则不弄:

# 批量清理数据
def clean_and_convert(value):value = 0 if pd.isna(value) or value == '-' else str(value).replace(',', '')return int(float(value))
columns_to_clean = ['成交量_总成交量', '成交量_总持买单量', '成交量_总持卖单量', '增减_总成交量', '增减_总持买单量', '增减_总持卖单量']
group_df = group_df.fillna(0)  # 使用fillna()方法将NaN值替换为0
group_df[columns_to_clean] = group_df[columns_to_clean].applymap(clean_and_convert)  # 清理数据

计算研报要求数据

这边代码多一些,我的思路是基础数据都在这里计算好,最后返回一个以具体合约、日期为索引的要求数据,即单合约、单日期下只有一行数据,比如MA305在2023年4月10日这一天的前二十名会员统计量等数据。

我这里是先把共有会员和非共有会员所需的数据计算出来,然后按研报的来,方法是创建一个字典然后循环验证是不是共有会员,是的话添加进去,然后分别计算统计量,和IF统计量进行比较分类,得到我们的需求数据。

# 基础数据
a = group_df[group_df['会员简称_总成交量'].isin(intersection_chars)]['成交量_总成交量'].sum()
d = group_df[~group_df['会员简称_总成交量'].isin(intersection_chars)]['成交量_总成交量'].sum()# 衍生数据
IF = (h + j) / g
member_data = {member: {'成交量_总成交量': 0, '成交量_总持买单量': 0, '成交量_总持卖单量': 0} for member in intersection_chars}  # 创建一个字典来存储交集会员的买单量、卖单量和成交量
for member in intersection_chars:member_data[member]['成交量_总成交量'] = group_df.loc[group_df['会员简称_总成交量'] == member, '成交量_总成交量'].sum()member_data[member]['成交量_总持买单量'] = group_df.loc[group_df['会员简称_总持买单量'] == member, '成交量_总持买单量'].sum()member_data[member]['成交量_总持卖单量'] = group_df.loc[group_df['会员简称_总持卖单量'] == member, '成交量_总持卖单量'].sum()
member_stats = {member: (data['成交量_总持卖单量'] + data['成交量_总持买单量']) / data['成交量_总成交量'] for member, data in member_data.items()}
filtered_members = {"greater": [], "less": []}
for member, stats in member_stats.items():if stats > IF:filtered_members["greater"].append(member)else:filtered_members["less"].append(member)

全部代码

# variable
exchange = 'ZhenZhou'  # ZhenZhou, DaLian, ShangHaidef contains_chinese(file_path):return any(u'\u4e00' <= char <= u'\u9fff' for char in file_path)# 计算每日每个品种的交集字符
def find_intersection_chars(group):member_cols = ['会员简称_总成交量', '会员简称_总持买单量', '会员简称_总持卖单量']intersection = set(group[member_cols[0]])for col in member_cols[1:]:intersection = intersection.intersection(set(group[col]))return list(intersection)# 批量清理数据
def clean_and_convert(value):value = 0 if pd.isna(value) or value == '-' else str(value).replace(',', '')return int(float(value))# read data
futures_hold_folder_path = r'\exchange_%s\*' % exchange
futures_hold_folder_path_list = glob(os.path.join(futures_hold_folder_path, '*'))
if exchange == 'ZhenZhou':futures_hold_folder_path_list = [path for path in futures_hold_folder_path_list if not contains_chinese(path)]futures_hold_folder_path_list = futures_hold_folder_path_list[2830:]
elif exchange == 'DaLian':futures_hold_folder_path_list = futures_hold_folder_path_list[15830:]  # 过滤前面不需要的时间
elif exchange == 'ShangHai':futures_hold_folder_path_list = futures_hold_folder_path_list[20830:]  # 过滤前面不需要的时间result = []
for path in tqdm.tqdm(futures_hold_folder_path_list):if exchange == 'ZhenZhou':temp_df = pd.read_csv(path, encoding='gbk', parse_dates=['交易时间'], skiprows=1)grouped = temp_df.groupby(["品类", "交易时间"])else:_, date_string = os.path.split(os.path.split(path)[0])temp_df = pd.read_csv(path, encoding='gbk', skiprows=1)temp_df['交易时间'] = pd.to_datetime(date_string)if exchange == 'ShangHai':temp_df.rename(columns={"INSTRUMENTID": "品类","PARTICIPANTABBR1": "会员简称_总成交量", "PARTICIPANTABBR2": "会员简称_总持买单量","PARTICIPANTABBR3": "会员简称_总持卖单量","CJ1": "成交量_总成交量", "CJ2": "成交量_总持买单量", "CJ3": "成交量_总持卖单量","CJ1_CHG": "增减_总成交量", "CJ2_CHG": "增减_总持买单量", "CJ3_CHG": "增减_总持卖单量", }, inplace=True)else:temp_df.rename(columns={"合约代码": "品类",}, inplace=True)grouped = temp_df.groupby(["品类", "交易时间"])for group_name, group_df in grouped:intersection_chars = find_intersection_chars(group_df)  # 计算每日每个品种的交集字符columns_to_clean = ['成交量_总成交量', '成交量_总持买单量', '成交量_总持卖单量', '增减_总成交量', '增减_总持买单量', '增减_总持卖单量']group_df = group_df.fillna(0)  # 使用fillna()方法将NaN值替换为0group_df[columns_to_clean] = group_df[columns_to_clean].applymap(clean_and_convert)  # 清理数据# 基础数据a = group_df[group_df['会员简称_总成交量'].isin(intersection_chars)]['成交量_总成交量'].sum()b = group_df[group_df['会员简称_总持买单量'].isin(intersection_chars)]['成交量_总持买单量'].sum()c = group_df[group_df['会员简称_总持卖单量'].isin(intersection_chars)]['成交量_总持卖单量'].sum()d = group_df[~group_df['会员简称_总成交量'].isin(intersection_chars)]['成交量_总成交量'].sum()e = group_df[~group_df['会员简称_总持买单量'].isin(intersection_chars)]['成交量_总持买单量'].sum()f = group_df[~group_df['会员简称_总持卖单量'].isin(intersection_chars)]['成交量_总持卖单量'].sum()g = group_df['成交量_总成交量'].sum()h = group_df['成交量_总持买单量'].sum()j = group_df['成交量_总持卖单量'].sum()# 衍生数据IF = (h + j) / gmember_data = {member: {'成交量_总成交量': 0, '成交量_总持买单量': 0, '成交量_总持卖单量': 0} for member in intersection_chars}  # 创建一个字典来存储交集会员的买单量、卖单量和成交量for member in intersection_chars:member_data[member]['成交量_总成交量'] = group_df.loc[group_df['会员简称_总成交量'] == member, '成交量_总成交量'].sum()member_data[member]['成交量_总持买单量'] = group_df.loc[group_df['会员简称_总持买单量'] == member, '成交量_总持买单量'].sum()member_data[member]['成交量_总持卖单量'] = group_df.loc[group_df['会员简称_总持卖单量'] == member, '成交量_总持卖单量'].sum()member_stats = {member: (data['成交量_总持卖单量'] + data['成交量_总持买单量']) / data['成交量_总成交量'] for member, data in member_data.items()}filtered_members = {"greater": [], "less": []}for member, stats in member_stats.items():if stats > IF:filtered_members["greater"].append(member)else:filtered_members["less"].append(member)filtered_members_total_buy = {"greater": sum(member_data[member]['成交量_总持买单量'] for member in filtered_members["greater"]),"less": sum(member_data[member]['成交量_总持买单量'] for member in filtered_members["less"])}filtered_members_total_sell = {"greater": sum(member_data[member]['成交量_总持卖单量'] for member in filtered_members["greater"]),"less": sum(member_data[member]['成交量_总持卖单量'] for member in filtered_members["less"])}filtered_members_total_volume = {"greater": sum(member_data[member]['成交量_总成交量'] for member in filtered_members["greater"]),"less": sum(member_data[member]['成交量_总成交量'] for member in filtered_members["less"])}# resultresult_dict = {"品类": group_name[0],"交易时间": group_name[1],"交集字符": intersection_chars,"共有会员_总成交量": a,"共有会员_总持买单量": b,"共有会员_总持卖单量": c,"非共有会员_总成交量": d,"非共有会员_总持买单量": e,"非共有会员_总持卖单量": f,"前20会员总成交量": g,"前20会员总持买单量": h,"前20会员总持卖单量": j,'IF': IF,'ITS_buy': filtered_members_total_buy['greater'], 'ITS_sell': filtered_members_total_sell['greater'], 'ITS_volume': filtered_members_total_volume['greater'], 'UTS_buy': filtered_members_total_buy['less'], 'UTS_sell': filtered_members_total_sell['less'], 'UTS_volume': filtered_members_total_volume['less']}result.append(result_dict)   # 用字典的形式添加,效率更高result_df = pd.DataFrame(result)
result = result_df.sort_values(['交易时间', '品类'])
print(result)
result.to_csv(r'exchange/%s_hold.csv' % (exchange), encoding='GBK')

策略

研报中只计算了共有会员中,统计量大于前二十名会员的作为知情投资者,共有会员中低于统计量的作为非知情投资者,但这个非知情投资者或许本身更多倾向于知情投资者中的弱势知情投资者,然后共有会员与非共有会员类似于大体量公司和小体量公司的对比,小体量公司也会有大户存在,或许反映了一些特殊情况。

因此我把共有会员和非共有会员按照研报的知情与非知情又构建了一次指标:

def cal_spider_holding(df):df['知情投资者情绪_共有会员'] = (df['共有会员_总持买单量'] - df['共有会员_总持卖单量']) / (df['共有会员_总持买单量'] + df['共有会员_总持卖单量'])  # ITS,类似df['非知情投资者情绪_非共有会员'] = (df['非共有会员_总持买单量'] - df['非共有会员_总持卖单量']) / (df['非共有会员_总持买单量'] + df['非共有会员_总持卖单量'])  # UTSdf['ITS_Stat'] = (df['ITS_buy'] + df['ITS_sell']) / df['ITS_volume']df['UTS_Stat'] = (df['UTS_buy'] + df['UTS_sell']) / df['UTS_volume']df['ITS'] = (df['ITS_buy'] - df['ITS_sell']) / (df['ITS_buy'] + df['ITS_sell'])df['UTS'] = (df['UTS_buy'] - df['UTS_sell']) / (df['UTS_buy'] + df['UTS_sell'])df['市场情绪差异_自创'] = df['知情投资者情绪_共有会员'] - df['非知情投资者情绪_非共有会员']  # MSDdf['MSD'] = df['ITS'] - df['UTS']  # MSDdf.fillna(method='ffill', inplace=True)return df

此外,我把研报中的隔日持仓变为了趋势持仓,即不出现相反信号的话就一直拿着之前的单子。

结果分析

持仓因子可以展示哪些品种资金影响程度大、哪些品种资金影响程度小,以及哪些品种资金是正向指引、哪些品种资金是负向指引,甚至可以进一步探究哪些品种的基本面与资金预期经常撇叉等。因此持仓因子也可以当作新因子加入量化体系,目前各因子是等权重的,后续可以根据IC等方式自动调整权重。

回测时间为2018年1月1日至2023年3月7日。

无参数策略

以下,1为正做、-1为反做,比如1时,ITS>0做多、<0做空,如果是-1则ITS<0做空、>0做多。

在这里插入图片描述

先更精确理解一下各定义,首先ITS、UTS、知情投资者情绪、非知情投资者情绪的统计量构建是没有差别的,都是对应的持买单量与持卖单量相减除以两者相加,其次市场情绪差异和MSD的构建是一致的,都是对应的知情减非知情。

然后更精确理解一下各分类:

  • 共有会员即前二十名会员中同时出现在三个榜单上的会员,个人理解是偏向于大体量公司的,比如中信、永安这种通常出现就会同时出现在三个榜单上,因为体量太大了;
  • 非共有会员即前二十名会员中没有同时出现在三个榜单上的会员,个人理解是小体量公司但有自己倾向的,可能是某个大户在里面,但因为我们统计量是把他们加起来了,所以展现出来没有什么偏好,结果显示他们是最中性的可能也是侧面反映了此点;
  • ITS即共有会员中IF统计量大于合约IF统计量的会员之和,也就是研报认为的知情投资者,我理解是共有会员中单位持仓量创造成交量更小的、持仓相对合约本身坚定的会员,但效果和共有会员差不多;
  • UTS即共有会员中IF统计量小于合约IF统计量的会员之和,也就是研报认为的非知情投资者,他确实是表现最差的分类,是大体量客户中的开平仓较多的一批人。

首先,整体来看效果不好,只是个别品种存在一定效果,而且每个品种表现好的策略不一样,比如MA在ITS反做效果好、但FG在ITS正做效果好,如此该策略就没有普适性,更多需要去思考单体品种效果好的背后逻辑。

以下是年化收益在15%以上的策略与品种:

para年化收益最大回撤年化收益回撤比symbol
[‘ITS’, 1]0.39-0.251.54FG
[‘知情投资者情绪_共有会员’, -1]0.38-0.420.91MA
[‘市场情绪差异_自创’, -1]0.27-0.500.54TA
[‘ITS’, -1]0.27-0.500.53MA
[‘非知情投资者情绪_非共有会员’, -1]0.23-0.211.09RM
[‘MSD’, 1]0.21-0.280.77ru
[‘MSD’, 1]0.21-0.161.25PK
[‘UTS’, 1]0.20-0.280.72lu
[‘ITS’, -1]0.20-0.320.60p
[‘非知情投资者情绪_非共有会员’, 1]0.20-0.620.32TA
[‘UTS’, -1]0.19-0.250.76pg
[‘知情投资者情绪_共有会员’, 1]0.19-0.310.62FG
[‘ITS’, -1]0.19-0.340.55SA
[‘市场情绪差异_自创’, 1]0.18-0.420.44FG
[‘MSD’, -1]0.18-0.460.39MA
[‘非知情投资者情绪_非共有会员’, -1]0.18-0.340.52SA
[‘ITS’, -1]0.17-0.600.28TA
[‘UTS’, 1]0.17-0.500.34ru
[‘知情投资者情绪_共有会员’, -1]0.16-0.290.56OI
[‘非知情投资者情绪_非共有会员’, 1]0.16-0.180.89lh
[‘ITS’, -1]0.16-0.270.57OI
[‘MSD’, 1]0.15-0.200.77l

有参数策略

正做

正做即>参数时做多、<参数时做空。

在这里插入图片描述

根据表格,第一,整体效果确实优于无参数策略;第二,可以明显发现收益的参数呈现左偏状态,说明和研报里针对股指期货得到的结论相同,同时该情况在历经10年以后依然在商品期货中表现;第三,不论是大体量公司,还是偶尔上榜的小体量公司之和,或是研报划定的知情投资者、非知情投资者,全都按他们的净持仓反着做效果更好,即跟市场大部分人反着做能赚钱(参数左偏的体现)。

参数左偏的原因研报里也已经解释,前二十大会员通常净持仓为空头、由于机构套期保值的需求;但左偏的程度是大于研报里的股指期货的,回测了更细致的参数,研报中的最佳参数-0.06在商品这里的平均回撤比就排到后面了,商品的-0.6效果相对更好,或许代表商品期货中产业套保力量的强大。

以下是年化收益在20%以上的策略与品种,可以看到各品种集中度较高,即某品种在不同策略的表现趋同:

para年化收益最大回撤年化收益回撤比symbol
[‘MSD’, -0.3]0.43-0.212.03pg
[‘ITS’, 0]0.39-0.251.54FG
[‘市场情绪差异_自创’, -0.3]0.27-0.400.67UR
[‘ITS’, -0.3]0.25-0.161.60lu
[‘ITS’, -0.6]0.25-0.400.64UR
[‘知情投资者情绪_共有会员’, -0.6]0.25-0.400.63UR
[‘UTS’, -0.6]0.25-0.400.63UR
[‘市场情绪差异_自创’, -0.6]0.25-0.400.63UR
[‘非知情投资者情绪_非共有会员’, -0.6]0.25-0.400.63UR
[‘MSD’, -0.3]0.24-0.280.84PF
[‘UTS’, -0.3]0.24-0.410.57UR
[‘UTS’, -0.3]0.23-0.260.89pg
[‘非知情投资者情绪_非共有会员’, -0.3]0.23-0.430.53UR
[‘ITS’, -0.6]0.22-0.400.54i
[‘知情投资者情绪_共有会员’, -0.6]0.22-0.400.54i
[‘UTS’, -0.6]0.22-0.400.54i
[‘知情投资者情绪_共有会员’, -0.3]0.22-0.400.54i
[‘非知情投资者情绪_非共有会员’, -0.6]0.22-0.400.54i
[‘市场情绪差异_自创’, -0.6]0.22-0.400.54i
[‘MSD’, -0.6]0.22-0.400.54i
[‘ITS’, -0.3]0.22-0.390.55i
[‘UTS’, -0.3]0.21-0.400.53i
[‘MSD’, 0]0.21-0.280.77ru
[‘市场情绪差异_自创’, -0.3]0.21-0.220.95eb
[‘非知情投资者情绪_非共有会员’, -0.3]0.21-0.400.52i
[‘市场情绪差异_自创’, -0.6]0.21-0.290.73OI
[‘MSD’, 0]0.21-0.161.25PK
反做

反做即>参数时做空、<参数时做多。

在这里插入图片描述

可以明显发现收益的参数呈现右偏状态,和上个正做策略得到的结论一致。

MSD技术指标化

对MSD进行均线化,具体策略为:MSD上穿过去N日MSD均线时做多、反之做空。

在这里插入图片描述

参数平原不是特别有规律,3日均线,有着不错的收益。

但整体看效果并没有相对前述策略质的提升。

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

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

相关文章

从实际工作情况,介绍嵌入式(MCU)软件开发常用(通用)工具

目录 前言 1、代码阅读及编辑工具&#xff08;VSCode、Understand&#xff09; 2、代码对比工具&#xff08;Beyond Compare&#xff09; 3、代码仓库相关工具&#xff08;Git、SVN、Tortoise&#xff09; 4、文本编辑器&#xff08;Notepad&#xff09; 5、电脑文件搜索工…

Springcloud Alibaba使用Canal将Mysql数据实时同步到Redis保证缓存的一致性

目录 1. 背景 2. Windows系统安装canal 3.Mysql准备工作 4. 公共依赖包 5. Redis缓存设计 6. mall-canal-service 1. 背景 canal [kənl] &#xff0c;译意为水道/管道/沟渠&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。其诞…

【深度解析C++】const成员函数

系列文章目录 &#x1f308;座右铭&#x1f308;&#xff1a;人的一生这么长、你凭什么用短短的几年去衡量自己的一生&#xff01; &#x1f495;个人主页:清灵白羽 漾情天殇_计算机底层原理,深度解析C,自顶向下看Java-CSDN博客 ❤️相关文章❤️&#xff1a;Cthis指针&#xf…

PostgreSQL | FunctionProcedure | 函数与存储过程的区别

文章目录 PostgreSQL | Function&Procedure | 函数与存储过程的区别1. 简述书面说法大白话讲 2. 函数&#xff08;Function&#xff09;2.1 定义2.2 用途2.3 执行2.4 事务处理2.5 说点例子1. 当参数都是IN类时2. 参数中出现OUT、INOUT参数时 3. 存储过程&#xff08;Proced…

C语言之整型提升

文章目录 1 有可能出现的问题2 产生以上问题的原因&#xff08;整型提升&#xff09;3 整型提升的过程4 整型提升示例5 总结 1 有可能出现的问题 代码如下 #include <stdio.h>int main () {int a -1;unsigned int b 1;if (a < b) {printf("a < b");}…

【STM32】SPI通信

1 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff0c;串行外设接口&#xff09;是由Motorola公司开发的一种通用数据总线 四根通信线&#xff1a;SCK&#xff08;Serial Clock&#xff0c;串行时钟&#xff09;、MOSI&#xff08;Master Output Slave Input&am…

使用react+vite开发项目时候,部署上线后刷新页面无法访问解决办法

说一下我这边的环境和使用的路由模式&#xff1a;vitereactBrowserRouter路由模式&#xff0c;所以如果你和我一样的话&#xff0c;可以试试我的这种解决办法&#xff0c;我是将项目打包后直接丢到服务器上的目录里面&#xff0c;然后配置nginx直接访问根目录。 我的nginx配置…

React快速入门之交互性

响应事件 创建事件处理函数 处理函数名常以handle事件名命名 function handlePlayClick() {alert(Playing);}传递事件处理函数 函数名、匿名两种方式&#xff01; function PlayButton() {function handlePlayClick() {alert(Playing);}return (<Button handleClick{handl…

java虚拟机内存管理

文章目录 概要一、jdk7与jdk8内存结构的差异二、程序计数器三、虚拟机栈3.1 什么是虚拟机栈3.2 什么是栈帧3.3 栈帧的组成 四、本地方法栈五、堆5.1 堆的特点5.2 堆的结构5.3 堆的参数配置 六、方法区6.1 方法区结构6.2 运行时常量池 七、元空间 概要 根据 JVM 规范&#xff0…

探索小红书笔记API:挖掘数据背后的故事

随着数字化时代的到来&#xff0c;数据已经成为企业和个人决策的重要依据。小红书作为一个流行的社交电商平台&#xff0c;积累了大量的用户数据和内容。通过探索小红书笔记API&#xff0c;我们可以深入挖掘这些数据背后的故事&#xff0c;从而更好地理解用户需求和市场趋势。 …

弱电工程计算机网络系统基础知识

我们周围无时无刻不存在一张网&#xff0c;如电话网、电报网、电视网、计算机网络等&#xff1b;即使我们身体内部也存在许许多多的网络系统&#xff0c;如神经系统、消化系统等。最为典型的代表即计算机网络&#xff0c;它是计算机技术与通信技术两个领域的结合。 计算机网络的…

《Spring Cloud学习笔记:微服务保护Sentinel + JMeter快速入门》

Review 解决了服务拆分之后的服务治理问题&#xff1a;Nacos解决了服务治理问题OpenFeign解决了服务之间的远程调用问题网关与前端进行交互&#xff0c;基于网关的过滤器解决了登录校验的问题 流量控制&#xff1a;避免因为突发流量而导致的服务宕机。 隔离和降级&#xff1a…

八股文打卡day12——计算机网络(12)

面试题&#xff1a;HTTPS的工作原理&#xff1f;HTTPS是怎么建立连接的&#xff1f; 我的回答&#xff1a; 1.客户端向服务器发起请求&#xff0c;请求建立连接。 2.服务器收到请求之后&#xff0c;向客户端发送其SSL证书&#xff0c;这个证书包含服务器的公钥和一些其他信息…

LVS那点事

LVS 原理 IPVS LVS 的 IP 负载均衡技术是通过 IPVS 模块来实现的&#xff0c;IPVS 是 LVS 集群系统的核心软件&#xff0c;它的主要作用是&#xff1a;安装在 Director Server 上&#xff0c;同时在 Director Server 上虚拟出一个 IP 地址&#xff0c;用户必须通过这个虚拟的…

k8s的二进制部署: 源码包部署-----node节点部署

服务器IP软件包k8s--master0120.0.0.61kube-aplserver&#xff0c;kube-controer-manager&#xff0c;kube-scheduler&#xff0c;etcdk8s--master0220.0.0.62kube-controer-manager&#xff0c;kube-schedulernode节点0120.0.0.62kubelet&#xff0c;kube-proxy&#xff0c;et…

初识javaWeb

一、JavaWeb是什么&#xff1f; 1、概念 javaWeb指的是使用java语言进行互联网领域项目开发的技术栈——进行web项目开发所需的技术的集合。 -Web前端——在浏览器中用户可以看到的网页 -Web后端——为前端提供数据的程序 2、Web项目 java语言是可以进行多种类型的项目开发&a…

信号处理设计模式

问题 如何编写信号安全的应用程序&#xff1f; Linux 应用程序安全性讨论 场景一&#xff1a;不需要处理信号 应用程序实现单一功能&#xff0c;不需要关注信号 如&#xff1a;数据处理程序&#xff0c;文件加密程序&#xff0c;科学计算程序 场景二&#xff1a;需要处理信…

计算机毕业设计------ssm茶叶溯源系统

项目介绍 茶叶溯源系统&#xff0c;分为前台与后台。普通用户可在前台通过18位的编码查询茶叶的出售历史。 后台分为两种角色&#xff0c;管理员与经销商&#xff1b; 管理员主要功能包括&#xff1a; 主界面&#xff1b; 管理员管理&#xff1a;管理员列表、添加管理员&am…

SparkStreaming_window_sparksql_reids

1.5 window 滚动窗口滑动窗口 window操作就是窗口函数。Spark Streaming提供了滑动窗口操作的支持&#xff0c;从而让我们可以对一个滑动窗口内的数据执行计算操作。每次掉落在窗口内的RDD的数据&#xff0c;会被聚合起来执行计算操作&#xff0c;然后生成的RDD&#xff0c;会…

设计模式——行为型模式

模板方法模式 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象行为模式&#xff0c;前者采用继承机制来在类间…