0

tl;dr : 私のコードは、必要な答えが得られるという点で「機能します」。その答えに到達したときに実行を停止することはできません。出力をスクロールして戻るのに行き詰まっています。

私はプログラミング/Pythonの完全な初心者です。スキルを磨くために、ダモダラン教授のバリュエーション クラスのインプライドエクイティ リスク プレミアムの独自の「ソルバー」をプログラムできるかどうかを確認することにしました。基本的に、コードはいくつかの入力を受け取り、入力に「近い」値になるまで一連の金利を「推測してテスト」します。

現在、私のコードは出力リストを吐き出し、それをスクロールして答えを見つけることができます。あたりです。ただし、 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

動作するはずです。明らかに、これを行うには100万通りの方法があります。ただし、ここでの一般的な要点は、条件が満たされるとすぐに while ループが停止するということです。for ループで毎回テストして break ステートメントを含めることもできますが、いつ停止するかわからないため、この場合は while ループの方が優れていると思います。

このような問題を解決できる 2 つの異なる方法を簡単に説明します。

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

さらに 2 つ: 大きな範囲を実行している場合は、ジェネレータ xrange を使用します。また、ループi内で再利用するのはおそらく悪い考えです。for

Python の学習には、 Udacity.comの CS101をお勧めします。また、アルゴリズムに興味がある場合は、 projecteuler.comで問題を解決してください。

于 2013-08-07T23:19:37.510 に答える