简体   繁体   English

将变量从类中的另一个函数传递给Pool

[英]Passing a variable from another function in a class to Pool

The below code simulates a stock price and calculates its payoff. 以下代码模拟股票价格并计算其收益。 I am trying to use multiprocessing to speed up the simulations. 我正在尝试使用多处理来加速模拟。 The problem is that in CallUpAndOut where I have pool.map , I am not sure how to access total from simulations 问题是,在CallUpAndOut在那里我有pool.map ,我不知道如何访问totalsimulations

I have tried several things like self.Simulations.Total or self.total but it doesn't work. 我尝试了几个像self.Simulations.Totalself.total但它不起作用的东西。

import numpy as np
from multiprocessing import Pool
import time

class PricingSimulatedBarrierOption:
    def __init__(self, spot, strike, barrier, rate, sigma, time, sims, steps):
        self.spot = spot
        self.strike = strike
        self.barrier = barrier
        self.rate = rate
        self.sigma = sigma
        self.time = time
        self.sims = sims
        self.steps = steps
        self.dt = self.time / self.steps

    def Simulations(self):

        total = np.zeros((self.sims,self.steps+1),float)
        pathwiseS= np.zeros((self.steps+1),float)
        for j in range(self.sims):
            pathwiseS[0] =self.spot
            total[j,0] = self.spot
            for i in range(1,self.steps+1):
                phi = np.random.normal()
                pathwiseS[i] = pathwiseS[i-1]*(1+self.rate*self.dt+self.sigma*phi*np.sqrt(self.dt))
                total[j,i]= pathwiseS[i]

        return total.reshape(self.sims, self.steps+1)

    def CallUpAndOut(self):

        start_time = time.time()
        p = Pool()
        getpayoff = p.map(self.Simulations(),self.total) ###How to pass total here?
        p.close()
        p.join()
        end_time = time.time()-start_time
        print(end_time)
#        getpayoff = self.Simulations()
        callpayoff = np.zeros((self.sims),float)
        for j in range(self.sims):
            if max(getpayoff[j,])>=self.barrier:
                callpayoff[j] = 0
            else:
                callpayoff[j] = max(getpayoff[j,self.steps-1]-self.strike,0)  

        return np.exp(-self.rate*self.time)*np.average(callpayoff)

c = PricingSimulatedBarrierOption(100,100,170,0.05,0.2,1,10000,252)
print(c.CallUpAndOut())

In function definition add parameter see below example: 在函数定义中添加参数见下面的例子:

def CallUpAndOut(self, total):

And pass array of total values in map see below example: 并在map中传递总值数组,如下例所示:

total = [1,2,3]
getpayoff = p.map(self.Simulations,total)

To work this I had to move the declaration outside. 为了解决这个问题,我不得不将声明移到外面。 Below code is now able to accept variable in the Pool function. 下面的代码现在能够接受Pool函数中的变量。

import numpy as np
from multiprocessing import Pool
import time

class PricingSimulatedBarrierOption:
    def __init__(self, spot, strike, barrier, rate, sigma, time, sims, steps):
        self.spot = spot
        self.strike = strike
        self.barrier = barrier
        self.rate = rate
        self.sigma = sigma
        self.time = time
        self.sims = sims
        self.steps = steps
        self.dt = self.time / self.steps
        self.pathwiseS= np.zeros((self.steps+1),float)

def Simulations(self):

    print("Called")
    total = np.zeros((self.sims,self.steps+1),float)
    self.pathwiseS= np.zeros((self.steps+1),float)
    for j in range(self.sims):
        self.pathwiseS[0] =self.spot
        total[j,0] = self.spot
        for i in range(1,self.steps+1):
            phi = np.random.normal()
            self.pathwiseS[i] = self.pathwiseS[i-1]*(1+self.rate*self.dt+self.sigma*phi*np.sqrt(self.dt))
            total[j,i]= self.pathwiseS[i]

    return total.reshape(self.sims, self.steps+1)

def CallUpAndOut(self):

    start_time = time.time()
    p = Pool()
    getpayoff = p.map(self.Simulations(),self.pathwiseS)
    p.close()
    p.join()
    end_time = time.time()-start_time
    print(end_time)
#        getpayoff = self.Simulations()
    callpayoff = np.zeros((self.sims),float)
    for j in range(self.sims):
        if max(getpayoff[j,])>=self.barrier:
            callpayoff[j] = 0
        else:
            callpayoff[j] = max(getpayoff[j,self.steps-1]-self.strike,0)  

    return np.exp(-self.rate*self.time)*np.average(callpayoff)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM