Python:如何创建一个使用自己的输出并使用随机生成的数组的函数

时间:2016-05-10 05:29:29

标签: python-2.7 python-3.x

免责声明:我对Python和整个编程都很陌生。

我一直在尝试使用以下方法创建一个生成随机股票价格的函数:

New stock price = previous price + (previous price*(return + (volatility * random number)))

return and volatility个数字是固定的。另外,我已经生成了N次随机数。

问题是如何创建一个将输出重新使用的函数作为输入previous price再次使用。

基本上要从此公式生成一系列新股票价格,而previous price变量就是该函数的输出。

我一直试图这样做几天,我确信我没有完全的装备去做(因为我是新手)但是任何帮助都真的非常值得赞赏...... !! !

请提供任何帮助。

import random

initial_price = 10
return_daily = 0.12 / 252
vol_daily = 0.30 / (math.sqrt(252))


random_numbers = []
for i in range (5):
    random_numbers.append(random.gauss(0,1))

 def stock_prices(random_numbers):
    prices = []
    for i in range(0,len(random_numbers)):
        calc = initial_price + (initial_price * (return_daily+(vol_daily*random_numbers[i])))
        prices.append(calc)
    return prices

2 个答案:

答案 0 :(得分:1)

你不能在这里真正使用递归,因为你没有结束递归的中断条件。您可以通过传递一个额外的计数器参数来构造一个参数,该参数指定要递归多少级别,但在我看来这不是最优的。

相反,我建议你使用一个for循环,它可以重复你指定的固定次数。这样,您可以为每个循环迭代步骤向列表添加一个新的价格值,并访问前一个以计算它:

first_price = 100
list_length = 20

def price_formula(previous_price):
    return previous_price * 1.2  # you would replace this with your actual calculation

prices = [first_price]  # create list with initial item
for i in range(list_length):  # repeats exactly 'list_length' times, turn number is 'i'
    prices.append(price_formula(prices[-1]))  # append new price to list
    # prices[-1] always returns the last element of the list, i.e. the previously added one.

print("\n".join(map(str, prices)))

我的代码段优化:

import random

initial_price = 10
return_daily = 0.12 / 252
vol_daily = 0.30 / (math.sqrt(252))

def stock_prices(number_of_prices):
    prices = [initial_price]
    for i in range(0, number_of_prices):
        prices.append(prices[-1] + (prices[-1] * (return_daily+(vol_daily*random.gauss(0,1))))
    return prices

答案 1 :(得分:0)

这是经典的马尔可夫过程。现值取决于其先前的值,仅取决于其先前的值。在这种情况下使用的最好的东西是所谓的迭代器。可以创建迭代器来生成模拟markov模型的任意迭代器。

了解如何在此处生成迭代器http://anandology.com/python-practice-book/iterators.html

现在您已经了解了迭代器的工作原理,您可以为您的问题创建自己的迭代器。您需要一个实现__iter__()方法和next()方法的类。

这样的事情:

import random
from math import sqrt

class Abc:

    def __init__(self, initPrice):

        self.v = initPrice # This is the initial price
        self.dailyRet  = 0.12/252
        self.dailyVol = 0.3/sqrt(252)
        return

    def __iter__(self): return self

    def next(self):
        self.v += self.v * (self.dailyRet + self.dailyVol*random.gauss(0,1) )
        return self.v


if __name__ == '__main__':

    initPrice = 10
    temp = Abc(initPrice)

    for i in range(10):
        print temp.next()

这将给出输出:

> python test.py
10.3035353791
10.3321905359
10.3963790497
10.5354048937
10.6345509793
10.2598381299
10.3336476153
10.6495914319
10.7915999185
10.6669136891

请注意,此没有具有stop iteration命令,因此如果您错误地使用此命令,则可能会遇到麻烦。但是,这并不难实现,我希望你尝试实现它......