Python中的约束逻辑回归(结果变量)

Posted

技术标签:

【中文标题】Python中的约束逻辑回归(结果变量)【英文标题】:Constrained Logistic Regression (outcome variable) in Python 【发布时间】:2022-01-23 03:25:26 【问题描述】:

为了预测未来的股票走势,我们在 Python 中使用逻辑回归。我们通过将每日收益转换为每周收益来做到这一点。接下来,我们使用以下代码确定收益是上升还是下降:

# calculate weekly log returns and market direction
stock['returns'] = np.log(stock / stock.shift(5))
stock.dropna(inplace=True)
stock['direction'] = np.sign(stock['returns']).astype(int)

我们有三个方向信号:

 0  = hold the stock / do noting
 1  = buy the stock
-1 = sell the stock

下面是判断多头方向的代码,如果股票还在上涨,则持有股票,否则卖出股票。

stock['long direction'] = 0
for val, group in itertools.groupby(enumerate(stock['direction']), itemgetter(1)):
    # this is tuple unpacking, irrelevant is a list of values that aren't the last one, and last is the one we care about.
    [*irrelevent, last] = group
    stock['long direction'].iloc[last[0]] = -last[1]

del stock['direction'] 

The output is as follows:

    Date        close       returns     long direction
    2021-12-08  1068.95     -0.024068   0
    2021-12-09  1003.79     -0.077418   1
    2021-12-10  1017.03      0.002028   -1
    2021-12-13  966.40      -0.043137   0
    2021-12-14  958.51      -0.092831   0
    2021-12-15  975.98      -0.090989   0
    2021-12-16  926.91      -0.079681   0
    2021-12-17  932.57      -0.086698   1

我们使用逻辑回归来预测未来走势,但我们不知道如何添加约束以防止卖空。因此,我们不希望连续出现 -1, -1 方向,也不希望连续出现 1, 1 方向。 0,0,0,0, 信号很好,这意味着我们必须持有股票。我们的数据集中存在很大的不平衡,信号 0 占主导地位。我们已经使用class_weight处理了这个问题。

下面是当前代码:

stock = stock.dropna()
X = stock.loc[:, stock.columns != 'long direction']
y = stock['long direction']

X_train, X_test, y_train, y_test = sklearn.model_selection.train_test_split(X, y, test_size = 0.05, random_state = 5, shuffle=False)

model1 = LogisticRegression(random_state=0, multi_class='multinomial', penalty='none', solver='newton-cg', class_weight=-1:0.35, 0:0.3, 1:0.75).fit(X_train, y_train)
preds = model1.predict(X_test)

#print the tunable parameters (They were not tuned in this example, everything kept as default)
params = model1.get_params()
print(params)

下面是代码的输出,其中信号 -1,-1 是预测变量(结果或 Y 变量),但我们不希望模型连续预测 -1,-1 信号。

           long direction   pred
Date        
2021-10-11  0               -1
2021-10-12  0               -1
2021-10-13  0               -1
2021-10-14  0               -1
2021-10-15  0               -1

我们如何添加约束,即模型知道结果变量 (Y) -1,-1 和 1,1 连续信号是不可能的? 我只能在互联网上找到有关输入变量 (X) 约束的信息。

【问题讨论】:

您可能希望将您最近执行的操作作为模型的输入包含在内? 【参考方案1】:

有几种方法可以做到这一点。

第一种方法是在逻辑回归给出推荐之后修改推荐,所以如果它返回 -1 然后连续返回 -1,那么你有一些其他机制来决定第二次“改变”什么 - 1 into(这可以是任何东西:您自己创建的简单决策规则,返回预测以使用以前的 long 值等)。这种方法感觉更像bodge,而不是优雅的解决方案。如果您更喜欢更优雅的解决方案,请继续阅读第二种方法。

第二种方法是更改​​您的模型,使其包含该事实。像逻辑回归这样的机器学习算法的基本思想是能够自动为您进行预测,而无需您创建和定义明确的规则。与此一致,您可以修改您的训练数据,使其将先前的信号作为其输入数据的一部分考虑在内,然后训练输出数据也将使用这一事实。如果您的训练数据始终将前一个指标作为其输入之一,并且只要前一个指标为 -1,则输出永远不会是 -1(因为您不希望连续两个 -1),那么模型将学会不给你一个新的推理数据 -1 之前的指标是 -1。

想到的第三种方法可能介于第一种和第二种方法之间,是使用三种不同的训练模型:一个模型在前一个方向为 -1 时训练,一个模型在它为 0 时训练,一个模型在是 1。第一个和第三个模型在它们的标签输出空间中甚至没有分别选择 -1 和 1,因此它们不会以这种方式出错,然后第二个模型将具有 -1、0 和1.

【讨论】:

感谢您的详细解释。我们只是不知道如何处理模型中的选项 2。是否有可能在 Python 中为逻辑回归添加约束(在 ML Logisticregression 代码中,以我们想要的结果变量的方式)。我找不到相关文件。也没有例子,关于这个话题。

以上是关于Python中的约束逻辑回归(结果变量)的主要内容,如果未能解决你的问题,请参考以下文章

Python中的有界逻辑回归

《机器学习实战》之逻辑回归--基于Python3--01

R:计算和解释逻辑回归中的优势比

python中的逻辑回归。概率阈值

Python数据挖掘—回归—逻辑回归

6.逻辑回归