【量化】蜘蛛网策略复现

文章目录

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

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

相关文章

C#学习笔记 - C#基础知识 - C#从入门到放弃 - C# Windows窗体技术及基础控件(二)

C# 入门基础知识 - C# Windows窗体技术及基础控件 第12节 Windows窗体技术及基础控件12.8 Label 控件12.9 Button 控件12.10 TextBox控件12.11 RichTextBox 控件12.12 Timer控件12.13 CheckBox 控件12.14 RadioButton 控件12.15 ComboBox 控件、ListBox 控件和CheckedListBox 控…

什么是 NLP (自然语言处理)

NLP&#xff08;自然语言处理&#xff09;到底是做什么&#xff1f; NLP 的全称是 Natural Language Processing&#xff0c;翻译成中文称作&#xff1a;自然语言处理。它是计算机和人工智能的一个重要领域。顾名思义&#xff0c;该领域研究如何处理自然语言。 自然语言就是我…

构建全场景解决方案,中国移动磐维数据库赋能数字化建设加速向前

【引言】随着数字化转型的加速&#xff0c;数据成为企业的核心资产&#xff0c;数据库作为数据的基础设施&#xff0c;承载着企业的业务发展和创新能力。如何构建一个高效、稳定、安全的数据库平台&#xff0c;满足不同场景的数据需求&#xff0c;是企业面临的重要挑战。本文将…

前端必须的服务端项目,node + express (这篇文章就够用)包含源代码

作为一个前端程序员&#xff0c;刚开始入门的时候&#xff0c;你觉得只要学习前端代码&#xff08;js css html&#xff09;就行了&#xff0c;实际上&#xff0c;到后面很多知识都涉及到服务端&#xff0c;在我们学习的过程中难免需要写一些 demo。比如在浏览器的缓存、或者…

公司防泄密软件监控员工哪些行为?

公司防泄密软件通常监控员工在使用电脑和其他存储设备时的一系列行为&#xff0c;以确保数据安全和防止敏感信息泄露。以下是一些公司防泄密软件可能监控的员工行为&#xff1a; 文件访问和操作&#xff1a; 软件可能会监控员工对文件的访问、打开、编辑、复制和移动操作。异常…

基于鸿蒙OS开发一个前端应用

创建JS工程&#xff1a;做鸿蒙应用开发到底学习些啥&#xff1f; 若首次打开DevEco Studio&#xff0c;请点击Create Project创建工程。如果已经打开了一个工程&#xff0c;请在菜单栏选择File > New > Create Project来创建一个新工程。选择HarmonyOS模板库&#xff0c…

【MYSQL】-表的约束

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树&#x1f388; &#x1f389;作者宣言&#xff1a;认真写好每一篇博客&#x1f4a4; &#x1f38a;作者gitee:gitee✨ &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 动态规划算法&#x1f384; 如 果 你 …

Redis管道

问题引出 Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket返回&#xff0c;通常以阻塞模式等待服务端响应。 2 服务端…

B (1038) : DS哈希查找—二次探测再散列

文章目录 一、题目描述二、输入与输出1.输入2.输出 三、参考代码 一、题目描述 定义哈希函数为H(key) key%11。输入表长&#xff08;大于、等于11&#xff09;&#xff0c;输入关键字集合&#xff0c;用二次探测再散列构建哈希表&#xff0c;并查找给定关键字。 二、输入与输…

用户规模破亿!基于文心一言的创新应用已超4000个

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

1.3MySQL中的自连接

自己的表和自己连接&#xff0c;核心&#xff1a;一张表拆为两张一样的表。 语法&#xff1a;select 字段列表 from 表 [as] 表别名1,表 [as] 表别名2 where 条件...; 关于怎样把一个表拆分成一个表&#xff0c;只要给它们分别取别名就行 categoryidpidcategoryname21信息…

Analytify Pro Google Analytics Goals Addon谷歌分析目标插件

Analytify Pro Google Analytics Goals Addon谷歌分析目标插件是一款极其巧妙且具有开创性的工具&#xff0c;它赋予用户细致跟踪和全面分析其网站性能的卓越能力。有了这个非凡的插件&#xff0c;个人可以毫不费力地建立并认真监控他们的Google Analytics目标&#xff0c;从而…

conda环境下Could not build wheels for dlib解决方法

1 问题描述 在安装模型运行的conda环境时&#xff0c;出现如下问题&#xff1a; Building wheels for collected packages: basicsr, face-alignment, dlib, ffmpy, filterpy, futureBuilding wheel for basicsr (setup.py) ... doneCreated wheel for basicsr: filenamebasi…

记录一下亿级别数据入库clickhouse

需求背景 公司的业务主要是广告数据归因的&#xff0c;每天的pv数据和加粉数据粗粗算一下&#xff0c;一天几千万上亿是有的。由于数据量大&#xff0c;客户在后台查询时间跨度比较大的数据时&#xff0c;查询效率就堪忧。因而将数据聚合后导到clickhouse进行存储&#xff0c;…

32阵元 MVDR和DREC DOA估计波束方向图对比

32阵元 MVDR和DREC DOA估计波束方向图对比 一、原理 MVDR原理&#xff1a;https://zhuanlan.zhihu.com/p/457528114 DREC原理&#xff08;无失真响应特征干扰相消器&#xff09;&#xff1a;http://radarst.ijournal.cn/html/2019/3/201903018.html 主要参数&#xff1a; 阵…

完全适配各类中小医院专科医院和诊所的云HIS系统源码【前端:Angular+Nginx ,后台:SpringBoot】

云HIS系统采用SaaS软件应用服务模式&#xff0c;提供软件应用服务多租户机制&#xff0c;实现一中心部署多机构使用。相对传统HIS单机构应用模式&#xff0c;它可灵活应对区域医疗、医疗集团、医联体、连锁诊所、单体医院等应用场景&#xff0c;并提升区域内应用的标准化与规范…

Java技术栈 —— Nginx的使用

Java技术栈 —— Nginx的使用 一、认识Nginx二、搭建Nginx环境2.1 在Ubuntu上安装Nginx 三、使用Nginx3.1 配置负载均衡(HTTP) 一、认识Nginx 企业需要运行多个相同的副本&#xff0c;并将负载分散在整个系统集群上&#xff0c;为了高性能的负载均衡&#xff0c;引入了Nginx代…

通过C++程序实现光驱的自动化刻录和读取

文章目录 ISO文件格式光盘的基本概念光盘种类特点DVDR光盘使用windows调用Linux调用Linux平台下用到的C库:读取设备驱动列表向光驱中写文件 数字存储媒体快速发展的今天&#xff0c;光驱的使用已经不像以前那样普及了。但是在数据备份、安装软件和操作系统、旧设备兼容等领域还…

PiflowX大数据流水线系统

PiflowX大数据流水线系统。支持分布式计算引擎flink和spark。以所见即所得的方式&#xff0c;实现大数据采集、处理、存储与分析流程化配置、运行与智能监控。 PiflowX基于Piflow&#xff08;PiFlow: 混合型科学大数据流水线系统&#xff0c;包含丰富的处理器组件&#xff0c;…

算法导论复习(七) 动态规划

动态规划一般用来求解最优化问题 设计一个动态规划算法一般有以下四步&#xff1a; 描述一个最优解的结构特征。递归地定义最优解的值。计算最优解的值&#xff0c;通常采用自底向上的方法。利用计算出的信息构造出一个最优解。 钢条切割问题 体现了动态规划的一个重要性质&a…