【量化】蜘蛛网策略复现

文章目录

  • 蜘蛛网策略
    • 研报概述
    • 持仓数据整理
      • 三大商品交易所的数据统一
      • 筛选共有会员
      • 清洗数据
      • 计算研报要求数据
      • 全部代码
    • 策略
    • 结果分析
      • 无参数策略
      • 有参数策略
        • 正做
        • 反做
      • 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, ShangHai

def 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值替换为0
        group_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) / 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)
        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"])
        }
        # result
        result_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['非共有会员_总持卖单量'])  # UTS
    df['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['非知情投资者情绪_非共有会员']  # MSD
    df['MSD'] = df['ITS'] - df['UTS']  # MSD

    df.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日均线,有着不错的收益。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

腾讯云轻量应用服务器详细介绍

腾讯云轻量应用服务器开箱即用、运维简单的轻量级云服务器&#xff0c;CPU内存带宽配置高并且价格特别优惠&#xff0c;轻量2核2G3M带宽62元一年、2核2G4M优惠价118元一年&#xff0c;540元三年、2核4G5M带宽218元一年&#xff0c;756元3年、4核8G12M带宽646元15个月等&#xf…

Linux操作系统:LVM与磁盘配额

目录 一、LVM逻辑卷管理基础 1、LVM逻辑卷管理的概念 2、LVM逻辑卷管理的核心组件 3、LVM逻辑卷管理的优势 4、LVM逻辑卷管理的命令 4.1 扫描命令的用法 4.1.1 pvscan 4.1.2 vgscan 4.1.3 lvscan 4.2 查看命令的用法 4.2.1 pvdisplay 4.2.2 vgdisplay 4.2.3 lvdis…

12.27_黑马数据结构与算法笔记Java(补2)

目录 279 0-1 背包问题 动态规划 实现 280 0-1 背包问题 动态规划 降维 281 完全背包问题 动态规划 分析 282 完全背包问题 动态规划 实现 283 零钱兑换问题 动态规划 分析 284 零钱兑换问题 动态规划 实现 285 零钱兑换问题 动态规划 降维 286 零钱兑换II 动态规划 分析…

【idea】运行工程时候卡了许久Java Method Breakpoints

老以为是数据库连接不上&#xff0c;此问题概率性小&#xff0c;操作上面不小心打了断点… 应该是打断点的时候&#xff0c;打到了方法上面&#xff0c;去掉哟 Java Method Breakpoints

C++day2作业

把课上strcut的练习&#xff0c;尝试着改成class #include <iostream>using namespace std; class Stu { private:int age;string sex;int hign; public:int soce;void get_information();void set_information(); }; void Stu::set_information() {static Stu s1;cout …

C++ DAY2作业

1.课堂struct练习&#xff0c;用class&#xff1b; #include <iostream>using namespace std;class Stu { private:int age;char sex;int high; public:double score;void set_values(int a,char b,int c,double d);int get_age();char get_sex();int get_high(); }; vo…

「从红月开始」运输公司遭精神污染,小十七救哥哥,事发地陷危机

Hello,小伙伴们&#xff0c;我是拾荒君。 国漫《从红月开始》第3集超前爆料&#xff0c;本次透露陆辛首次被派遣去调查精神污染的任务。他的目的地是四方运输公司&#xff0c;一个主要由亡命之徒组成的组织。他们表面上从事运输业务&#xff0c;但背地里进行偷渡和走私活动。 …

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

&#x1f4cb; 前言 ​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《斯坦福大学之CSAPP》⏰诗赋清音&#xff1a;桃花灼灼春风暖&#xff0c;心随乐曲扬徐徐。 苦尽甘来梦未阑&#xff0c;岁月长河任舟游。 ​ &#x1f389;欢迎…

cnPuTTY 0.80.0.1—PuTTY Release 0.80中文版本简单说明~~

2023-12-18 官方发布了PuTTY 0.80本次发布主要是针对Terrapin攻击(CVE-2023-48795)的修改发布。 更多详细的内容请查看PuTTY Change Log。 有关Terrapin攻击可用简单参考&#xff1a;警告&#xff01;&#xff01;&#xff01;Terrapin攻击(CVE-2023-48795)~~~ 为了缓解此漏洞…

【线性代数】通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗?

一、通过矩阵乘法得到的线性方程组和原来的线性方程组同解吗&#xff1f; 如果你进行的矩阵乘法涉及一个线性方程组 Ax b&#xff0c;并且你乘以一个可逆矩阵 M&#xff0c;且产生新的方程组 M(Ax) Mb&#xff0c;那么这两个系统是等价的&#xff1b;它们具有相同的解集。这…

【unity3D-粒子系统】粒子系统主模块-Particle System篇

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的粒子系统主模块-Particle System 基础知识 Particle System 介绍&#xff1a;粒子系统的主模块&#xff0c;是必需的模块&#x…

在线客服系统推荐:提升客户满意度与工作效率的利器

客服系统分为售前和售后&#xff0c;售前客户系统是为了能够及时解决客户在购买产品前的问题&#xff0c;通过客服人员让客户了解产品的功能点是能够满足他们的需求点&#xff0c;从未达到转化的目的。 而售后客户系统主要是提供给购买后的客户强大的产品售后支持&#xff0c;…

PiflowX组件-DataGen

DataGen组件 组件说明 按数据生成规则模拟数据。在开发和演示场景下使用比较方便。具体可以查看Flink官方DataGen connector。 计算引擎 flink 有界性 字段的数据全部生成完成后&#xff0c;source 就结束了。 因此&#xff0c;有界性取决于字段的有界性。 组件分组 co…

SQL Server 索引和视图

CSDN 成就一亿技术人&#xff01; 难度指数&#xff1a;* * * CSDN 成就一亿技术人&#xff01; 目录 1.索引 什么是索引&#xff1f; 索引的作用&#xff1f; 索引的分类 1. 唯一索引 2. 主键索引 3. 聚集索引 4.非聚集索引 5.复合索引 6.全文搜索 索引的创建&am…

Springboot拦截器及统一异常处理

文章目录 一、Java中异常相关概念1、异常类2、异常处理方法3、注意事项4、自定义异常 二、配置全局异常处理1、统一返回体定义2、定义异常处理实现类3、全局异常处理类 三、Springboot拦截器1、定义拦截器2、注册拦截器 四、验证效果 一、Java中异常相关概念 1、异常类 Throw…

C语言—每日选择题—Day64

前言 两天没更新了&#xff0c;作者在复习期末考试&#xff0c;更新一波&#xff0c;祝大家都能顺利通过期末考试&#xff01;&#xff01;&#xff01; 指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博…

javaWebssh民宿管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh民宿管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模 式开发。开发环境为TOMCAT7.0,My…

【高可用】使用Keepalived实现SFTP服务的高可用

使用Keepalived实现SFTP服务的高可用 背景 这个事情的背景是生产环境的数据采集流程时不时会出问题&#xff08;这个也是不可避免的&#xff09;&#xff0c;目前的处理手段是&#xff1a;所有的数据接口服务器&#xff08;也就是存放原始数据等待采集的服务器&#xff09;都…

完全背包问题,原理剖析,公式推导,OJ详解

文章目录 前言一、完全背包的状态设计1、状态设计2、状态转移方程3、对比0/1背包问题4、时间复杂度分析 二、完全背包问题的优化1、时间复杂度优化2、空间复杂度优化 三、OJ练习裸题完全背包离散化最小值 前言 完全背包问题&#xff0c;相比0/1背包问题&#xff0c;实就每个物品…

git unable to create temporary file: No space left on device(git报错)

1.问题 1.1 vscode中npm run serve跑项目的时候&#xff0c;进度达到95%的时候一直卡着无进度&#xff1b; 1.2 git命令提交代码报错&#xff1b; 2.具体解决 这个错误通常表示你的磁盘空间已经满了&#xff0c;导致 Git 无法在临时目录中创建文件。2.1 清理磁盘空间&#xf…