🥥Python | C++ | MATLAB | Julia | R 市场流动性数学预期评估量

Python | C++ | MATLAB | Julia | R | 市场 | 流动性 | 策略 | 动量 | 数学 | 散度 | 三重指数 | 平均 | 均值 | 指数加权 | 相对强弱 | 时间序列 | 投资组合 | 价差 | 风险 | 获利 | 不对称 | 信息 | 市场机制 | 缺口 | 头寸 | 算法 | 资产 | 方程

🏈指点迷津 | Brief

🎯要点

🎯市场流动性策略代码应用:🎯动量策略:滚动窗口均值策略、简单移动平均线策略、指数加权移动平均线策略、相对强弱指数、移动平均线收敛散度交叉策略、三重指数平均策略、威廉姆斯 %R 策略 | 🎯均值回归策略:布林线交易策略、配对交易策略 | 🎯基于数学模型的策略:通过每月交易最小化投资组合波动策略、每月交易的最大夏普比率策略 | 🎯基于时间序列预测的策略:具有外生回归量的季节性自回归综合移动平均线、先知策略 | 🎯市场流动性差价数学评估。

🎯个人现金流建模预期市场投资模式。

🎯风险获利数学模型:Python流动性做市风险获利 | 信息不对称买卖数学模型 | 🎯市场机制分析:Python牛市熊市横盘机制 | 缺口分析 | 头寸调整算法 | 🎯资产评估:Python和MATLAB及C++资产价格看涨看跌对冲模型和微积分 | 🎯金融数学代码:C++和Python计算金融数学方程算法模型

🍇Python季节性和外部因素计算模型

时间序列数据中的季节性是指在一段时间内以固定间隔出现的重复且可预测的模式。这些模式可以以各种形式表现出来,例如每日、每周、每月或每年的周期,并且通常受天气、假期或经济季节等外部因素的影响。季节性的存在意味着数据在特定时间范围内重复出现系统性变化。了解季节性对于准确预测至关重要,因为它有助于捕捉数据的周期性。分析师使用各种统计技术来检测和建模季节性,从而使他们能够做出更明智的决策和预测。季节性分解、傅里叶分析和自相关函数是用于分析和解决时间序列数据中季节性的常用工具。通过确认和整合这些重复模式,预测模型可以更好地捕捉数据的固有结构并提供更可靠的预测。

处理时间序列数据中的季节性涉及建模和整合定期观察到的重复模式。假设您有冰淇淋销售的每日数据,并且您注意到一种季节性模式,即夏季销售额趋于增加,冬季销售额趋于减少。要处理这种季节性,您可以按照以下步骤使用此模型:

💦差分(积分):

季节性模式会使数据变得不平稳。如果需要,可以应用差分使序列平稳。这可能涉及取一阶差分或应用季节性差分,具体取决于数据的特征。季节性差分通常用于使时间序列平稳。差分参数表示为 d(表示季节性差分)。差分涉及从其滞后版本中减去时间序列。第 d 次差分可以表示为:

Yt=YtYtdY_t^{\prime}=Y_t-Y_t-d

这里,YtY_t^{\prime}是差分序列,是季节周期。

💦识别季节性因素

通过纳入季节性自回归 (SAR) 和季节性移动平均 (SMA) 项来建模季节性差异。这些项捕捉特定时间间隔(季节)内数据中的重复模式。为了识别时间序列的季节性成分,我们可以使用各种分解技术。一种常见的方法是使用 LOESS (STL) 进行季节性趋势分解。这有助于识别趋势、季节性和残差成分。这些成分可以帮助识别定期重复出现的模式,从而更好地理解模型。

计算移动平均线以捕捉趋势。我们可以使用简单的移动平均线或指数平滑等其他技术。在这里,我们使用移动平均线。

移动平均值是通过取指定周期数(本例中为 m)内的值的平均值来计算的。

SMA(t)=(Ytk+1++Yt)/kS M A(t)=\left(Y_{t-k+1}+\ldots+Y_t\right) / k

其中, YtY_t 是时间 tt 的值,kk 是移动平均线的周期数。

它对于消除短期波动和突出数据的整体方向特别有用。从原始时间序列中减去移动平均线以获得去趋势序列。

 去趋势序列 =yt 移动平均线 \text { 去趋势序列 }=y_t-\text { 移动平均线 }

其中,n 是季节数。

n 的选择取决于数据季节性的周期性。例如,如果您观察每年的季节性,则每月数据的 n 将设置为 12。残差表示考虑了趋势和季节性成分后时间序列中的剩余变化。

 残差 = 去趋势序列季节分量 \text { 残差 }=\text { 去趋势序列季节分量 }

它有助于定义时间序列数据中无法解释的变化或噪声残差对于模型诊断和验证非常重要。一个好的预测模型应该具有随机的残差,并且没有明显的模式。如果残差中存在模式,则表明该模型可能需要进一步细化。

综上所述,模型可表示为:

Θ(L)pθ(Ls)PΔdΔsDyt=Φ(L)qϕ(Ls)QΔdΔsDϵt+i=1nβixti\Theta(L)^p \theta\left(L^s\right)^P \Delta^d \Delta_s^D y_t=\Phi(L)^q \phi\left(L^s\right)^Q \Delta^d \Delta_s^D \epsilon_t+\sum_{i=1}^n \beta_i x_t^i

Θ(L)νθ(Ls)PΔdΔsDyt\Theta(L)^\nu \theta\left(L^s\right)^P \Delta^d \Delta_s^D y_t:表示因变量,表示为 yty_{t}​,它可能是一个时间序列变量。

Θ(L)pθ(Ls)P\Theta(L)^p \theta\left(L^s\right)^P:分别涉及自回归 (AR) 和季节性自回归分量。ΔdΔsD\Delta^d \Delta_s^D 表示差分,通常用于实现时间序列数据的平稳性。\epsilon_t 表示模型的误差项。i=1nβixti\sum_{i=1}^n \beta_i x_t^i 包括 (n) 个外生变量 xtix_t^i 与相应的系数 βi\beta_i

💦Python实现模型:

 from datetime import datetime
 import numpy as np
 import pandas as pd
 import matplotlib.pylab as plt
 %matplotlib inline
 from matplotlib.pylab import rcParams
 ​
 from statsmodels.tsa.stattools import adfuller

 from statsmodels.tsa.seasonal import seasonal_decompose
 ​
 df = pd.read_csv("https://raw.githubusercontent.com/AirP.csv")
 ​

将“月”列转换为日期时间格式并将其设置为 DataFrame 的索引。

 df['Month'] = pd.to_datetime(df['Month'], infer_datetime_format=True)
 df = df.set_index(['Month'])
 ​

差分

 df['#Passengers_diff'] = df['#Passengers'].diff(periods=12)
 df.info()
 ​

输出:

 <class 'pandas.core.frame.DataFrame'>
 DatetimeIndex: 144 entries, 1949-01-01 to 1960-12-01
 Data columns (total 2 columns):
  #   Column            Non-Null Count  Dtype  
 ---  ------            --------------  -----  
  0   #Passengers       144 non-null    int64  
  1   #Passengers_diff  132 non-null    float64
 dtypes: float64(1), int64(1)
 memory usage: 3.4 KB

差分涉及从时间序列本身减去滞后版本。在季节差异的情况下,您可以从上一年的同一季节中减去该值。

当您采用第一个季节差异时,您会丢失前 12 个数据点(因为没有前一年前 12 个月的数据)。这会导致生成的差分序列中出现缺失值。

 df['#Passengers_diff'].fillna(method='backfill', inplace=True)
 ​
 <class 'pandas.core.frame.DataFrame'>
 DatetimeIndex: 144 entries, 1949-01-01 to 1960-12-01
 Data columns (total 2 columns):
  #   Column            Non-Null Count  Dtype  
 ---  ------            --------------  -----  
  0   #Passengers       144 non-null    int64  
  1   #Passengers_diff  144 non-null    float64
 dtypes: float64(1), int64(1)
 memory usage: 3.4 KB

识别季节性因素

 result = seasonal_decompose(df['#Passengers'], model='multiplicative', period=12)
 trend = result.trend.dropna()
 seasonal = result.seasonal.dropna()
 residual = result.resid.dropna()
 ​
 ​
 plt.figure(figsize=(6,6))
 ​
 plt.subplot(4, 1, 1)
 plt.plot(df['#Passengers'], label='Original Series')
 plt.legend()
 ​
 plt.subplot(4, 1, 2)
 plt.plot(trend, label='Trend')
 plt.legend()
 ​
 plt.subplot(4, 1, 3)
 plt.plot(seasonal, label='Seasonal')
 plt.legend()
 ​
 plt.subplot(4, 1, 4)
 plt.plot(residual, label='Residuals')
 plt.legend()
 ​
 plt.tight_layout()
 plt.show()
 ​

外生变量

 df['month_index'] = df.index.month
 ​

模型拟合

 SARIMAX_model = pm.auto_arima(df[['#Passengers']], exogenous=df[['month_index']],
                         start_p=1, start_q=1,
                         test='adf',
                         max_p=3, max_q=3, m=12,
                         start_P=0, seasonal=True,
                         d=None, D=1,
                         trace=False,
                         error_action='ignore',
                         suppress_warnings=True,
                         stepwise=True)
 ​

模型预测函数

 def sarimax_forecast(SARIMAX_model, periods=24):
     # Forecast
     n_periods = periods
 ​
     forecast_df = pd.DataFrame({"month_index": pd.date_range(df.index[-1], periods=n_periods, freq='MS').month},
                             index=pd.date_range(df.index[-1] + pd.DateOffset(months=1), periods=n_periods, freq='MS'))
 ​
     fitted, confint = SARIMAX_model.predict(n_periods=n_periods,
                                             return_conf_int=True,
                                             exogenous=forecast_df[['month_index']])
     index_of_fc = pd.date_range(df.index[-1] + pd.DateOffset(months=1), periods=n_periods, freq='MS')
 ​
     # make series for plotting purpose
     fitted_series = pd.Series(fitted, index=index_of_fc)
     lower_series = pd.Series(confint[:, 0], index=index_of_fc)
     upper_series = pd.Series(confint[:, 1], index=index_of_fc)
 ​
     # Plot
     plt.figure(figsize=(15, 7))
     plt.plot(df["#Passengers"], color='#1f76b4')
     plt.plot(fitted_series, color='darkgreen')
     plt.fill_between(lower_series.index,
                     lower_series,
                     upper_series,
                     color='k', alpha=.15)
 ​
     plt.title("SARIMAX - Forecast of Airline Passengers")
     plt.show()
 ​
 sarimax_forecast(SARIMAX_model, periods=24)

其中,绘图阴影区域表示预测值周围的置信区间。

Last updated