0

tl;博士:我的代码“有效”,因为它给了我需要的答案。当它达到那个答案时,我就是无法让它停止运行。我坚持滚动输出。

我是编程/Python 的完全新手。为了磨练我的技能,我决定看看我是否可以为Damodaran 教授的估值课程中的隐含股票风险溢价编写自己的“求解器”。本质上,该代码接受一些输入并“猜测和测试”一系列利率,直到它获得与输入“接近”的值。

现在我的代码会输出一个输出列表,我可以向后滚动以找到答案。这是正确的。但是,我一辈子都无法使用while函数让代码“停止”在正确的值上。

我有以下代码:

per = int(input("Enter the # of periods forecast ->"))
divbb = float(input("Enter the initial dividend + buyback value ->"))
divgr = float(input("Enter the div + buyback growth rate ->"))
tbondr = float(input("Enter the T-Bond rate ->"))+0.000001
sp = int(input("Enter the S&P value->"))

total=0
pv=0


for i in range(1,10000):
    erp = float(i/10000)
    a = divbb
    b = divgr
    pv = 0
    temppv = 0
    print (sp-total, erp)
    for i in range(0, per):
        a=a * (1+b)
        temppv = a / pow((1+erp),i)
        pv=pv+temppv
    lastterm=(a*1+tbondr)/((erp-tbondr)*pow(1+erp,per))
    total=(pv+lastterm)

从他的例子中,输入:

  • 每 = 5
  • divbb = 69.46
  • divgr = 0.0527
  • tbondr = 0.0176
  • sp = 1430

通过向后滚动输出,我可以看到我的代码在 epr=0.0755 处产生了正确的最小值。

我的问题是:我应该在哪里停止这段代码?我已经尝试了很多变化,但无法得到它。我正在寻找的是,基本上:

while (sp-total) > |1|,继续运行代码。

4

1 回答 1

1
per = 5
divbb = 69.46
divgr = 0.0527
tbondr = 0.0176
sp = 1430

total=0
pv=0

i = 1
while(abs(sp-total)) > 1:
    erp = i/10000.
    a = divbb
    b = divgr
    pv = 0
    temppv = 0
    print (sp-total, erp)
    for j in range(0, per):
        a=a * (1+b)
        temppv = a / pow((1+erp),j)
        pv=pv+temppv
    lastterm=(a*1+tbondr)/((erp-tbondr)*pow(1+erp,per))
    total=(pv+lastterm)
    i += 1

应该管用。显然,有一百万种方法可以做到这一点。但这里的一般要点是,while 循环将在满足条件时立即停止。您也可以在 for 循环中每次都进行测试并包含一个 break 语句,但是因为您不知道它何时会停止,所以我认为在这种情况下使用 while 循环会更好。

让我简要介绍一下可以解决此类问题的两种不同方法:

使用 while 循环:

iterator = start value
while condition(iterator):
    do some stuff
    increment iterator

使用 for 循环:

for i in xrange(startvalue, maxvalue):
    do some stuff
    if condition:
        break

还有两件事:如果您正在做大范围,请使用生成器 xrange。i此外,在循环中重用可能是个坏主意for

我推荐Udacity.com的 CS101来学习 Python。此外,如果您对算法感兴趣,请在projecteuler.com上解决问题

于 2013-08-07T23:19:37.510 回答