当前位置: 首页 > news >正文

5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)

目录

    • 0. 承前
    • 1. AI金融智能体
      • 1.1 What is AI金融智能体
      • 1.2 Why is AI金融智能体
      • 1.3 How to AI金融智能体
    • 2. 数据要素&计算流程
      • 2.1 参数集设置
      • 2.2 数据获取&预处理
      • 2.3 收益率计算
      • 2.4 因子构建与预期收益率计算
      • 2.5 协方差矩阵计算
      • 2.6 投资组合优化
      • 2.7 持仓筛选
      • 2.8 AI金融智能体调仓函数
    • 3. 汇总代码
    • 4. 反思
      • 4.1 不足之处
      • 4.2 提升思路
    • 5. 启后

0. 承前

本篇博文是对上一篇文章,链接:
4. 马科维茨资产组合模型+Fama-French五因子优化方案(理论+Python实战)
资产权重进行AI干预
本文首先使用Fama-French五因子计算出资产组合模型权重,再把权重结合政策信息输入AI模型,目的是

  • 在金融工程中,实现AI功能在金融模型的落地的尝试;
  • AI模型对政策信息描述内容,情绪分析等进行分析,实现政策信息对金融模型的主动影响

本文主要要素:

  • 马科维茨资产组合模型;
  • Fama-French五因子模型预期收益率;
  • AI金融智能体(通义千问:qwen-max),提示词工程;
  • 政策信息通过AI转化影响预期收益率。

如果想更加全面清晰地了解金融资产组合模型进化论的体系架构,可参考:
0. 金融资产组合模型进化全图鉴

1. AI金融智能体

1.1 What is AI金融智能体

AI金融智能体是指利用人工智能技术,特别是机器学习、深度学习和自然语言处理等先进技术,来模拟人类分析师的行为,以执行复杂的金融分析任务的软件。本文主要是通过提示词工程,结合政策信息,给予AI一定的范围权限去影响资产组合权重,属于金融工程构建的尝试性实验。

1.2 Why is AI金融智能体

  • 自动接入全网,实时搜索并分析海量数据:AI金融智能体能够无缝连接互联网,迅速处理和解析大量的金融市场信息,为用户提供即时的洞察和支持。

  • 拥有远超人类的计算能力,揭示潜在的市场盲点:凭借其卓越的计算力,AI智能体可以深入挖掘数据,识别出那些基于常识可能被忽视的市场机会或风险。

  • 顺应技术潮流,推动更多AI工具在金融领域的实际应用:随着技术的进步,AI在金融行业的落地已成为必然趋势。金融机构需积极探索和实施更多的AI解决方案,以保持竞争力和服务创新。

1.3 How to AI金融智能体

  • 参数集设置

    1. ts.set_token:设置Tushare的API访问令牌
    2. industry:选择目标行业,如"银行"
    3. end_date:回测结束日期,格式为’YYYYMMDD’
    4. years:回测年限,默认5年
    5. risk_free_rate:无风险利率,默认0.03
    6. top_holdings:投资组合持仓数量,默认10只股票
    7. index_code:市场指数代码,默认’000300.SH’
    8. api_key:通义千问API
    9. character:AI人设提示词工程
    10. policy_info:政策信息(5条)
  • 数据准备

    1. 股票行业数据:通过tushare获取指定行业的股票列表
    2. 历史价格数据:获取指定时间段内的股票日线数据
    3. 市场指数数据:获取指定时间段内的市场指数数据
    4. 因子数据:获取市值(Size)和账面市值比(B/M)数据
    5. 财务数据:获取ROE和资产增长率数据
    6. 无风险利率:设定无风险利率参数
  • 计算流程

    1. 数据获取:获取股票、市场指数和因子数据
    2. 收益率计算:计算月度对数收益率
    3. 因子构建:构建SMB、HML、RMW和CMA因子
    4. 因子载荷计算:计算每只股票对五个因子的敏感度
    5. FF5预期收益:使用五因子模型计算预期收益率
    6. 组合优化:最大化夏普比率得到最优权重
    7. 持仓筛选:选取权重最大的N只股票并归一化
    8. AI函数:结合权重数据、政策信息、提示词工程,对权重实现智能调整

2. 数据要素&计算流程

2.1 参数集设置

设置模型所需的基本参数,包括数据获取、回测区间和优化约束等。

# 参数集
ts.set_token('token')
pro = ts.pro_api()
industry = '银行'
end_date = '20240101'
years = 5   # 数据时长
risk_free_rate = 0.03  # 无风险利率参数
top_holdings = 10      # 持仓数量参数
index_code = '000300.SH'  # 市场指数代码参数
api_key='sk-api_key'	# 通义千问API# AI人设提示词工程
character = f'''
你是一名专业的金融数据与政策分析师,擅长解读金融市场动态和政策导向,并据此调整资产组合的权重分布,以优化投资策略。你的主要任务是对给定的资产组合进行权重调整,确保:
1. 权重之和精确为1;
2. 每个资产调整后的权重只能在原有基础上增减最多10%;
3. 每个资产调整完毕后,如果权重之和不等于1,则归一化使权重之和精确为1;
4. 数据对应的日期是{end_date},在思考过程中,切勿根据该日期之后的信息进行思考。
5. 输出的数据格式需与输入保持一致,仅提供数据而不做额外解释;当你接收到具体的资产组合及其权重时,请根据最新的金融数据和政策信息对其进行合理调整。
'''# 通过工作流获取的政策信息
policy_info = '''
| 日期 | 政策简述 |
|------|----------|
| 2023-12-29 | 央行发布《关于优化商业银行存款利率监管有关事项的通知》,取消定期存款利率浮动上限,允许银行自主协调存贷款利率 |
| 2023-11-17 | 央行、银保监会联合发布《关于做好当前商业银行房地产贷款投放管理的通知》,优化房地产信贷政策,支持刚性和改善性住房需求 |
| 2023-09-25 | 银保监会发布《关于进一步加强银行业金融机构流动性风险管理的通知》,要求银行加强流动性风险管理,完善风险监测预警机制 |
| 2023-08-31 | 央行、银保监会宣布下调全国首套住房贷款利率下限,各地可自主决定下调幅度,二套房贷款利率政策与首套相同 |
| 2023-07-21 | 十四届全国人大常委会第四次会议表决通过《中华人民共和国金融稳定法》,建立健全金融风险防范化解制度体系 |
'''

2.2 数据获取&预处理

获取股票、市场指数、因子数据和财务数据,并进行必要的数据清洗和格式转换。

def get_industry_stocks(industry):"""获取指定行业的股票列表"""df = pro.stock_basic(fields=["ts_code", "name", "industry"])industry_stocks = df[df["industry"]==industry].copy()industry_stocks.sort_values(by='ts_code', inplace=True)industry_stocks.reset_index(drop=True, inplace=True)return industry_stocks['ts_code'].tolist()def get_data(code_list, end_date, years):"""获取指定行业名称的历史收盘价数据"""ts_code_list = code_listend_date_dt = datetime.strptime(end_date, '%Y%m%d')start_date_dt = end_date_dt - timedelta(days=years*365)start_date = start_date_dt.strftime('%Y%m%d')all_data = []for stock in ts_code_list:df = pro.daily(ts_code=stock, start_date=start_date, end_date=end_date)all_data.append(df)combined_df = pd.concat(all_data).sort_values(by=['ts_code', 'trade_date'])combined_df.reset_index(drop=True, inplace=True)combined_df.rename(columns={'trade_date': 'date'}, inplace=True)return combined_dfdef get_market_data(index_code='000300.SH', start_date=None, end_date=None):"""获取市场指数数据用于计算贝塔"""df_market = pro.index_daily(ts_code=index_code, start_date=start_date, end_date=end_date,fields=['trade_date', 'close'])df_market['date'] = pd.to_datetime(df_market['trade_date'])df_market.set_index('date', inplace=True)df_market = df_market.sort_index()monthly_last_close = df_market['close'].resample('M').last()monthly_log_returns = np.log(monthly_last_close).diff().dropna()return monthly_log_returnsdef get_factor_data(stock_codes, start_date=None, end_date=None):"""获取指定股票的因子数据(市值和PB)"""all_factor_data = []for stock in stock_codes:try:df = pro.daily_basic(ts_code=stock,start_date=start_date,end_date=end_date,fields=['ts_code', 'trade_date', 'total_mv', 'pb'])all_factor_data.append(df)except Exception as e:print(f"获取股票 {stock} 的因子数据失败: {str(e)}")continuefactor_data = pd.concat(all_factor_data, ignore_index=True)factor_data['trade_date'] = pd.to_datetime(factor_data['trade_date'])return factor_datadef get_fina_data(stock_codes, start_date=None, end_date=None):"""获取指定股票的财务指标数据(ROE和资产增长率)"""all_fina_data = []for stock in stock_codes:try:df = pro.fina_indicator(ts_code=stock,start_date=start_date,end_date=end_date,fields=['ts_code', 'end_date', 'roe_dt', 'assets_yoy', 'update_flag'])all_fina_data.append(df)except Exception as e:print(f"获取股票 {stock} 的财务数据失败: {str(e)}")continue# 合并数据fina_data = pd.concat(all_fina_data, ignore_index=True)# 处理update_flag,保留最新数据fina_data = (fina_data.groupby(['ts_code', 'end_date']).agg({'roe_dt': 'first', 'assets_yoy': 'first','update_flag': 'max'}).reset_index())# 将end_date转换为datetimefina_data['end_date'] = pd.to_datetime(fina_data['end_date'])# 创建季度到月度的映射monthly_data = []for _, row in fina_data.iterrows():quarter_end = row['end_date']if quarter_end.month == 3:  # Q1months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]elif quarter_end.month == 6:  # Q2months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]elif quarter_end.month == 9:  # Q3months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]else:  # Q4months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]for month in months:monthly_data.append({'ts_code': row['ts_code'],'trade_date': month,'roe_dt': row['roe_dt'],'assets_yoy': row['assets_yoy']})monthly_df = pd.DataFrame(monthly_data)return monthly_df

2.3 收益率计算

计算月度对数收益率,为后续的因子构建和优化计算做准备。

def calculate_monthly_log_returns(df):"""计算每月的对数收益率"""df['date'] = pd.to_datetime(df['date'])monthly_last_close = df.groupby(['ts_code', pd.Grouper(key='date', freq='M')])['close'].last().unstack(level=-1)monthly_log_returns = np.log(monthly_last_close).diff().dropna()return monthly_log_returns.T

2.4 因子构建与预期收益率计算

构建SMB、HML、RMW和CMA因子,并使用五因子模型计算预期收益率。

def calculate_expected_returns(monthly_log_returns):"""使用Fama-French五因子模型计算各股票的预期收益率"""start_date = monthly_log_returns.index.min().strftime('%Y%m%d')end_date = monthly_log_returns.index.max().strftime('%Y%m%d')# 获取财务数据时,将start_date往前推一个季度,以确保有完整的季度数据fina_start_date = (datetime.strptime(start_date, '%Y%m%d') - timedelta(days=90)).strftime('%Y%m%d')# 获取市场收益率market_returns = get_market_data(index_code, start_date, end_date)# 获取股票的市值和PB数据stock_data = get_factor_data(monthly_log_returns.columns.tolist(),start_date,end_date)# 获取财务指标数据,使用提前的start_datefina_data = get_fina_data(monthly_log_returns.columns.tolist(),fina_start_date,end_date)# 确保所有数据的日期对齐aligned_dates = monthly_log_returns.index.intersection(market_returns.index)market_returns = market_returns[aligned_dates]stock_returns = monthly_log_returns.loc[aligned_dates].copy()  # 使用copy()避免SettingWithCopyWarningdef calculate_size_factor(date):date_data = stock_data[stock_data['trade_date'].dt.to_period('M') == date.to_period('M')]median_mv = date_data['total_mv'].median()small_returns = stock_returns.loc[date, date_data[date_data['total_mv'] <= median_mv]['ts_code']]big_returns = stock_returns.loc[date, date_data[date_data['total_mv'] > median_mv]['ts_code']]return small_returns.mean() - big_returns.mean()def calculate_value_factor(date):date_data = stock_data[stock_data['trade_date'].dt.to_period('M') == date.to_period('M')]# 创建date_data的副本并计算bm_ratiodate_data = date_data.copy()date_data.loc[:, 'bm_ratio'] = 1 / date_data['pb']median_bm = date_data['bm_ratio'].median()high_returns = stock_returns.loc[date, date_data[date_data['bm_ratio'] > median_bm]['ts_code']]low_returns = stock_returns.loc[date, date_data[date_data['bm_ratio'] <= median_bm]['ts_code']]return high_returns.mean() - low_returns.mean()def calculate_profitability_factor(date):date_data = fina_data[fina_data['trade_date'].dt.to_period('M') == date.to_period('M')]median_roe = date_data['roe_dt'].median()robust_returns = stock_returns.loc[date, date_data[date_data['roe_dt'] > median_roe]['ts_code']]weak_returns = stock_returns.loc[date, date_data[date_data['roe_dt'] <= median_roe]['ts_code']]return robust_returns.mean() - weak_returns.mean()def calculate_investment_factor(date):date_data = fina_data[fina_data['trade_date'].dt.to_period('M') == date.to_period('M')]median_growth = date_data['assets_yoy'].median()conservative_returns = stock_returns.loc[date, date_data[date_data['assets_yoy'] <= median_growth]['ts_code']]aggressive_returns = stock_returns.loc[date, date_data[date_data['assets_yoy'] > median_growth]['ts_code']]return conservative_returns.mean() - aggressive_returns.mean()# 计算每个月的因子收益smb_factor = pd.Series([calculate_size_factor(date) for date in aligned_dates], index=aligned_dates)hml_factor = pd.Series([calculate_value_factor(date) for date in aligned_dates], index=aligned_dates)rmw_factor = pd.Series([calculate_profitability_factor(date) for date in aligned_dates], index=aligned_dates)cma_factor = pd.Series([calculate_investment_factor(date) for date in aligned_dates], index=aligned_dates)# 使用OLS回归计算每个股票的因子载荷factor_loadings = {}for stock in stock_returns.columns:X = sm.add_constant(pd.concat([market_returns - risk_free_rate,smb_factor,hml_factor,rmw_factor,cma_factor], axis=1))y = stock_returns[stock] - risk_free_ratemodel = sm.OLS(y, X).fit()factor_loadings[stock] = model.params[1:]# 计算因子风险溢价market_premium = market_returns.mean() - risk_free_ratesmb_premium = smb_factor.mean()hml_premium = hml_factor.mean()rmw_premium = rmw_factor.mean()cma_premium = cma_factor.mean()# 使用FF5模型计算预期收益率expected_returns = pd.Series({stock: (risk_free_rate + loadings.iloc[0] * market_premium +loadings.iloc[1] * smb_premium + loadings.iloc[2] * hml_premium +loadings.iloc[3] * rmw_premium +loadings.iloc[4] * cma_premium)for stock, loadings in factor_loadings.items()})return expected_returns

2.5 协方差矩阵计算

计算收益率的协方差矩阵,用于评估资产间的相关性和波动性。

def calculate_covariance_matrix(monthly_log_returns):"""计算收益率协方差矩阵"""return monthly_log_returns.cov()

2.6 投资组合优化

通过最大化夏普比率来寻找最优权重配置。

def max_sharpe_ratio(mean_returns, cov_matrix, risk_free_rate):"""计算最大夏普比率的投资组合权重"""num_assets = len(mean_returns)args = (mean_returns, cov_matrix, risk_free_rate)constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})bounds = tuple((0, 1) for asset in range(num_assets))result = minimize(negative_sharpe_ratio, num_assets*[1./num_assets], args=args,method='SLSQP', bounds=bounds, constraints=constraints)return result.x

2.7 持仓筛选

选取权重最大的N只股票并重新归一化权重。

def calculate_top_holdings_weights(optimal_weights, monthly_log_returns_columns, top_n):"""计算前N大持仓的权重占比"""result_dict = {asset: weight for asset, weight in zip(monthly_log_returns_columns, optimal_weights)}top_n_holdings = sorted(result_dict.items(), key=lambda item: item[1], reverse=True)[:top_n]top_n_sum = sum(value for _, value in top_n_holdings)updated_result = {key: value / top_n_sum for key, value in top_n_holdings}return updated_result

2.8 AI金融智能体调仓函数

def get_ai_weights(character, policy_info, updated_result, api_key):# 定义发送对话内容messages = [{'role': 'system', 'content': character},{'role': 'user', 'content': policy_info},{'role': 'user', 'content': json.dumps(updated_result, ensure_ascii=False)}]response = dashscope.Generation.call(api_key=api_key,model="qwen-max",messages=messages,result_format='message',enable_search=True,top_p=0.01)# 提取content内容content = response['output']['choices'][0]['message']['content']# 将JSON字符串转换为Python字典portfolio_weights = json.loads(content)# 对AI输出结果进行归一化weights_sum = sum(portfolio_weights.values())portfolio_weights = {key: value/weights_sum for key, value in portfolio_weights.items()}# 将字典中的值修改为6位小数portfolio_weights = {k: round(v, 6) for k, v in portfolio_weights.items()}return portfolio_weights

3. 汇总代码

以下即为全量代码,修改参数集中内容即可跑出个性化数据。

import tushare as ts
import pandas as pd
import numpy as np
from datetime import datetime, timedelta
from scipy.optimize import minimize
import backtrader as bt
import statsmodels.api as sm
import os
import json
import dashscope# 参数集##############################################################################
ts.set_token('token')
pro = ts.pro_api()
industry = '银行'
end_date = '20240101'
years = 5   # 数据时长
risk_free_rate = 0.03  # 无风险利率参数
top_holdings = 10      # 持仓数量参数
index_code = '000300.SH'  # 市场指数代码参数
api_key='sk-api_key'	# 通义千问API# AI人设提示词工程
character = f'''
你是一名专业的金融数据与政策分析师,擅长解读金融市场动态和政策导向,并据此调整资产组合的权重分布,以优化投资策略。你的主要任务是对给定的资产组合进行权重调整,确保:
1. 权重之和精确为1;
2. 每个资产调整后的权重只能在原有基础上增减最多10%;
3. 每个资产调整完毕后,如果权重之和不等于1,则归一化使权重之和精确为1;
4. 数据对应的日期是{end_date},在思考过程中,切勿根据该日期之后的信息进行思考。
5. 输出的数据格式需与输入保持一致,仅提供数据而不做额外解释;当你接收到具体的资产组合及其权重时,请根据最新的金融数据和政策信息对其进行合理调整。
'''# 通过工作流获取的政策信息
policy_info = '''
| 日期 | 政策简述 |
|------|----------|
| 2023-12-29 | 央行发布《关于优化商业银行存款利率监管有关事项的通知》,取消定期存款利率浮动上限,允许银行自主协调存贷款利率 |
| 2023-11-17 | 央行、银保监会联合发布《关于做好当前商业银行房地产贷款投放管理的通知》,优化房地产信贷政策,支持刚性和改善性住房需求 |
| 2023-09-25 | 银保监会发布《关于进一步加强银行业金融机构流动性风险管理的通知》,要求银行加强流动性风险管理,完善风险监测预警机制 |
| 2023-08-31 | 央行、银保监会宣布下调全国首套住房贷款利率下限,各地可自主决定下调幅度,二套房贷款利率政策与首套相同 |
| 2023-07-21 | 十四届全国人大常委会第四次会议表决通过《中华人民共和国金融稳定法》,建立健全金融风险防范化解制度体系 |
'''
# 参数集##############################################################################def get_industry_stocks(industry):"""获取指定行业的股票列表"""df = pro.stock_basic(fields=["ts_code", "name", "industry"])industry_stocks = df[df["industry"]==industry].copy()industry_stocks.sort_values(by='ts_code', inplace=True)industry_stocks.reset_index(drop=True, inplace=True)return industry_stocks['ts_code'].tolist()def get_data(code_list, end_date, years):"""获取指定行业名称的历史收盘价数据"""ts_code_list = code_listend_date_dt = datetime.strptime(end_date, '%Y%m%d')start_date_dt = end_date_dt - timedelta(days=years*365)start_date = start_date_dt.strftime('%Y%m%d')all_data = []for stock in ts_code_list:df = pro.daily(ts_code=stock, start_date=start_date, end_date=end_date)all_data.append(df)combined_df = pd.concat(all_data).sort_values(by=['ts_code', 'trade_date'])combined_df.reset_index(drop=True, inplace=True)combined_df.rename(columns={'trade_date': 'date'}, inplace=True)return combined_dfdef get_market_data(index_code='000300.SH', start_date=None, end_date=None):"""获取市场指数数据用于计算贝塔"""df_market = pro.index_daily(ts_code=index_code, start_date=start_date, end_date=end_date,fields=['trade_date', 'close'])df_market['date'] = pd.to_datetime(df_market['trade_date'])df_market.set_index('date', inplace=True)df_market = df_market.sort_index()monthly_last_close = df_market['close'].resample('M').last()monthly_log_returns = np.log(monthly_last_close).diff().dropna()return monthly_log_returnsdef get_factor_data(stock_codes, start_date=None, end_date=None):"""获取指定股票的因子数据(市值和PB)"""all_factor_data = []for stock in stock_codes:try:df = pro.daily_basic(ts_code=stock,start_date=start_date,end_date=end_date,fields=['ts_code', 'trade_date', 'total_mv', 'pb'])all_factor_data.append(df)except Exception as e:print(f"获取股票 {stock} 的因子数据失败: {str(e)}")continuefactor_data = pd.concat(all_factor_data, ignore_index=True)factor_data['trade_date'] = pd.to_datetime(factor_data['trade_date'])return factor_datadef get_fina_data(stock_codes, start_date=None, end_date=None):"""获取指定股票的财务指标数据(ROE和资产增长率)"""all_fina_data = []for stock in stock_codes:try:df = pro.fina_indicator(ts_code=stock,start_date=start_date,end_date=end_date,fields=['ts_code', 'end_date', 'roe_dt', 'assets_yoy', 'update_flag'])all_fina_data.append(df)except Exception as e:print(f"获取股票 {stock} 的财务数据失败: {str(e)}")continue# 合并数据fina_data = pd.concat(all_fina_data, ignore_index=True)# 处理update_flag,保留最新数据fina_data = (fina_data.groupby(['ts_code', 'end_date']).agg({'roe_dt': 'first', 'assets_yoy': 'first','update_flag': 'max'}).reset_index())# 将end_date转换为datetimefina_data['end_date'] = pd.to_datetime(fina_data['end_date'])# 创建季度到月度的映射monthly_data = []for _, row in fina_data.iterrows():quarter_end = row['end_date']if quarter_end.month == 3:  # Q1months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]elif quarter_end.month == 6:  # Q2months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]elif quarter_end.month == 9:  # Q3months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]else:  # Q4months = [quarter_end + pd.DateOffset(months=i) for i in range(1, 4)]for month in months:monthly_data.append({'ts_code': row['ts_code'],'trade_date': month,'roe_dt': row['roe_dt'],'assets_yoy': row['assets_yoy']})monthly_df = pd.DataFrame(monthly_data)return monthly_dfdef calculate_monthly_log_returns(df):"""计算每月的对数收益率"""df['date'] = pd.to_datetime(df['date'])monthly_last_close = df.groupby(['ts_code', pd.Grouper(key='date', freq='M')])['close'].last().unstack(level=-1)monthly_log_returns = np.log(monthly_last_close).diff().dropna()return monthly_log_returns.Tdef calculate_expected_returns(monthly_log_returns):"""使用Fama-French五因子模型计算各股票的预期收益率"""start_date = monthly_log_returns.index.min().strftime('%Y%m%d')end_date = monthly_log_returns.index.max().strftime('%Y%m%d')# 获取财务数据时,将start_date往前推一个季度,以确保有完整的季度数据fina_start_date = (datetime.strptime(start_date, '%Y%m%d') - timedelta(days=90)).strftime('%Y%m%d')# 获取市场收益率market_returns = get_market_data(index_code, start_date, end_date)# 获取股票的市值和PB数据stock_data = get_factor_data(monthly_log_returns.columns.tolist(),start_date,end_date)# 获取财务指标数据,使用提前的start_datefina_data = get_fina_data(monthly_log_returns.columns.tolist(),fina_start_date,end_date)# 确保所有数据的日期对齐aligned_dates = monthly_log_returns.index.intersection(market_returns.index)market_returns = market_returns[aligned_dates]stock_returns = monthly_log_returns.loc[aligned_dates].copy()  # 使用copy()避免SettingWithCopyWarningdef calculate_size_factor(date):date_data = stock_data[stock_data['trade_date'].dt.to_period('M') == date.to_period('M')]median_mv = date_data['total_mv'].median()small_returns = stock_returns.loc[date, date_data[date_data['total_mv'] <= median_mv]['ts_code']]big_returns = stock_returns.loc[date, date_data[date_data['total_mv'] > median_mv]['ts_code']]return small_returns.mean() - big_returns.mean()def calculate_value_factor(date):date_data = stock_data[stock_data['trade_date'].dt.to_period('M') == date.to_period('M')]# 创建date_data的副本并计算bm_ratiodate_data = date_data.copy()date_data.loc[:, 'bm_ratio'] = 1 / date_data['pb']median_bm = date_data['bm_ratio'].median()high_returns = stock_returns.loc[date, date_data[date_data['bm_ratio'] > median_bm]['ts_code']]low_returns = stock_returns.loc[date, date_data[date_data['bm_ratio'] <= median_bm]['ts_code']]return high_returns.mean() - low_returns.mean()def calculate_profitability_factor(date):date_data = fina_data[fina_data['trade_date'].dt.to_period('M') == date.to_period('M')]median_roe = date_data['roe_dt'].median()robust_returns = stock_returns.loc[date, date_data[date_data['roe_dt'] > median_roe]['ts_code']]weak_returns = stock_returns.loc[date, date_data[date_data['roe_dt'] <= median_roe]['ts_code']]return robust_returns.mean() - weak_returns.mean()def calculate_investment_factor(date):date_data = fina_data[fina_data['trade_date'].dt.to_period('M') == date.to_period('M')]median_growth = date_data['assets_yoy'].median()conservative_returns = stock_returns.loc[date, date_data[date_data['assets_yoy'] <= median_growth]['ts_code']]aggressive_returns = stock_returns.loc[date, date_data[date_data['assets_yoy'] > median_growth]['ts_code']]return conservative_returns.mean() - aggressive_returns.mean()# 计算每个月的因子收益smb_factor = pd.Series([calculate_size_factor(date) for date in aligned_dates], index=aligned_dates)hml_factor = pd.Series([calculate_value_factor(date) for date in aligned_dates], index=aligned_dates)rmw_factor = pd.Series([calculate_profitability_factor(date) for date in aligned_dates], index=aligned_dates)cma_factor = pd.Series([calculate_investment_factor(date) for date in aligned_dates], index=aligned_dates)# 使用OLS回归计算每个股票的因子载荷factor_loadings = {}for stock in stock_returns.columns:X = sm.add_constant(pd.concat([market_returns - risk_free_rate,smb_factor,hml_factor,rmw_factor,cma_factor], axis=1))y = stock_returns[stock] - risk_free_ratemodel = sm.OLS(y, X).fit()factor_loadings[stock] = model.params[1:]# 计算因子风险溢价market_premium = market_returns.mean() - risk_free_ratesmb_premium = smb_factor.mean()hml_premium = hml_factor.mean()rmw_premium = rmw_factor.mean()cma_premium = cma_factor.mean()# 使用FF5模型计算预期收益率expected_returns = pd.Series({stock: (risk_free_rate + loadings.iloc[0] * market_premium +loadings.iloc[1] * smb_premium + loadings.iloc[2] * hml_premium +loadings.iloc[3] * rmw_premium +loadings.iloc[4] * cma_premium)for stock, loadings in factor_loadings.items()})return expected_returnsdef calculate_covariance_matrix(monthly_log_returns):"""计算收益率协方差矩阵"""return monthly_log_returns.cov()def portfolio_performance(weights, mean_returns, cov_matrix):"""计算投资组合的表现"""returns = np.sum(mean_returns * weights) std_dev = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))return returns, std_devdef negative_sharpe_ratio(weights, mean_returns, cov_matrix, risk_free_rate):"""计算负夏普比率"""p_ret, p_std = portfolio_performance(weights, mean_returns, cov_matrix)sharpe_ratio = (p_ret - risk_free_rate) / p_stdreturn -sharpe_ratiodef max_sharpe_ratio(mean_returns, cov_matrix, risk_free_rate):"""计算最大夏普比率的投资组合权重"""num_assets = len(mean_returns)args = (mean_returns, cov_matrix, risk_free_rate)constraints = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})bounds = tuple((0, 1) for asset in range(num_assets))result = minimize(negative_sharpe_ratio, num_assets*[1./num_assets], args=args,method='SLSQP', bounds=bounds, constraints=constraints)return result.xdef calculate_top_holdings_weights(optimal_weights, monthly_log_returns_columns, top_n):"""计算前N大持仓的权重占比"""result_dict = {asset: weight for asset, weight in zip(monthly_log_returns_columns, optimal_weights)}top_n_holdings = sorted(result_dict.items(), key=lambda item: item[1], reverse=True)[:top_n]top_n_sum = sum(value for _, value in top_n_holdings)updated_result = {key: value / top_n_sum for key, value in top_n_holdings}return updated_resultdef get_ai_weights(character, policy_info, updated_result, api_key):# 定义发送对话内容messages = [{'role': 'system', 'content': character},{'role': 'user', 'content': policy_info},{'role': 'user', 'content': json.dumps(updated_result, ensure_ascii=False)}]response = dashscope.Generation.call(api_key=api_key,model="qwen-max",messages=messages,result_format='message',enable_search=True,top_p=0.01)# 提取content内容content = response['output']['choices'][0]['message']['content']# 将JSON字符串转换为Python字典portfolio_weights = json.loads(content)# 对AI输出结果进行归一化weights_sum = sum(portfolio_weights.values())portfolio_weights = {key: value/weights_sum for key, value in portfolio_weights.items()}# 将字典中的值修改为6位小数portfolio_weights = {k: round(v, 6) for k, v in portfolio_weights.items()}return portfolio_weightsdef main():# 获取数据code_list = get_industry_stocks(industry)df = get_data(code_list, end_date, years)# 计算每月的对数收益率monthly_log_returns = calculate_monthly_log_returns(df)# 使用FF5模型计算预期收益率mean_returns = calculate_expected_returns(monthly_log_returns)# 计算收益率协方差矩阵cov_matrix = calculate_covariance_matrix(monthly_log_returns)# 优化权重optimal_weights = max_sharpe_ratio(mean_returns, cov_matrix, risk_free_rate)# 计算前N大持仓权重updated_result = calculate_top_holdings_weights(optimal_weights, monthly_log_returns.columns, top_holdings)# 计算AI调仓后的持仓权重updated_result = get_ai_weights(character, policy_info, updated_result, api_key)# 打印更新后的资产占比print(f"\n{end_date}最优资产前{top_holdings}占比:")print(updated_result)if __name__ == "__main__":main()

运行结果:

AI金融智能体调仓前权重:
在这里插入图片描述

股票代码占比
601398.SH0.16318772568631026
601328.SH0.16177476392789242
600919.SH0.12936894301756055
600036.SH0.10747174637443846
601169.SH0.0958427702817229
600016.SH0.09012906474680284
601166.SH0.08768928377548085
601288.SH0.06538512327994642
600908.SH0.05559150377594274
600926.SH0.043559075133902475

AI金融智能体调仓后权重:

{'601398.SH': 0.163025, '601328.SH': 0.161623, '600919.SH': 0.129252, '600036.SH': 0.107372, '601169.SH': 0.095764, 
'600016.SH': 0.090046, '601166.SH': 0.087606, '601288.SH': 0.065323, '600908.SH': 0.055541, '600926.SH': 0.044449}
股票代码占比
601398.SH0.163025
601328.SH0.161623
600919.SH0.129252
600036.SH0.107372
601169.SH0.095764
600016.SH0.090046
601166.SH0.087606
601288.SH0.065323
600908.SH0.055541
600926.SH0.044449

可见,AI金融智能体通过对政策信息的了解,加大对银行业投资的信心,特别是对大型国有银行和部分地方性银行。这种调整反映了AI对于市场动态的理解以及对未来收益预期的优化。
我们后验的经验也证明:在2024年银行行业是一个值得投资的行业,如果在20240101投资银行行业,将会获得不俗的收益。

4. 反思

4.1 不足之处

  1. 政策信息获取:获取政策信息方案仍为半手动
  2. AI逻辑缜密度:AI可能未能完全按照提示词工程执行

4.2 提升思路

  1. 更换AI智能体:使用由幻方量化开发的DeepSeek-V3 模型
  2. 工作流接入金融工程内部,实现真正全自动

5. 启后

  • 优化,下一篇文章将会尝试使用由幻方量化开发的DeepSeek_V3模型:,可参考下一篇文章:
    6. 马科维茨资产组合模型+政策意图AI金融智能体(DeepSeek-V3)增强方案(理论+Python实战)

  • 量化回测实现,可参考下一篇文章:
    pass

相关文章:

5. 马科维茨资产组合模型+政策意图AI金融智能体(Qwen-Max)增强方案(理论+Python实战)

目录 0. 承前1. AI金融智能体1.1 What is AI金融智能体1.2 Why is AI金融智能体1.3 How to AI金融智能体 2. 数据要素&计算流程2.1 参数集设置2.2 数据获取&预处理2.3 收益率计算2.4 因子构建与预期收益率计算2.5 协方差矩阵计算2.6 投资组合优化2.7 持仓筛选2.8 AI金融…...

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础

嵌入式知识点总结 ARM体系与架构 专题提升(一)-硬件基础 目录 1.NAND FLASH 和NOR FLASH异同 ? 2.CPU,MPU,MCU,SOC,SOPC联系与差别? 3.什么是交叉编译&#xff1f; 4.为什么要交叉编译&#xff1f; 5.描述一下嵌入式基于ROM的运行方式和基于RAM的运行方式有什么区别? 1…...

thinkphp8在使用apidoc时, 4层的接口会有问题 解决办法

thinkphp8 4层的接口会有问题, 比如这样的接口 /adminapi/notice/announcements/lists, 应该换成 /adminapi/notice.announcements/lists 这样才行, 有没有人处理过? 实际上在官网的帮助里有描述 自动生成的url不对&#xff1f; | Apidoc // config/apidoc.php //... auto_url…...

【jmeter】下载及使用教程【mac】

1.安装java 打开 Java 官方下载网站https://www.oracle.com/java/technologies/downloads/选择您想要下载的 Java 版本&#xff0c;下载以 .dmg 结尾的安装包&#xff0c;注意 JMeter 需要 Java 8下载后打开安装包点击“安装”按钮即可 2.下载jmeter 打开 Apache JMeter 官方…...

C# ASP.NET MVC项目内使用ApiController

1.在App_Start文件夹新建WebApiConfig.cs文件&#xff0c;建立webApi路由的注册方法。 using System.Web.Http;namespace PrivilegeManager {public class WebApiConfig{public static void Register(HttpConfiguration config){config.MapHttpAttributeRoutes();config.Route…...

Langchain+FastApi+Vue前后端Ai对话(超详细)

一、引入 首先可以先看下作者的文章 FastApi相关文章&#xff1a;创建最简单FastApi的项目Vue相关文章&#xff1a;最简单的aixos二次封装Langchain相关文章&#xff1a;如何使用LangSmith跟踪deepseek模型 二、后端搭建 1 项目文件结构 routers&#xff1a;存放api接口se…...

【电脑无法通过鼠标和键盘唤醒应该怎么办】

【电脑无法通过鼠标和键盘唤醒应该怎么办】 方法一(有时候不起作用):方法二(方法一无效时,使用方法二): 方法一(有时候不起作用): 方法二(方法一无效时,使用方法二):...

OpenCV相机标定与3D重建(65)对图像点进行去畸变处理函数undistortPoints()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从观测到的点坐标计算理想点坐标。 该函数类似于 undistort 和 initUndistortRectifyMap&#xff0c;但它操作的是稀疏点集而不是光栅图像。此外…...

Logo语言的函数实现

Logo语言的函数实现 引言 Logo语言是一种教育性编程语言&#xff0c;最初由西摩尔派普特&#xff08;Seymour Papert&#xff09;在1960年代开发。它以“海龟图形”&#xff08;Turtle Graphics&#xff09;而闻名&#xff0c;通过简单的命令控制一只“海龟”在屏幕上绘制图形…...

前沿技术对比:大模型技术为什么发展远快于区块链技术,中英对照解释

文章目录 前言1、技术复杂性与成熟度 / Technical Complexity and Maturity2.、应用场景与行业需求 / Application Scenarios and Industry Demand3、监管与法律问题 / Regulatory and Legal Issues4、去中心化与网络效应 / Decentralization and Network Effects5、能源消耗与…...

Java设计模式 九 桥接模式 (Bridge Pattern)

桥接模式 (Bridge Pattern) 桥接模式是一种结构型设计模式&#xff0c;它的核心思想是将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。这种模式通过组合而不是继承的方式来扩展功能&#xff0c;从而减少类之间的耦合度。 1. 模式结构 桥接模式的结构包括以下角色&…...

stm8s单片机(二)外部中断实验

中断优先级 stm8的中断优先级不是固定不变的&#xff0c;stm8的中断分为硬件优先级与软件优先级&#xff1b;当多个中断发生时&#xff0c;cpu会先响应软件优先级高的中断&#xff0c;若软件优先级相同会先响应硬件优先级高的&#xff1b; 其中软件优先级有四个 /*** brief …...

计算机网络 (53)互联网使用的安全协议

一、SSL/TLS协议 概述&#xff1a; SSL&#xff08;Secure Sockets Layer&#xff09;安全套接层和TLS&#xff08;Transport Layer Security&#xff09;传输层安全协议是工作在OSI模型应用层的安全协议。SSL由Netscape于1994年开发&#xff0c;广泛应用于基于万维网的各种网络…...

数学基础 --线性代数之理解矩阵乘法

理解矩阵乘法的解析 矩阵乘法&#xff08;Matrix Multiplication&#xff09;是线性代数中的核心操作之一。在数学、几何和工程实际中&#xff0c;它不仅是一种代数运算规则&#xff0c;还承载着丰富的几何和映射意义。本文将从多个角度深入解析矩阵乘法&#xff0c;帮助读者理…...

数学规划问题2 .有代码(非线性规划模型,最大最小化模型,多目标规划模型)

非线性规划模型 FIrst:转化为标准型 在matlab中求非线性规划的函数 练习题: 典型例题: 最大最小化模型 核心思想&#xff1a; matlab的模型求解 经典例题: 多目标规划模型 基本概念 求解思路: 模型构建步骤 经典例题: 非线性规划模型 非线性规划&#xff08;Nonl…...

jax 和 jaxlib 的 cuda 版本安装

笔者花费时间才在 Ubuntu 20.04 适配上 jax 和 jaxlib 的 cuda 版本安装&#xff0c;以及 chex 版本。 版本展示 本人版本展示 jax0.4.27 &#xff0c;jaxlib0.4.27cuda12.cudnn89&#xff0c;chex0.1.86。 安装过程 cuda 以及环境变量配置过程 首先安装cuda12.4和cudnn8.9&…...

Spring Boot MyBatis Plus 版本兼容问题(记录)

Spring Boot & MyBatis Plus 版本兼容问题&#xff08;Invalid value type for attribute factoryBeanObjectType: java.lang.String&#xff09; 问题描述问题排查1. 检查 MapperScan 的路径2. 项目中没有配置 FactoryBean3. 检查 Spring 和 MyBatis Plus 版本兼容性 解决…...

Ubuntu如何安装redis服务?

环境&#xff1a; Ubuntu22.04 WSL2 问题描述&#xff1a; 如何安装redis服务&#xff1f; 解决方案&#xff1a; 1.在 Linux 上&#xff08;如 Ubuntu/Debian&#xff09;安装 1.通过包管理工具安装 Redis 服务器&#xff1a; sudo apt update sudo apt install redis…...

FFmpeg 头文件完美翻译之 libavcodec 模块

前言 众所周知&#xff0c;FFmpeg 的代码开发上手难度较高&#xff0c;源于官方提供的文档很少有包含代码教程相关的。要想熟练掌握 FFmpeg 的代码库开发&#xff0c;需要借助它的头文件&#xff0c;FFmpeg 把很多代码库教程都写在头文件里面。因此&#xff0c;熟读头文件的内…...

设计模式的艺术-单一职责原则

1.基础知识 是最简单的面向对象设计原则&#xff0c;它用于控制类的粒度大小。 一个类只负责一个功能领域中的相应职责。 单一职责原则的核心思想是&#xff1a;一个类不能太“累”&#xff01;在软件系统中&#xff0c;一个类&#xff08;大到模块&#xff0c;小到方法&…...

MySQL主从配置

一、 主从原理 MySQL 主从同步是一种数据库复制技术&#xff0c;它通过将主服务器上的数据更改复制到一个或多个从服务器&#xff0c;实现数据的自动同步。主从同步的核心原理是将主服务器上的二进制日志复制到从服务器&#xff0c;并在从服务器上执行这些日志中的操作。 二、主…...

【Unity3D实现雨下在窗户上的效果】

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、原理👉三、使用步骤3-1、shader代码纹理映射数学运算和函数的运用特效算法的实现高效的性能优化👉壁纸分享👉总结👉前言 想要好看的效果肯定是要用shader实现啦,为什么呢? 因为Shade…...

k8s资源预留

k8s资源预留 https://kubernetes.io/zh-cn/docs/tasks/administer-cluster/reserve-compute-resources/ vim /var/lib/kubelet/config.yamlenforceNodeAllocatable: - pods kubeReserved: # 配置 kube 资源预留cpu: 500mmemory: 1Giephemeral-storage: 1Gi systemReserved: #…...

云计算与物联网技术的融合应用(在工业、农业、家居、医疗、环境、城市等整理较全)

摘要 为生产领域带来更加全面和深入的变革。通过云计算平台对物联网数据进行处理和分析&#xff0c;企业可以实现对生产过程的更加精细化的管理和控制。 1. 智能生产调度 通过云计算和物联网技术的融合应用&#xff0c;企业可以实现对生产线上各个环节的实时监控和数据分析。…...

【深度学习】2.视觉问题与得分函数

计算机视觉任务 可以通过神经网络搜索是什么类别的动物。 图像实际就是含有数值的三维矩阵。 像素值从0-255可以表示亮度递增的参数。数字越大&#xff0c;像素点越亮。 最后的3表示三个颜色通道&#xff0c;常见的如JPG、RGB等。 现实场景容易发生各种遮蔽现象。 计算机判断…...

Node.js——express中间件(全局中间件、路由中间件、静态资源中间件)

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…...

安卓动态设置Unity图形API

命令行方式 Unity图像api设置为自动,安卓动态设置Vulkan、OpenGLES Unity设置 安卓设置 创建自定义活动并将其设置为应用程序入口点。 在自定义活动中,覆盖字符串UnityPlayerActivity。updateunitycommandlineararguments (String cmdLine)方法。 在该方法中,将cmdLine…...

VMware虚拟机迁移到阿里云

VMware虚拟机迁移到阿里云是一个涉及多个步骤的过程&#xff0c;具体如下&#xff1a; 使用阿里云的服务器迁移中心&#xff08;SMC&#xff09;进行P2V或V2V迁移。如果是小型应用&#xff0c;可以通过制作镜像文件然后上传至阿里云OSS&#xff0c;并基于该镜像创建ECS实例。对…...

2025年1月22日(什么是扫频)

扫频&#xff08;Sweep Frequency&#xff09;是一种信号处理技术&#xff0c;通常用于系统识别、频率响应分析和特性测试。它通过发送一个频率逐渐变化的信号&#xff08;通常是正弦波或线性调频信号&#xff09;来激励系统&#xff0c;然后测量系统的响应。这种方法可以帮助我…...

前端开发中的模拟后端与MVVM架构实践[特殊字符][特殊字符][特殊字符]

平时&#xff0c;后端可能不能及时给接口给前端进行数据调用和读取。这时候&#xff0c;前端想到进行模拟后端接口。本文将介绍如何通过vite-plugin-mock插件模拟后端接口&#xff0c;并探讨MVVM架构在前端开发中的应用。此外&#xff0c;我们还将讨论Vue2与Vue3的区别&#xf…...

Win10系统部署RabbitMQ Server

文章目录 版本说明依赖安装添加Erlang环境变量验证Erlang安装 RabbitMQ Server安装解压启动查看RabbitMQ插件安装rabbitmq_management插件再次启动设置RabbitMQ为系统服务 版本说明 ErlangRabbitMQ27.24.0.5 可以在Erlang官网和RabbitMQ官网下载安装包&#xff0c;安装已下载…...

Java web与Java中的Servlet

一。前言 Java语言大多用于开发web系统的后端&#xff0c;也就是我们是的B/S架构。通过浏览器一个URL去访问系统的后端资源和逻辑。 当我在代码里看到这个类HttpServletRequest 时 让我想到了Servlet&#xff0c;Servlet看上去多么像是Java的一个普通类&#xff0c;但是它确实…...

Web开发 -前端部分-CSS3新特性

1 CSS概述 2 CSS3私有前缀 3 CSS3的长度单位 代码实现&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...

2025年PHP面试宝典,技术总结。

面试是进入职场的第一道坎&#xff0c;因为我本身学校太一般的问题在面试中遇到了各种不爽&#xff0c;和那些高学历的相比自己真是信心大跌。我面试的方向是php开发工程师&#xff0c;主要做网站后台、APP接口等。下面是我这段时间总结的面试方面的常考常问的知识点&#xff0…...

idea plugin插件开发——入门级教程(IntelliJ IDEA Plugin)

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;idea plugin插件开发——入门级教程&#xff08;IntelliJ IDEA Plugin&#xff09;-CSDN博客 目录 前言 官方 官方文档 代码示例 开发前必读 Intellij、Gradle、JDK 版本关系 plu…...

node.js 文件操作

在 Node.js 中&#xff0c;文件操作主要通过内置的 fs&#xff08;File System&#xff09;模块来实现。 1. 读取文件 const fs require("fs");// 异步读取文件fs.readFile("example.txt", "utf8", (err, data) > {if (err) {console.erro…...

模拟算法习题篇

在算法中&#xff0c;模拟是一种通过计算机程序来模拟现实世界中的过程或系统行为的方法。它的核心思想是根据题目给定的规则和逻辑&#xff0c;按照步骤细致地重现事件的发展流程&#xff0c;从而获得最终结果。 解题时如何使用模拟算法&#xff1a; 理解题目规则&#xff1a;…...

opencv对直方图的计算和绘制

【欢迎关注编码小哥&#xff0c;学习更多实用的编程方法和技巧】 1、直方图的计算 cv::calcHist 是 OpenCV 中用于计算图像直方图的函数。它可以处理多通道图像&#xff0c;并通过指定图像、通道、掩膜、直方图大小和范围等参数来生成直方图。 函数原型 void cv::calcHist(…...

暑期实习准备:C语言(持续更新)

1.局部变量和全局变量 局部变量的作用域是在变量所在的局部范围&#xff0c;全局变量的作用域是整个工程&#xff1b;局部变量的生命周期是作用域内&#xff0c;全局变量的生命周期是整个程序的生命周期&#xff0c;当两者命名冲突时&#xff0c;优先使用的是局部变量。 2.C语言…...

一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk

文章目录 一文大白话讲清楚webpack基本使用——11——chunkIds和runtimeChunk1. 建议按文章顺序从头看&#xff0c;一看到底&#xff0c;豁然开朗2. 啥是chunkIds3.怎么使用chunkIds4. 啥是runtimeChunk5. 怎么使用runtimeChunk 一文大白话讲清楚webpack基本使用——11——chun…...

linux下使用脚本实现对进程的内存占用自动化监测

linux系统中常用cat /proc/{pid}/status和pmap -x {pid}来监测某个进程的内存资源占用情况。 其中注意各参数的含义如下&#xff1a; VmSize&#xff1a;表示进程当前虚拟内存大小 VmPeak&#xff1a;表示进程所占用最大虚拟内存大小 VmRSS&#xff1a;表示进程当前占用物理内…...

MyBatis Plus 的 InnerInterceptor:更轻量级的 SQL 拦截器

在 Spring Boot 项目中使用 MyBatis Plus 时&#xff0c;你可能会遇到 InnerInterceptor 这个概念。 InnerInterceptor 是 MyBatis Plus 提供的一种轻量级 SQL 拦截器&#xff0c;它与传统的 MyBatis 拦截器&#xff08;Interceptor&#xff09;有所不同&#xff0c;具有更简单…...

[STM32 HAL库]串口中断编程思路

一、前言 最近在准备蓝桥杯比赛&#xff08;嵌入式赛道&#xff09;&#xff0c;研究了以下串口空闲中断DMA接收不定长的数据&#xff0c;感觉这个方法的接收效率很高&#xff0c;十分好用。方法配置都成功了&#xff0c;但是有一个点需要进行考虑&#xff0c;就是一般我们需要…...

会议签到系统的架构和实现

会议签到系统的架构和实现 摘要:通过定制安卓会议机开机APP呈现签到界面&#xff0c;并且通过W/B结构采集管理签到信息&#xff0c;实现会议签到的功能。为达到此目标本文将探讨使用Redis提供后台数据支持&#xff1b;使用SocketIo处理适时消息&#xff1b;使用Flask进行原型开…...

复位信号的同步与释放(同步复位、异步复位、异步复位同步释放)

文章目录 背景前言一、复位信号的同步与释放1.1 同步复位1.1.1 综述1.1.2 优缺点 1.2 recovery time和removal time1.3 异步复位1.3.1 综述1.3.2 优缺点 1.4 同步复位 与 异步复位1.5 异步复位、同步释放1.5.1 总述1.5.2 机理1.5.3 复位网络 二、思考与补充2.1 复…...

TL3562/3568移植无锡沐创N500L-AM4驱动进内核源码,报错及其解决方案

前言 创龙官方提供的资料无锡沐创N500L-AM4驱动是rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz&#xff1b;无锡沐创官方&#xff0c;截止目前&#xff0c;最新驱动是rnpgbe-0.2.3-f26b9a4.tar.gz。考虑到开发的稳妥性&#xff0c;先选用创龙尝试过的rnpgbe-0.1.0.rc60-dd9f3cf.tar.gz来移…...

埃氏算法C++实现: 快速输出质数( 素数 )

目录 1.简介 算法原理 算法特点 应用场景 2.一般求素数方法 3.埃氏算法求素数 3.1.无动态分配 3.2.有动态分配 1.简介 ‌埃氏算法&#xff08;Eratosthenes Sieve&#xff09;‌&#xff0c;全称为埃拉托斯特尼筛法&#xff0c;是一种由古希腊数学家埃拉托斯特尼在公元…...

Kubernetes 集群中安装和配置 Kubernetes Dashboard

前言 上篇成功部署Kubernetes集群后&#xff0c;为了方便管理和监控集群资源&#xff0c;安装Kubernetes Dashboard显得尤为重要。Kubernetes Dashboard 是一个通用的、基于 Web 的 UI&#xff0c;旨在让用户轻松地部署容器化应用到 Kubernetes 集群&#xff0c;并对这些应用进…...

力扣-数组-414 第三大的数

解析 先利用set去重&#xff0c;然后用逆向遍历找到第三大的数 代码 class Solution { public:int thirdMax(vector<int>& nums) {set<int> numsToset;for(int i 0; i<nums.size(); i){numsToset.insert(nums[i]);}int index;if(numsToset.size() > …...

python实现答题游戏

有这样一个需求&#xff1a;使用python实现一个游戏&#xff0c;一共有10个问题&#xff0c;依次回答每个问题&#xff0c;每个用户可以输入问题的答案&#xff0c;但是互相不能看到&#xff0c;有一个管理员可以看到所有人的答案&#xff0c;并且当所有人都填写完成后可以公布…...