时间序列分析与投资模型

        这一节主要介绍时间序列分析与投资模型,包括时间序列的基本概念、常用建模方法和组合投资策略。时间序列分析在金融领域应用广泛,特别是在股票市场的预测中。以下是本节的重点内容:

        时间序列是按照时间顺序排列的数据序列,常见应用包括股票价格和天气数据。时间序列建模涉及参数学习和预测。预测可以是短期或长期的,前者通常更精确。时间序列的组成部分包括长期趋势、季节波动、循环波动和不规则波动,可以通过加法或乘法模型分解。

这两种方法用于平滑数据并揭示趋势:

  • 移动平均法:适用于短期预测,通过计算一组最近数据的平均值来消除随机波动。
  • 指数平滑法:根据离预测点的远近赋予不同权重,适用于有趋势和季节性的序列。

ARIMA模型用于处理平稳或通过差分变得平稳的时间序列:

  • AR模型:自回归模型,用历史数据预测当前数据。
  • MA模型:移动平均模型,用过去的白噪声误差加权和预测当前数据。
  • ARMA/ARIMA模型:结合自回归和移动平均的方法,通过AIC和BIC准则选择最优参数。

灰色系统模型适用于数据不完全已知的系统,通过累加生成和微分方程建立预测模型,常用模型包括GM(1,1)和GM(2,1)。灰色预测法适用于中短期的指数趋势预测。

 时间序列分析的示例代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm

# 读取比特币数据
df = pd.read_csv("Bitcoin.csv")
df.Date = pd.to_datetime(df.Date)
df.set_index(df.Date, drop=True, inplace=True)
y = df.Bitcoin

# 绘制时间序列图
plt.figure(figsize=(12, 4))
plt.plot(y, label='Bitcoin')
plt.title('Bitcoin Time Series')
plt.xlabel('Date')
plt.ylabel('Bitcoin')
plt.legend()
plt.show()

# 季节性分析
res = sm.tsa.seasonal_decompose(y, model='additive')
res.plot()
plt.suptitle('Seasonal Decomposition')
plt.show()

 移动平均法示例:

def move_average(y, N):
    Mt = [y[0]] * N
    for i in range(N+1, len(y)+2):
        M = y[i-N-1:i-1].mean()
        Mt.append(M)
    return Mt

yt30 = move_average(y, 30)
yt80 = move_average(y, 80)

plt.plot(y, label='y')
plt.plot(yt30, label='yt30')
plt.plot(yt80, label='yt80')
plt.legend()
plt.show()

指数平滑法示例:

def exp_move(y, a):
    n = len(y)
    M = np.zeros(n)
    M[0] = y[0]
    for i in range(1, n):
        M[i] = a * y[i-1] + (1-a) * M[i-1]
    return M

yt1 = exp_move(y, 0.2)
yt2 = exp_move(y, 0.5)
yt3 = exp_move(y, 0.8)

s1 = np.sqrt(((y - yt1) ** 2).mean())
s2 = np.sqrt(((y - yt2) ** 2).mean())
s3 = np.sqrt(((y - yt3) ** 2).mean())

d = pd.DataFrame(np.c_[y, yt1, yt2, yt3])
d.plot()
plt.show()
print(d)

 灰色预测模型示例:

import math

history_data = [724.57, 746.62, 778.27, 800.8, 827.75, 871.1, 912.37, 954.28, 995.01, 1037.2]

def GM11(history_data, forcast_steps):
    n = len(history_data)
    X0 = np.array(history_data)
    lambda0 = np.zeros(n-1)
    for i in range(n-1):
        if history_data[i]:
            lambda0[i] = history_data[i+1] / history_data[i]
        if lambda0[i] < np.exp(-2/(n+1)) or lambda0[i] > np.exp(2/n+2):
            print("GM11模型失效")
            return -1
    history_data_agg = [sum(history_data[0:i+1]) for i in range(n)]
    X1 = np.array(history_data_agg)
    B = np.zeros([n-1, 2])
    Y = np.zeros([n-1, 1])
    for i in range(0, n-1):
        B[i][0] = -0.5 * (X1[i] + X1[i+1])
        B[i][1] = 1
        Y[i][0] = X0[i+1]
    A = np.linalg.inv(B.T.dot(B)).dot(B.T).dot(Y)
    a = A[0][0]
    b = A[1][0]
    XX0 = np.zeros(n)
    XX0[0] = X0[0]
    for i in range(1, n):
        XX0[i] = (X0[0] - b/a) * (1-math.exp(a)) * math.exp(-a*(i))
    e = sum(X0 - XX0) / n
    aver = sum(X0) / n
    s12 = sum((X0 - aver)**2) / n
    s22 = sum(((X0 - XX0) - e)**2) / n
    C = s22 / s12
    cobt = 0
    for i in range(0, n):
        if abs((X0[i] - XX0[i]) - e) < 0.6754 * math.sqrt(s12):
            cobt += 1
    P = cobt / n
    f = np.zeros(forcast_steps)
    if C < 0.35 and P > 0.95:
        print('往后各年预测值为:')
        for i in range(0, forcast_steps):
            f[i] = (X0[0] - b/a) * (1-math.exp(a)) * math.exp(-a*(i+n))
        print(f)
    else:
        print('灰色预测法不适用')
    return f

f = GM11(history_data, 20)
plt.plot(range(11, 31), f)
plt.plot(range(1, 11), history_data)
plt.show()

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值