免责声明:我对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
答案 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命令,因此如果您错误地使用此命令,则可能会遇到麻烦。但是,这并不难实现,我希望你尝试实现它......