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

Python 2.7 Python:如何创建一个使用自己的输出并使用随机生成的数字数组的函数,python-2.7,python-3.x,Python 2.7,Python 3.x,免责声明:我对Python和整个编程非常陌生 我一直在尝试创建一个函数,使用以下函数生成随机股票价格: New stock price = previous price + (previous price*(return + (volatility * random number))) 收益率和波动率数字是固定的。另外,我已经生成了N次随机数 问题是如何创建一个函数,将输出作为输入重新使用以前的价格 基本上,根据这个公式生成一个新股票价格数组,而previous price变量是函数本身的输出

免责声明:我对Python和整个编程非常陌生

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

New stock price = previous price + (previous price*(return + (volatility * random number)))
收益率和波动率
数字是固定的。另外,我已经生成了N次随机数

问题是如何创建一个函数,将输出作为输入重新使用
以前的价格

基本上,根据这个公式生成一个新股票价格数组,而
previous price
变量是函数本身的输出

我已经尝试这样做了几天,我相信我还没有完全准备好去做(考虑到我是一个新手),但任何帮助都将真的非常感谢

任何帮助都是有用的



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

相反,我建议您使用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

这是经典的马尔可夫过程。当前值取决于其先前值,并且仅取决于其先前值。在这种情况下,最好使用迭代器。可以创建迭代器来生成对马尔可夫模型建模的任意迭代器

了解如何在此处生成迭代器

现在您已经了解了迭代器的工作原理,可以为您的问题创建自己的迭代器了。您需要一个类来实现
\uu iter\uu()
方法和
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命令,因此如果使用不当,可能会遇到麻烦。然而,这并不难实现,我希望您尝试实现它…

我不确定您指的是一个非常简单的问题(“我如何存储价格并通过函数进行传递?”)还是一个更深层次的问题(“我想用此函数更新价格几次,然后停止,我如何重新执行函数本身?”)或者是一个更复杂的问题(“我需要函数输出再次作为输入使用,因为这涉及递归,函数调用本身很重要,它如何调用自身?”)。你能解释一下吗,最好是发一些代码?嗨,很抱歉搞混了。我对这一点很陌生,但我真的很感谢反馈,因为这一切都会导致学习。我主要想说的是“我需要函数输出作为一个输入被再次使用,因为这是一个涉及递归的东西,函数调用本身很重要,它怎么能调用自己?”?“。以及要添加到数组/列表中的输出。请编辑您的问题以添加该代码示例,注释中的代码示例可读性不好。一旦你这样做了,你可以通知我。也请考虑接受这个答案,如果它解决了你的问题。您总是重复使用第一个值,而不是前一个值。此外,我认为没有必要存储随机值并使用两个循环,因此我将其转换为一个循环。请看我编辑的答案……非常感谢。循环工作得非常完美!我非常感谢您的反馈。@KSoliman在这种情况下,请接受答案,因为它似乎已经解决了您的问题。通过单击左侧的灰色复选符号来执行此操作。谢谢。非常感谢您的反馈。这有一百万次的学习经验(考虑到我是新手)。我真的很感谢你在这方面的帮助。。。
> python test.py
10.3035353791
10.3321905359
10.3963790497
10.5354048937
10.6345509793
10.2598381299
10.3336476153
10.6495914319
10.7915999185
10.6669136891