如何使用滚动功能来预测基于简单移动平均线或其他策略的趋势

Posted

技术标签:

【中文标题】如何使用滚动功能来预测基于简单移动平均线或其他策略的趋势【英文标题】:How to use rolling function to predict a trend based on either Simple Moving Average or some other strategy 【发布时间】:2021-10-02 22:57:15 【问题描述】:

我有一个代码,可以让我得到一只股票的 44 天简单移动平均线,因为它的开盘价、收盘价、最高价、最低价、日期如下:

stocks.sort_index(ascending=False, inplace = True)  # Without reverse, recent rolling mean will be either NaN or equal to the exact value

stocks['44-SMA'] = stocks[Close].rolling(44, min_periods = 1).mean()

我想购买 44-SMA 上升的股票。我可以直观地得到它,但我正在编写一个用于回测自动化的代码。

我的假设是,如果当前平均价格高于过去 5 次平均价格(一周)的平均价格,则存在上升趋势。(有没有其他更好的方法来找到它?)

所以我写了这样的代码:

def assume_trend(df): # last value -1 is the Latest Stock Price after sorting reverse
    '''
    Perform a rolling operation on the df to find the Current Average and the mean of previous 5 averages
    '''
    for i in range(df.shape[0]):
        df.loc[i,'Trend Prediction'] = df.loc[-6-i:-i,'Rolling Mean'].mean() < df.loc[i,'Rolling Mean']

我如何在这里使用rolling,因为它会比这里的循环快。

【问题讨论】:

【参考方案1】:

您可以通过以下方式进行:

import pandas as pd
import numpy as np

df = pd.DataFrame(dict(a=np.arange(10), b=np.random.randint(1, 10, 10), c=np.random.randn(10)))
df.loc[:, 'Rolling Mean'] = df.apply(lambda row: df.loc[-5:row.name, 'b'].mean(), axis=1)
df.loc[:, 'Valid'] = df.apply(lambda row: False if row.name < 5 else (False if df.loc[-5:row.name, 'Rolling Mean'].mean() > df.loc[row.name, 'Rolling Mean'] else True), axis=1)
df

输出:

    a   b       c       Rolling Mean    Valid
0   0   5   0.779053    5.000000        False
1   1   6   -0.822965   5.500000        False
2   2   8   0.116101    6.333333        False
3   3   3   -0.716928   5.500000        False
4   4   3   0.077724    5.000000        False
5   5   6   0.235477    5.166667        False
6   6   5   -0.198586   5.142857        False
7   7   7   0.625347    5.375000        False
8   8   7   0.798292    5.555556        True
9   9   5   -0.369337   5.500000        True

干杯

【讨论】:

以上是关于如何使用滚动功能来预测基于简单移动平均线或其他策略的趋势的主要内容,如果未能解决你的问题,请参考以下文章

pandas 中的动态滚动功能

分享一个简单好用的策略

如何使用 python + NumPy / SciPy 计算滚动/移动平均值?

移动平均法详解

滚动率预测模型是不是与 ARIMA 相同

WeQuant交易策略—简单均线