#python #numpy
#python #numpy
Вопрос:
Как можно выполнить приведенную ниже функцию без функции numpy.vectorize , которая является сокращением для loop , и стать полностью безцикловой?
Он использует геометрическое броуновское движение для создания единого пути для воображаемой акции с начальной ценой с предполагаемой начальной волатильностью 0,5 и средним значением 0,3.
Затем, основываясь на формулах для оценки изменчивости и среднего значения геометрического броуновского движения, он возвращает оценки для заданного количества шагов.
Чтобы предоставить значимые, графические данные, мне пришлось использовать «скрытый» цикл for, который пытается выполнить ряд разных временных шагов, от 1 до 2 ^ нет, формат шагов, требуемых вопросом.
Мой вопрос в том, есть ли способ сделать это без этого цикла? Мне это нужно без numpy.vectorize, поскольку вопрос на самом деле хочет, чтобы код не содержал циклов.
import pandas as pd
import numpy as np
import math as m
from scipy.stats import norm
from matplotlib import pyplot as pt
#Plot Code
def plotter(xlabel,ylabel,title):
pt.xlabel(xlabel)
pt.ylabel(ylabel)
pt.title(title)
pt.legend()
def dw_one_gbm(no):
np.random.seed(12345678)
dw = np.random.normal(0,1,size=(2**no))*m.sqrt(1/(2**no))
dw[0] = 0.0
return dw
#A
def vol_n_mean(no,lis,sigma=0.5,mu=0.3):
S = np.exp(sigma*np.cumsum(dw_one_gbm(no)))*np.exp((mu-(0.5*(sigma**2)))*np.linspace(0,1,2**no))
sg = np.std(np.log(S[1::]/S[:-1:])[:lis:])/((1/(2**no))**0.5)
mn = (np.mean(np.log(S[1::]/S[:-1:])[:lis:])/(1/(2**no))) ((sg**0.5)/2)
return sg, mn
def grapher(no):
sg, mn = np.vectorize(vol_n_mean)(no,(2**(np.arange(0,no))))
pt.figure(2, figsize=(10,5)).add_subplot(211)
pt.semilogx((2**(np.arange(0,no))),sg,'o',color="orange",label="Calculated")
pt.axhline(0.5,label="Real")
plotter("Time Steps","Sigma","Sigma Semilog from Estimation")
pt.figure(2, figsize=(10,5)).add_subplot(212)
pt.semilogx((2**(np.arange(0,no))),mn,'o',color="orange",label="Calculated")
pt.axhline(0.3,label="Real")
plotter("Time Steps","Mean","Mean Semilog from Estimation")
grapher(18)
Комментарии:
1. Имейте в виду, что мы говорим «векторизировать»
numpy
, когда подразумеваем перемещение циклов в скомпилированный код. Циклы все еще есть, но порядок нас не волнует. Извне действие применяется ко всем элементам одновременно. Это параллельный просмотр данных или вычислений, в отличие от последовательного, последовательного просмотра. Только некоторые изufunc
них имеют полезныйaccumulate
илиreduce
, которые работают последовательно.2. есть ли способ сделать это, как с кодированием типа numpy.log(s [1::] / s[: -1:]), только с операциями с массивами / векторами? @hpaulj