Python量化金融风险分析:一文全面掌握VaR计算

news2024/11/15 9:09:45

金融市场是一个复杂且多变的生态圈,涉及从经济数据到政治动态的各种影响因素。无论你身处何种角色——小投资者、企业财务,还是大型金融机构的资产经理,你都必须面对各种不确定性,例如股价波动、利率变动或突发事件如政治危机和自然灾害。

因此,量化风险评估不仅是一种科学需求,更是一种财务安全的基本保障。其中,Value at Risk(VaR)是一个广受欢迎的风险量化工具,能在特定置信水平和时间范围内,预测资产组合可能面临的最大潜在损失。

VaR不仅在资产管理和资本配置方面有广泛应用,也被用于评估市场风险、信贷风险和流动性风险。而计算VaR的方法也多种多样,从历史模拟法到蒙特卡洛模拟法,各有利弊。本文将详细介绍VaR的主要计算方法,并演示如何使用Python来实现这些方法,让你能更全面地掌握金融风险量化的核心技术。

VaR的计算方法

VaR是一个用于度量金融资产组合在一定置信水平和预定时间内潜在最大损失的度量指标。用数学语言来说,是随机变量 X(投资组合的收益或损失)的下分位数,即:

VaR 试图回答这样一个问题:在给定的置信水平(如95%或99%)和时间范围(如一天、一周、一个月等)内,资产组合可能面临的最大潜在损失是多少?如一个投资组合的一日99% VaR为100万元,这意味着在99%的情况下,该组合在一天内不会损失超过100万元。然而,这并不意味着该组合就绝对安全,因为还有1%的概率会造成超过100万元的损失。

====================================================================================================================================================================================

0****1

方差-协方差法

在方差-协方差法中,我们通常假设资产收益服从正态分布,且市场波动性和资产收益的相关性在短期内稳定。对于正态分布,其概率密度函数(pdf)和累积分布函数(cdf)有良好的数学性质。

对于标准正态分布,累积分布函数 F(x) 给出了随机变量 X 小于或等于 x 的概率。例如,F(0)=0.5 表示标准正态分布下随机变量小于或等于 0 的概率是 50%。VaR 通常表示为一个资产或投资组合在给定置信水平(通常为 95% 或 99%)和给定时间期限T 内可能会面临的最大预期损失。假设资产收益 R 服从均值为和标准差为的正态分布,则置信水平下的 VaR 可以表示为:

其中:是标准正态分布在置信水平下的 Z 分数。例如,对于 95% 的置信水平,通常取 1.645 或 1.65。是资产或投资组合的日度或年度波动性(标准差)。是用于调整时间期限的因子。如果是日波动性,而 T 是以日为单位,则

这个公式的推导基础是正态分布的数学性质。在正态分布中,和能够完全描述分布的形状。通过正态分布的逆累积分布函数(即分位数函数),我们可以找到在置信水平下对应的 Z 分数()。这个 VaR 公式非常直观且计算简单,但它依赖于正态分布假设,这一假设在现实金融市场中并不总是成立。因此,在使用方差-协方差法时,必须谨慎处理其局限性。

下面使用Python获取数据并使用方差-协方差法计算创业板指数的日收益率VaR值,代码如下:

import numpy as np  
import pandas as pd  
import qstock as qs  
import matplotlib.pyplot as plt  
from scipy.stats import norm  
import seaborn as sns  

#获取数据  
df=qs.get_data('cyb',start='20130101',end='20230913')  
returns=df.close.pct_change().dropna()  
qs.hist_kde(returns)  

# 计算标准差  
std_dev = returns.std()  
  
# 置信水平为 95%  
confidence_level = 0.95  
  
# 查找相应的Z分数  
z_score = norm.ppf(confidence_level)  
  
# 时间窗口(以天为单位)  
time_period = 5  # 一周有5个交易日  
  
# 计算一周的VaR  
VaR1= -z_score * std_dev * np.sqrt(time_period)  
  
print(f"在95%的置信水平下,一周的价值在险(VaR)为:{VaR1:.4f}")  

在95%的置信水平下,一周的价值在险(VaR)为:-0.0703  

在95%的置信水平下,一周的价值在险(VaR)为0.0703意味着,在所有可能的市场走势中,有95%的概率你在持有创业板指数的一周内最多会面临7.03%的资本损失。这是在假设模型和市场条件稳定的前提下的风险预测。

def plot_var(var):  
    plt.figure(figsize=(10,5))  
    sns.histplot(data=returns,kde=True, stat='count')  
    plt.text(var, 100, f'VAR:{round(var, 4)}',   
          horizontalalignment='right',  
          size=12,   
          color='navy')  
    rect=plt.Rectangle((var,0),-0.06,250,color = 'mistyrose')  
    plt.gca().add_patch(rect)  
    plt.show()  

plot_var(VaR1)  

0****2

历史模拟法

历史模拟法是一种简单直观的VaR计算方法,不需要对收益率的分布做任何假设。该方法直接使用过去的历史数据来估计未来的风险。步骤如下:

  • 收集历史数据: 从历史价格或收益率数据中进行抽样。

  • 排序数据: 将历史收益率数据从最小到最大进行排序。

  • 选择置信水平: 如置信水平是95%,则查找对应于最低的5%收益率的值。

在历史模拟法中,我们通常使用单日的收益率进行分析。然而,如果你想计算一个更长时间段(如一周)的VaR,有两个选择:(1)直接使用单日收益率来计算VaR,并假设这些收益率在你关心的时间段内(一周)是独立且相同分布的。这样你可以通过合适的数学方法(比如,乘以如果你假设收益率是正态分布的)来扩展到一周。但这样做有一个明显的缺点,即它不考虑可能存在的时间相关性和收益率分布的偏态等特点。(2)直接计算每一周的累积收益率,并在这个基础上进行VaR计算。这样做的好处是它能够更准确地反映多日内资产价值的变动,因为它考虑了多天收益率的复合效应。计算一周的累积收益率是为了更准确地捕捉一周内可能出现的收益率波动,这对于某些市场(特别是波动性很高或有明显时间序列相关性的市场)来说可能是更合适的。

下面使用第二种选择进行历史模拟法的计算,代码如下:

# 置信水平为 95%  
confidence_level = 0.95  
# 时间窗口(以天为单位)  
time_period = 5  # 一周有5个交易日  
# 计算一周的累积收益率  
cumulative_returns = (1 + returns).rolling(window=time_period).apply(np.prod) - 1  
# 计算在1 - 置信水平(这里是5%)处的分位数  
VaR2 = np.percentile(cumulative_returns.dropna(), 100 * (1 - confidence_level))  
print(f"在{confidence_level * 100}%的置信水平下,一周的价值在险(VaR)为:{VaR2:.4f}")  

在95.0%的置信水平下,一周的价值在险(VaR)为:-0.0654  

风险值-0.0654表示在 95% 的置信水平下,最大损失为 6.54%,或者损失超过 6.54% 的概率为 5%。可以这么理解,对于 100,000 的投资,我们有 95% 的把握最大损失为 6,540。

0****3

Bootstrap法

Bootstrap 方法类似于历史方法,但在这种情况下,我们对回报进行多次采样,如 100 次或 1000 次或更多次,计算 VaR,最后取平均 VaR。这类似于在数据科学空间中进行的重采样,其中数据集被多次重采样,模型被重新训练以预测值。

def calculate_bootstrap_VaR(returns, confidence_level=0.95,   
                            iterations=1000, time_period=5):  
    """  
    使用Bootstrap法计算VaR  
    参数:  
        returns (pd.Series or np.array): 收益率序列  
        confidence_level (float): 置信水平,取值范围在0到1之间  
        iterations (int): Bootstrap迭代次数  
        time_period (int): 考虑的时间周期(例如:5天表示一周)  
    返回:  
        VaR(float): 在给定置信水平下一周的VaR值  
    """  
    bootstrap_VaRs = []  # 存储Bootstrap VaR的结果  
  
    # 开始Bootstrap迭代  
    for i in range(iterations):  
        # 有放回地随机抽取样本  
        sample = np.random.choice(returns, size=time_period, replace=True)  
        # 计算一周的累积收益率  
        cumulative_return = np.prod(1 + sample) - 1  
        bootstrap_VaRs.append(cumulative_return)  
    # 计算VaR  
    bootstrap_VaRs = np.sort(bootstrap_VaRs)  
    VaR= np.percentile(bootstrap_VaRs, 100 * (1 - confidence_level))  
    return VaR  
  
VaR3 = calculate_bootstrap_VaR(returns)  
print(f"使用Bootstrap法,95%的置信水平的五日价值在险(VaR)为:{VaR3:.4f}")  

使用Bootstrap法,95%的置信水平的五日价值在险(VaR)为:-0.0642
  

0****4

蒙特卡洛模拟

蒙特卡洛模拟是一种通过模拟随机过程来估计某个变量的分布的方法。因此,蒙特卡洛方法通常涉及到根据某种概率模型生成数据,然后用这些生成的数据来估计分布。在VaR的计算中,这通常涉及假设资产收益率遵循某种分布(如正态分布),然后从该分布中随机抽样。

def simulate_values(returns, iterations=1000,n = 5,p=0.05):  
    mu=returns.mean()  
    sigma= returns.std()  
    try:  
        result = []        
        for i in range(iterations):  
            # 时间窗口(以天为单位)  
            # 计算一周的累积收益率  
            tmp_val = pd.Series(np.random.normal(mu, sigma, (len(returns))))   
            cum_ret = (1 + tmp_val).rolling(n  
                                ).apply(np.prod, raw=True) - 1  
            # 计算在1 - 置信水平(这里是5%)处的分位数  
            var = np.percentile(cum_ret.dropna(), p*100)  
            result.append(var)  
        return np.mean(result)  
    except Exception as e:  
        print(e)  
  
VaR4 = simulate_values(returns)  
print(f"使用蒙特卡洛模拟法,95%置信水平五日价值在险(VaR)为:{VaR4:.4f}")  

使用蒙特卡洛模拟法,95%置信水平五日价值在险(VaR)为:-0.0661  

值得注意的是,这个模型是基于日收益率服从正态分布的假设的,这一假设在实际应用中可能并不准确。因此,在使用这个模型时应谨慎,并可能需要对其进行进一步的检验和调整。

0****5

衰减因子法

衰减因子法(也被称为指数加权移动平均模型,EWMA)是一个金融时间序列模型,经常用于金融风险管理中。相较于简单的历史模拟法,它赋予近期的数据更高的权重,因此它可以更快地捕捉到市场的变动。

衰减因子的基本思想是近期的观测值比较重要,因此应当给予更高的权重。而较早之前的观测值逐渐“衰减”并被赋予较低的权重。公式如下:

其中,是时点 t 的波动率的估计,是时点 t-1 的收益率,是衰减因子(通常接近1,例如0.94或0.97)。一旦得到了波动率的估计,就可以使用正态分布假设来计算VaR。

def calculate_decay_factor_VaR(returns, lambda_factor=0.94,   
                    confidence_level=0.95, time_period=5):  
    """  
    使用衰减因子法计算VaR  
  
    参数:  
        returns (pd.Series or np.array): 收益率序列  
        lambda_factor (float): 衰减因子  
        confidence_level (float): 置信水平,取值范围在0到1之间  
        time_period (int): 考虑的时间周期(例如:5天表示一周)  
  
    返回:  
        VaR (float): 在给定置信水平下的VaR值  
    """  
    # 计算日波动率  
    variance = np.zeros_like(returns)  
    for t in range(1, len(returns)):  
        variance[t] = lambda_factor * variance[t-1] + \  
                   (1-lambda_factor) * returns[t-1]**2  
    volatility = np.sqrt(variance)  
  
    # 使用正态分布假设计算VaR  
    VaR = -norm.ppf(1-confidence_level) * volatility * np.sqrt(time_period)  
  
    return -VaR[-1]  # 返回最新的VaR值  
  
VaR5 = calculate_decay_factor_VaR(returns)  
print(f"使用衰减因子法,95%的置信水平一周VaR为:{VaR5:.4f}")  

使用衰减因子法,95%的置信水平一周VaR为:-0.0416  

注意,衰减因子法也是假设收益率是正态分布的,这可能不适用于所有金融资产。在实践中,金融资产的收益率可能会有厚尾或者偏度,需要更复杂的模型来处理。

0****6

GARCH模型

在金融风险管理中,广义自回归条件异方差(GARCH)模型用于捕捉金融时间序列波动性的复杂模型,与基础的EWMA模型相比,这些模型能更精确地捕捉金融资产收益率的动态特性。

GARCH模型使用了条件异方差的概念,可以用于预测波动率:

# 使用GARCH(1,1)模型  
from arch import arch_model  
#将收益率转为百分比  
garch_model = arch_model(returns*100, p=1, q=1)  
garch_fit = garch_model.fit(update_freq=5)  
forecast = garch_fit.forecast(start=0)  
  
# 获取最后一天的预测波动率  
final_volatility = np.sqrt(forecast.variance.values[-1,0])  
  
# 计算VaR  
VaR6 = norm.ppf(0.05) * final_volatility * np.sqrt(5)/100  # 5天,95%置信度  
print(f"使用GARCH方法,在95%的置信水平下,一周的价值在险(VaR)为:: {VaR6:.4f}")  

`Iteration:      5,   Func. Count:     35,   Neg. LLF: 7267535.843682719   Iteration:     10,   Func. Count:     64,   Neg. LLF: 5102.880767591566   Optimization terminated successfully    (Exit mode 0)               Current function value: 5102.879334090473               Iterations: 14               Function evaluations: 83               Gradient evaluations: 14   使用GARCH方法,在95%的置信水平下,一周的价值在险(VaR)为:: -0.0464`  

0****7

极值理论

极值理论(Extreme Value Theory, EVT)是一种统计学方法,专门用于研究随机变量分布的极端尾部行为。这一理论在金融、气象学、工程和其他多个领域有着广泛的应用,尤其在金融风险管理方面非常重要。在金融市场中,大多数分布的中心(即均值附近)的行为可以用常规的统计模型(如正态分布、对数正态分布等)进行描述,但这些模型往往不能准确捕捉分布尾部的极端事件。这些极端事件,虽然发生概率低,但一旦发生,其影响通常是巨大和灾难性的。

EVT 提供了一系列模型和方法,用于更准确地估计这些罕见但重要的极端事件。通过适当地建模和参数估计,EVT 可以用于计算价值在险(Value at Risk, VaR)、期望损失(Expected Shortfall)以及其他尾部风险度量。常用的 EVT 模型有广义极值分布(Generalized Extreme Value, GEV)和高阈值方法(Peaks Over Threshold, POT)。

from scipy.stats import genextreme as gev  
# 使用极端值分布(GEV)拟合数据尾部  
c, loc, scale = gev.fit(-returns[returns < np.percentile(returns, 5)])  
# 设置置信水平  
confidence_level = 0.95  
# 计算VaR  
VaR_1= -gev.ppf(confidence_level, c, loc, scale)  
print(f"在95%的置信水平下,一日在险价值(VaR)为:{VaR_1:.4f}")  

在95%的置信水平下,一日在险价值(VaR)为:-0.0835  

计算得到的一日VaR是0.0835,这意味着在95%的置信水平下,该资产一日内的最大预期损失不会超过8.35%。上述代码示例用于一日VaR的计算。对于多日VaR,你可以进行适当的缩放。

需要注意的是,这个简化方法是在一些假设下得到的,如金融资产收益率的独立性和相同分布等。如果这些假设不成立,那么这个简化公式的准确性就可能受到影响。

使用之前的代码片段,五日VaR的计算如下:

# 计算 5 日的 VaR  
VaR7 = VaR_1 * np.sqrt(5)  
print(f"在95置信水平下,资产五日价值在险(VaR)为:{VaR7:.4f}")  

在95置信水平下,资产五日价值在险(VaR)为:-0.1867  

var=[VaR1,VaR2,VaR3,VaR4,VaR5,VaR6,VaR7]  
index=['方差-协方差法','历史模拟法','Bootstrap法',  
 '蒙特卡洛模拟','衰减因子法','GARCH模型','极值理论']  
pd.Series(var,index=index).round(4)  

方差-协方差法      -0.0703  
历史模拟法        -0.0654  
Bootstrap法   -0.0642  
蒙特卡洛模拟       -0.0661  
衰减因子法        -0.0416  
GARCH模型      -0.0464  
极值理论         -0.1867  
dtype: float64  

计算金融资产在险价值(VaR)时,采用不同方法可能得到不同的 VaR 值。例如,在给出的数据中,方差-协方差法、历史模拟法、Bootstrap法 和蒙特卡洛模拟产生的 VaR 值都在 -0.0642 到 -0.0703 的范围内,相对接近。这些方法通常用于描述一般的市场风险,并且每种方法都有其优缺点,如方差-协方差法的计算相对简单但依赖正态分布假设,而蒙特卡洛模拟更灵活但计算复杂。相对来说,衰减因子法(-0.0416)和 GARCH模型(-0.0464)给出了较低的 VaR 值,这可能反映了这些方法更多地考虑了近期的市场波动性。最引人注目的是,极值理论给出了明显更高的 VaR 值(-0.1867),这可能意味着该方法在预测罕见的市场极端事件方面具有更高的灵敏度。总体而言,每种方法都有其适用场景和局限性,选择哪一种取决于你的风险管理需求和对市场态势的判断。有时候,综合使用多种方法能够提供更全面和多角度的风险评估。

条件VaR(CVaR)

期望损失(Expected Shortfall, ES)也被称为条件VaR(Conditional VaR, CVaR)。与VaR只告诉我们在某个置信水平下可能面临的最大损失不同,ES(或CVaR)更进一步地衡量,当这种极端损失发生时,我们应预期多大的损失。

ES(CVaR)的计算公式是:

# 置信水平,例如95%  
alpha = 0.95  
  
# 首先计算VaR  
VaR = -np.percentile(returns, 100 * (1 - alpha))  
  
# 然后计算CVaR  
# 只考虑那些小于VaR(即更大损失)的收益率  
tail_losses = returns[returns < -VaR]  
CVaR = -tail_losses.mean()  
  
# 打印结果  
print(f"在95%的置信水平下,VaR(价值在险)为:{VaR:.4f}")  
print(f"在95%的置信水平下,CVaR(条件价值在险)或ES(期望损失)为:{CVaR:.4f}")  

在95%的置信水平下,VaR(价值在险)为:0.0291  
在95%的置信水平下,CVaR(条件价值在险)或ES(期望损失)为:0.0464  

VaR告诉我们,在给定的置信水平(这里是95%)下,预期的最大单日损失不会超过这个VaR值(如0.029)。CVaR或ES告诉我们,当损失超过VaR时,预期的平均损失将是CVaR(0.0464)。注意,这里使用历史模拟法来估计VaR和CVaR,这是一种非参数方法。在实际应用中,可能还需要考虑更多因素,如市场流动性、交易成本等。

结语

在险价值(Value-at-Risk, VaR)是一个广泛使用的风险管理工具,它提供了一种量化潜在损失的方法,并在置信水平和时间窗口内给出了最坏的预期损失。然而,VaR并不是万能的。虽然它能提供关于潜在损失的有用信息,但它也有局限性,如无法完全捕捉尾部风险,也不提供超出VaR水平后的损失大小。因此,在实践中,VaR通常与其他风险度量指标,如条件VaR(CVaR)或期望损失(ES)、CoVaR等,一同使用以获得更全面的风险评估。

使用VaR模型时,特别需要注意的是模型假设、数据质量和置信水平的选择,因为这些因素都会影响VaR的准确性和可靠性。同时,金融机构和个人投资者应当持续监控和调整其风险模型,以适应市场环境的变化。

---------------------------END---------------------------

题外话

在这里插入图片描述

感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

一、Python所有方向的学习路线

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。

img
img

二、Python必备开发工具

工具都帮大家整理好了,安装就可直接上手!img

三、最新Python学习笔记

当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。

img

四、Python视频合集

观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。

img

五、实战案例

纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

img

六、面试宝典

在这里插入图片描述

在这里插入图片描述

简历模板在这里插入图片描述

👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)

若有侵权,请联系删除

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

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

相关文章

R23C02版本正式发布 | 更智能、更稳定的菊风视频能力平台

近年来&#xff0c;音视频技术正在深入影响各行业服务效能提升&#xff0c;远程音视频服务也在逐渐发展成为对客的重要渠道。菊风作为以实时音视频技术为核心的创新服务商&#xff0c;一直坚持推进技术和产品的更新迭代&#xff0c;致力于孵化符合行业化发展需求的解决方案&…

电路中VCC VDD VSS VEE GND的含义

在电路中&#xff0c;芯片引脚经常会出现VCC&#xff0c;VDD&#xff0c;VSS&#xff0c;VEE和GND这些标示。 其中VCC一般表示通用芯片的电源引脚&#xff0c;比如一些模拟运放的正电源引脚&#xff0c;74系列数字芯片的电源引脚&#xff0c;VCC一般接相应的正电源电压。 VDD一…

HTTPS的传输过程

加密分为两种方式一种是对称加密&#xff0c;一种是非对称加密。 在对称加密算法中&#xff0c;加密和解密使用的密钥是相同的。也就是说&#xff0c;加密和解密使用的是同一个密钥。因此&#xff0c;对称加密算法要保证安全性的话&#xff0c;密钥要做好保密。只能让使用的人…

sudo+vim+g++/gcc+makefile

目录 一、信任表中加入指定的普通用户&#xff08;使其能使用sudo&#xff09; 二、vim的使用 &#xff08;一&#xff09;基本概念 1. 正常/普通/命令模式(Normal mode) 2. 插入模式(Insert mode) 3. 末行模式(last line mode) &#xff08;二&#xff09;vim正常模式…

Spring注解家族介绍:@RestController

前言&#xff1a; Spring Boot可以说是当前JAVA最为重要的一个框架&#xff0c;而Spring Boot的基石Spring中有着丰富的注解&#xff0c;因此我们会利用几篇文章来讲解我目前学到的各种注解&#xff0c;因此本类型文章的篇幅会比较短&#xff0c;主要着重于介绍各个注解。 目录…

Python-Jenkins 在 Jenkins 中的应用

Author&#xff1a;rab Python 版本&#xff1a;3.9 Jenkins 版本&#xff1a;2.409 官方文档&#xff1a;https://python-jenkins.readthedocs.io/en/latest/ 目录 前言一、案例1.1 管理 Jenkins Version1.2 管理 Jenkins Job1.2.1 普通创建 Job1.2.2 获取当前用户的所有 J…

C【程序环境和预处理】

1. 程序的翻译环境和执行环境 2. 详解编译链接 2.1 翻译环境 2.2 编译本身也分为几个阶段 sum.c int g_val 2016; void print(const char *str) {printf("%s\n", str); } test.c #include <stdio.h> int main() {extern void print(char *str);extern int…

气传导耳机品牌排行榜前十名,好用气传导耳机推荐

​随着人们对听力保护的重视&#xff0c;气传导耳机逐渐成为耳机市场的新宠。气传导耳机采用不入耳设计&#xff0c;让您你享受音乐的同时&#xff0c;也能保护你的听力&#xff0c;听感更自然真实通透。下面我将为大家推荐几款值得购买的气传导耳机&#xff0c;让你找到最适合…

网工内推 | 网络安全工程师,上市公司,13薪,食宿有补贴

01 苏州奖多多科技有限公司 招聘岗位&#xff1a;网络安全工程师&#xff08;安服渗透&#xff09; 职责描述&#xff1a; 1、负责客户网络安全攻击入侵事件溯源分析、处置等工作&#xff1b; 2、根据攻击告警/入侵事件&#xff0c;进行取证调查&#xff0c;攻击溯源反制&…

FPGA----VCU128的DDR4无法使用问题(全网唯一)

1、在Vivado 2019.1版本中使用DDR4的IP核会遇到如下图所示的错误&#xff0c;即便过了implementation生成了bit&#xff0c;DDR4也无法正常启动。 2、解决办法&#xff0c;上xilinx社区搜一下就知道了 AMD Customer Communityhttps://support.xilinx.com/s/article/69035?lan…

如何使用Semaphore和CompletableFuture搭配实现控制线程并发数量并等待所有线程执行完成之后在执行其它操作

代码示例&#xff1a; public static void main(String[] args) throws InterruptedException {ExecutorService executor Executors.newFixedThreadPool(4);Semaphore semaphore new Semaphore(2);try {CompletableFuture<String> futureA CompletableFuture.supplyA…

SpringMvc决战-【SpringMVC之自定义注解】

目录 一、前言 1.1.什么是注解 1.2.注解的用处 1.3.注解的原理 二.注解父类 1.注解包括那些 2.JDK基本注解 3. JDK元注解 4.自定义注解 5.如何使用自定义注解&#xff08;包括&#xff1a;注解标记【没有任何东西】&#xff0c;元数据注解&#xff09;&#xff1f; 三…

opencv dnn模块 示例(16) 目标检测 object_detection 之 yolov4

博客【opencv dnn模块 示例(3) 目标检测 object_detection (2) YOLO object detection】 测试了yolov3 及之前系列的模型&#xff0c;有在博客【opencv dnn模块 示例(15) opencv4.2版本dnn支持cuda加速&#xff08;vs2015异常解决&#xff09;】 说明了如何使用dnn模块进行cuda…

深入JVM:探索Java虚拟机

文章目录 1. JVM简介1.1 定义与核心作用1.2 JVM的跨平台特性 2. JVM内部结构深度探索2.1 类加载机制2.1.1 双亲委派模型2.1.2 OSGI框架2.1.3 类加载器分类 2.2 JVM运行时数据区2.2.1 程序计数器2.2.2 本地方法栈2.2.3 Java虚拟机栈 2.2.4 堆2.2.5 元数据区 2.3 JVM内存区域的性…

企业架构LNMP学习笔记48

数据结构类型操作&#xff1a; 数据结构&#xff1a;存储数据的方式 数据类型 算法&#xff1a;取数据的方式&#xff0c;代码就把数据进行组合&#xff0c;计算、存储、取出。 排序算法&#xff1a;冒泡排序、堆排序 二分。 key&#xff1a; key的命名规则不同于一般语言…

DataX 概述、部署、数据同步运用示例

文章目录 什么是 DataX&#xff1f;DataX 设计框架DataX 核心架构DataX 部署DataX 数据同步&#xff08;MySQL —> HDFS&#xff09; 什么是 DataX&#xff1f; DataX 是阿里巴巴集团开源的、通用的数据抽取工具&#xff0c;广泛使用的离线数据同步工具/平台。它设计用于支…

数据结构——查找(二叉排序树)

文章目录 前言一、二叉排序树构造二叉排序树步骤构造二叉排序树步骤图二叉排序树的查找二叉排序树查找递归算法二叉排序树查找非递归算法 二叉排序树的插入二叉排序树插入结点——递归算法二叉排序树插入结点——非递归算法 二叉排序树的删除 总结 前言 二叉排序树查找定义 二…

Qt的ui文件不能简单复制

在使用vsQt开发时&#xff0c;直接复制另外一个widget类的ui文件&#xff0c;简单改名成当前类对应的ui文件&#xff0c;会导致编译出错。尽可能使用添加的Qt class自带的ui文件&#xff0c;因为ui文件的配置文件中有许多与当前类相关的字符串&#xff0c;简单复制容易报错。

一年一度的中秋节马上又要到了,给你的浏览器也来点氛围感吧

说在前面 一年一度的中秋节马上又要到了&#xff0c;给你的浏览器也来点氛围感吧 &#x1f315;&#x1f315;&#x1f315; 插件设计 效果 首先我们应该要先确定一下我们想要实现的效果是怎样的&#xff0c;如上图&#xff0c;我们希望在页面上鼠标点击的时候会在点击区域随…

【送书活动】用“价值”的视角来看安全:《构建新型网络形态下的网络空间安全体系》

文章目录 每日一句正能量前言本书概况赠书活动目录 每日一句正能量 成功与失败&#xff0c;幸福与不幸&#xff0c;在各自心里的定义都不会相同。 前言 过去&#xff0c;安全从未如此复杂&#xff1b; 现在&#xff0c;安全从未如此重要&#xff1b; 未来&#xff0c;安全更需如…