Python 2.7 Python:如何创建一个使用自己的输出并使用随机生成的数字数组的函数
免责声明:我对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变量是函数本身的输出
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