回归的风险

回归的风险

 

陈能技

2007-10-11

 

原文:The Risk of Regression – Alan S.Koch

 

“但是,它仅仅是一个很小很小的改动!我们怎么会预先想到它会造成这么大的问题?”

 

怎么会,确实!

 

回归(向后追溯)是软件系统的现实生活。即使之前是很好地工作的,但是不能确保它会在最近的“很小”的改变后也能工作。是的,模块设计和充分的系统架构可以减少这种问题的出现,但是不能完全消除。

 

回归测试是永远都需要的。但是我们在非常有限的时间里测试一个“很小”的改动,我们怎么进行充分的回归测试呢?我们怎么知道查找哪些方面?我们怎么减少出现问题的风险?

 

回归的问题

回归的问题根源是软件系统的内在复杂性。随着系统的复杂性的增加,更改产生难以预见的影响的可能性也增加了。即使开发人员使用最新的技术也不可避免。

 

随着系统构建的时间越长回归的问题也会增多。在几年后,可能已经被更改了很多次,通常是由那些原本不在开发组中的人来修改的。即使这些人努力理解底层的设计和结构,更改与原本设计主题思想非常匹配也是很难做到的。这样的更改越多,系统变得越复杂直到变得非常脆弱。

 

脆弱的软件就像脆弱的金属。被弯曲和扭转了这么多次以致你对它做的任何事都可能导致它的破裂。当一个软件系统变得脆弱,人们实际上会很害怕改变它。他们知道他们做的任何事情都可能导致更多的问题。易脆(不可维护)是旧的软件系统被替换的主要原因之一。

 

回归测试的困难

因为任何系统都需要回归,所以回归测试非常重要。但是谁有时间对每一个小的更改都完全地重新测试系统呢?对一个只是1周多点的开发,我们肯定不能承受1个月的完全重新测试整个系统。我们有一个星期的时间测试就很幸运了;更通常的情况是,只允许几天的时间。

 

既然完全的重测不可能,我们必须决定如何使用很好的时间来进行测试。但是我们怎么知道怎么做呢?我们怎么预见这些不可预见的问题呢?(就像老板要求你把这些会出现的意外情况做个列表一样可笑!)

 

现实中,我们总是有测试压力,即使当测试一个新的系统时。总是不够时间去完成所有应该完成的测试,因此我们必须充分利用可用的时间,用最好的方法去测试。我们在这种情况下我们必须使用“基于风险的测试方法”

 

基于风险的测试

基于风险的测试的本质是我们评估系统不同部分蕴含的风险,并专注于我们的测试在那些最高风险的地方。这个方法可能让系统的某些部分缺乏充分的测试,甚至完全不测,但是它保证了这样做的风险是最低的。

 

“风险”对于测试与风险对于其他任何情况是一样的。为了评估风险,我们必须认识到它有两个截然不同的方面:可能性和影响。

 

-          “可能性”是可能出错的机会。不考虑影响程度,仅仅考虑出现问题的机会有多大。

-          “影响”是确实出错后造成的影响程度。不考虑可能性,仅仅考虑出现的问题的情况会有多糟糕。

 

假设一个会计系统,我们更改了分期付款的利息。更改会用3天的时间,我们会用2天的时间来测试。因为我们不能在两天时间内完全充分测试这个会计系统,我们需要评估所作的更改给其它系统部分带来的风险。

 

-          分期付款模块的功能会很可能出错,因为这些是更改的部分。它们同时是对系统来说相对影响重大的部分,因为它们影响收入。既是高可能性的,又是高影响程度的,意味着系统的这部分必须投入充分的测试。

-          应收款模块拥有中等程度的错误可能性,因为改变的功能是这个模块的一个紧密组成部分。因为收款模块影响收入,因此出错的影响程度是高的。所以收款模块也需要投入足够的测试关注,因为它拥有中-高程度的风险。

-          总账模块拥有低程度的错误可能性。但是如果错误会对公司有重大的影响。因此总账模块拥有低-高程度的风险。

-          最后,应付款出错的可能性很低,因为更改功能与它没有什么关系。而且这个模块错误后的影响最多也是中等程度的。因此拥有低-中程度风险,不需要投入太多的测试。

 

使用这些风险信息,我们可能选择这样分配我们的测试:

-          50%的测试专注于新改的分期付款模块

-          30%的测试放在应收款模块

-          15%的测试放在总账模块

-          5%的测试时间放在应付款模块

 

使用基于风险的测试策略不能保证没有回归。但是会显著地减少对一个大系统进行的小更改的风险。

 

 
在股票市场中,逻辑回归模型被广泛应用于风险评估和预测分析。该方法的核心在于通过建模二分类问题(如股票上涨或下跌、公司违约与否等),将历史数据与相关特征结合,以估计特定事件发生的概率。 ### 方法 1. **理论基础** 逻辑回归是一种广义线性模型,适用于因变量为二元的情况。其基本形式为: $$ P(Y=1|X) = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \cdots + \beta_n X_n)}} $$ 其中 $P(Y=1|X)$ 表示在给定输入特征 $X$ 的条件下,目标变量 $Y$ 为 1 的概率。这一公式可用于计算股票涨跌的概率或公司违约的可能性[^2]。 2. **特征选择** 在股票市场中,特征可以包括技术指标(如移动平均线、RSI)、财务比率(如市盈率、资产负债率)以及宏观经济数据(如GDP增长率、利率变化)。这些特征用于构建模型的输入变量。 3. **模型训练与拟合** 使用 R 中的 `glm()` 函数或 Python 中的 `sklearn.linear_model.LogisticRegression` 类,可以快速实现逻辑回归模型的训练。例如,在 R 中使用如下代码进行模型拟合: ```r model <- glm(Direction ~ Lag1 + Lag2 + Volume, data = stock_data, family = "binomial") ``` 此处 `Direction` 表示股票涨跌方向,`Lag1` 和 `Lag2` 是滞后一期和二期的收益率,`Volume` 是交易量[^2]。 4. **模型评估** 模型的评估可以通过多种方式完成,包括混淆矩阵、准确率、召回率、AUC-ROC 曲线等。此外,偏差(Deviance)也是一种常见的评估指标,用于衡量模型对数据的拟合程度。例如: - Null deviance: 93.351 on 69 degrees of freedom - Residual deviance: 30.392 on 63 degrees of freedom 这些值越小,表示模型的拟合效果越好[^4]。 ### 案例 1. **股票涨跌预测** 在一个实际案例中,研究者利用逻辑回归模型分析了某只股票的历史数据,包括每日收盘价、成交量、技术指标等。模型的目标是预测下一日股价是上涨还是下跌。结果显示,模型在测试集上的准确率达到 70% 以上,表明其具备一定的预测能力。 2. **公司信用风险评估** 另一应用是评估上市公司的信用风险。通过收集多家公司的财务数据(如流动比率、速动比率、负债权益比等),逻辑回归模型可以预测某家公司是否可能面临违约风险。这种模型可以帮助投资者规避高风险股票,优化投资组合[^1]。 3. **市场趋势预测** 在更宏观的层面,逻辑回归也可以用于预测整个市场的趋势。例如,通过分析宏观经济指标(如CPI、PMI指数)和市场情绪指标(如恐慌指数VIX),模型可以判断市场在未来一段时间内是处于牛市还是熊市状态[^5]。 ### 示例代码 以下是一个使用 Python 的 `sklearn` 库实现股票涨跌预测的简单逻辑回归模型: ```python from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score # 假设 stock_data 是一个包含特征和标签的数据框 X = stock_data[['Lag1', 'Lag2', 'Volume']] y = stock_data['Direction'] # 1 表示上涨,0 表示下跌 # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 训练逻辑回归模型 model = LogisticRegression() model.fit(X_train, y_train) # 预测并计算准确率 y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"模型准确率: {accuracy:.2f}") ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值