Как вычислить в тензорном потоке частную производную каждого наблюдения от выходных данных по каждому входному наблюдениPython

Программы на Python
Ответить Пред. темаСлед. тема
Гость
 Как вычислить в тензорном потоке частную производную каждого наблюдения от выходных данных по каждому входному наблюдени

Сообщение Гость »


Я использую последовательный FFNN для оценки финансовых опционов и пытаюсь вычислить дельты опционов. Хотя я достиг большей точности в оценке опционов (результат модели) по сравнению с формулой Блэка-Шоулза, мои вычисленные дельты менее точны. Может ли кто-нибудь помочь мне понять, почему моя модель на основе нейронной сети дает более точные цены опционов, но менее точные дельты, чем формула Блэка-Шоулза? Я знаю, что мне следует использовать функцию Tape.jacobian, но она продолжает убивать мое ядро. Вместо этого я попытался использовать функцию Tape.gradient, но дельты менее точны, чем формула BS. Я читал в тензорном потоке, что он вычисляет частную производную как сумму ys. Мне нужна частная производная каждого выходного наблюдения по отношению к каждому входному наблюдению. Я использую: Python 3.11.0 Tensorflow 2.12.04 Numpy 1.23.5 Я уже нашел несколько сообщений, но ни одно из них не отвечает на мой вопрос.

Вот мой код (X_test — константа, содержащая 4 функции, включая цену опциона)
df_op = df_op[['C0/K', 'M', 'Time_to_expiry', 'garch_vol', 'cp_int']] защита Split_X_Y (данные): Х = данные.копия() y = X.pop('C0/K') вернуть Х, у защита Split_data (X, y): X_train_full, X_test, y_train_full, y_test = train_test_split(X, y, test_size=0,20, случайное_состояние=42) X_train, X_valid, y_train, y_valid = train_test_split(X_train_full, y_train_full, test_size=0,25, случайное_состояние= 42) X_index = X_test.index.to_frame(индекс=Истина) вернуть X_test, y_test, X_train, y_train, X_valid, y_valid, X_index #Разделить X и y X, y = Split_X_Y(данные=df_op) #Перекрестная проверка X_test, y_test, X_train, y_train, X_valid, y_valid, X_index = Split_data(X, y) X_test = tf.constant(X_test, dtype=tf.float32) y_test = tf.constant(y_test, dtype=tf.float32) X_train = tf.constant(X_train, dtype=tf.float32) y_train = tf.constant(y_train, dtype=tf.float32) X_valid = tf.constant(X_valid, dtype=tf.float32) y_valid = tf.constant(y_valid, dtype=tf.float32) модель = build_ANN (X_test, num_units = 30, dropout_rate = 0,25, loss = 'mse') история, Learning_curves = история (модель, X_train, X_valid, y_train, y_valid) def Compute_jacobian(X, model, X_index): soft_memory_limit_mb = 800 пытаться: с tf.GradientTape(persistent=True) в качестве ленты: лента.часы(X) y_pred = модель (X) # Проверяем, превышает ли использование памяти порог если is_memory_limit_exceeded(soft_memory_limit_mb): поднять MemoryError("Использование памяти превысило мягкий предел во время Tape.watch") # Вычисляет градиенты прогнозов относительно входных объектов якобиан = лента.якобиан(y_pred, X) дель лента jacobian_reshape = jacobian.numpy().reshape(X.shape[0], -1) columns_names = [f'Jacobian_{i}' для i в диапазоне (jacobian_reshape.shape[1])] jacobian_df = pd.DataFrame(jacobian_reshape, columns=column_names) защита сдвиг_non_zero (строка): non_zero_values ​​= [значение для значения в строке, если значение!= 0] вернуть не_нулевые_значения + [0] * (len(строка) - len(не_нулевые_значения)) jacobian_df = jacobian_df.apply(shift_non_zero, axis=1, result_type='expand') jacobian_df = jacobian_df.loc[:, (jacobian_df != 0).any()] jacobian_df = jacobian_df.iloc[:, [0]] jacobian_df.rename(columns={jacobian_df.columns[0]: 'delta_nn'}, inplace=True) jacobian_df.index = X_index.index кроме ошибки памяти: jacobian_df = Compute_jacobian_alternative(X, модель, X_index) вернуть jacobian_df Защиту Compute_jacobian_alternative (X, модель, X_index): с tf.GradientTape(persistent=True) в качестве ленты: лента.часы(X) y_pred = модель (X) градиенты2 = лента.градиент(y_pred, X) дель лента градиент_np = градиенты2.numpy() jacobian_df = pd.DataFrame(gradient_np) jacobian_df = jacobian_df.iloc[:, [0]] jacobian_df.rename(columns={jacobian_df.columns[0]: 'delta_nn'}, inplace=True) jacobian_df.index = X_index.index вернуть jacobian_df
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»