#python #noise #kalman-filter #pykalman
#python #шум #kalman-фильтр #пайкалман
Вопрос:
Добрый день всем! Я новичок в фильтре Калмана, но я наткнулся на эту действительно интересную статью (https://pdfs.semanticscholar.org/d348/37b8e535974c341d8c8a5c38666581e83309.pdf ) о возможности использования этого фильтра в анализе финансовых временных рядов и, в частности, в контексте анализа динамического стиля. Я хотел бы реализовать этот алгоритм, но я не уверен, как указать матрицы перехода и наблюдения. Практически говоря, у меня есть эталонный взаимный фонд с 60 наблюдениями за ежемесячной доходностью и 8 индексами, с помощью которых я хочу сравнить фонд. Я сосредотачиваюсь на анализе слабого стиля, поскольку его должно быть проще всего кодировать с помощью библиотеки Pykalman. Это код до сих пор, мне нужно только указать матрицы перехода и наблюдения:
import matplotlib.pyplot as plt
from pykalman import KalmanFilter
import numpy as np
import pandas as pd
df1 = pd.read_excel('/Users/marco/Desktop/SA_trial.xlsx')
df1.drop(['Mth'], axis='columns', inplace=True)
fund = df1.iloc[:, 0:1]
index = df1.iloc[:, 2:10]
fund = np.array(fund)
index = np.array(index)
n_timesteps = index.shape[0]
measurements = np.asarray(fund)
kf = KalmanFilter(transition_matrices=np.identity(8),
observation_matrices=index[0, :],
#transition_offsets=[0, 0, 0, 0, 0, 0, 0, 0],
initial_state_mean=index[0])
(filtered_state_means, filtered_state_covariances) = kf.filter(measurements)
kf.em(measurements).smooth(measurements)[0]
print('------n')
print(filtered_state_means)
print(len(filtered_state_means.shape))
weights = filtered_state_means
benchmark = []
for i in range(len(weights)):
benchmark_return = index[i] @ weights[i]
benchmark.append(benchmark_return)
print('------n')
print(benchmark)
plt.plot(measurements, '-r', label='measurment')
plt.plot(benchmark, '-g', label='kalman-filter output')
plt.legend(loc='upper left')
plt.show()
Заранее спасибо за ваше время!
Ответ №1:
Проектирование матриц перехода и наблюдения является наиболее сложной и важной частью использования фильтра Калмана. (Как вы знаете, реализация самого фильтра Калмана предоставляется вашей библиотекой, pykalm.)
Эти две матрицы должны быть указаны в вашей статье, и они действительно есть.
Для матрицы измерений:
Посмотрите на страницу 43, раздел 4.2 «Уравнения измерения». Для вашего анализа слабого стиля уравнение измерения представлено формулой (19). Вспомните определение уравнений Калмана в формуле (4), стр. 36. Как вы можете видеть, ваша измерительная матрица равна R_t . Вам также нужен шум измерения, который равен sigma ^ 2 независимо от t .
Для матрицы перехода:
Посмотрите на стр. 42 и 43, раздел 4.1 «Уравнение состояния». Уравнение состояния задается формулой (18). Опять же, помните определение уравнений Калмана в формуле (4), стр. 36. Как вы можете видеть, ваша матрица перехода — это единичная матрица. Шум перехода равен Q.
Пожалуйста, обратите внимание также
Это должно ответить на ваш вопрос. Но позвольте мне указать, что вы должны указывать матрицы шума в своем коде точно так же, как матрицы перехода и измерения. Я не знаю pykalm, возможно, он будет работать без, но тогда результаты будут неверными.
Комментарии:
1. Я бы очень хотел поблагодарить вас за ваше время, доступность и действительно четкие рассуждения. Извините, я действительно новичок в этой теме, и ваше объяснение было действительно простым и полезным. Тем не менее, мне все еще не удается запустить код из-за ошибок в измерениях. Прямо сейчас у меня есть переменные измерения, которые содержат 60 наблюдений за доходностью фонда (60×1), матрицу перехода (идентификатор, 60×8), матрицу наблюдений (начальные оценки бета, 1×8) и доходность фонда (60×8). Я неправильно понимаю начальное состояние?
2. Нет проблем. Я не совсем понимаю, что вы делаете, было бы полезно, если бы вы обновили свой вопрос. Однако: 1.) Pykalm хочет получить все 60 матриц наблюдений и все 60 матриц перехода (для каждого временного шага). Если ваше состояние имеет длину 8, одна матрица перехода имеет размерность 8×8. Тогда 60 матриц перехода имеют размерность (60 * 8) x8 или 8x (60 * 8). 2.) Матрица наблюдения не является начальной оценкой. Если у вас нет начальной оценки, просто выберите нулевой вектор. Вы должны выбрать R_t в качестве матрицы наблюдения, как я написал в своем ответе. Размерность R_t равна 1×8.
3. Я обновил код тем, к чему я пришел. По крайней мере, работает, но я думаю, что я неправильно настроил входные данные, поскольку веса портфеля, полученные в результате фильтра Калмана, неправильно отслеживают производительность фонда. Я не уверен, в чем проблема, возможно, дело в том, что мне приходится ограничивать веса, чтобы суммировать до 1. Большое вам спасибо за ваше время.