S&P500インデックスファンドに投資した最適な期間を見つける


8

1928年から2017年までの各暦年の架空のS&P 500株価指数ファンドの年次リターンを乗数で表したものです。したがって、1928年に「インデックスは37.88%上昇した」と言うかもしれませんが、ここでは1.3788で表しています。

1.3788, 0.8809, 0.7152, 0.5293, 0.8485, 1.4659, 0.9406, 1.4137, 1.2792, 0.6141,  1.2521, 0.9455, 0.8471, 0.8214, 1.1243,  1.1945, 1.138, 1.3072, 0.8813, 1,  0.9935, 1.1026, 1.2178, 1.1646, 1.1178,  0.9338, 1.4502, 1.264, 1.0262, 0.8569,  1.3806, 1.0848, 0.9703, 1.2313, 0.8819,  1.1889, 1.1297, 1.0906, 0.8691, 1.2009,  1.0766, 0.8864, 1.001, 1.1079, 1.1563,  0.8263, 0.7028, 1.3155, 1.1915, 0.885,  1.0106, 1.1231, 1.2577, 0.9027, 1.1476,  1.1727, 1.014, 1.2633, 1.1462, 1.0203,  1.124, 1.2725, 0.9344, 1.2631, 1.0446,  1.0706, 0.9846, 1.3411, 1.2026, 1.3101,  1.2667, 1.1953, 0.8986, 0.8696, 0.7663,  1.2638, 1.0899, 1.03, 1.1362, 1.0353,  0.6151, 1.2345, 1.1278, 1, 1.1341,  1.296, 1.1139, 0.9927, 1.0954, 1.1942

出典:https : //www.macrotrends.net/2526/sp-500-historical-annual-returns

チャレンジ

入力として与えられる:

  • 年間収益の配列(ただし、以下の規則2を参照)
  • 配列Xの1≤K≤90の正数(投資期間の各年に投資する金額)

Xに金額を投資するために「連続した」K連続期間が何であったかを出力するプログラムまたは関数を記述します。ここで、X

  • 各金額は年の初めに投資されます。
  • 各年の後に残ったものは、その後の各年の初めに再投資されます。
  • 「最高」とは、K年の期間の終わりに最大の金額を意味します。

ルール

  1. これはなので、各言語で最も少ないバイト数が優先されます。標準ルールが適用されます。説明が奨励されました。

  2. 私が年次リターンの配列を表現した方法が気に入らない場合は、それらを好みの90数値の他の配列に変更できます。

  3. K

  4. 同点の場合、正解のいずれかまたはすべてを出力します。

計算例

X=[10000,20000,30000]

1928年、1929年、および1930年にこれらの金額を投資した場合(1-インデックス1、2、および3)、最終的に42743.10になります。悲しい。

しかし、これらの金額を2014年、2015年、および2016年に投資した場合(1-インデックス87、88、および89)、最終的には66722.66になります。少し良く。

これらの金額を投資するのに最適な 3年間は1995年、1996年、および1997年(1インデックス68、69、および70)であり、91942.91になります。いいね。

テストケース

1インデックス、最適期間の最初の年

[ 1, 2, 3 ]                          ->  68
[ 1 ]                                ->   6
* any array of length 90 *           ->   1
[ 1, 1 ]                             ->  27
[ 1, 2 ]                             ->   8
[ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ]  ->  62
[ 1, 2, 3, 4, 5, 4, 3, 2, 1 ]        ->  64
* 1 repeated 20 times *              ->  53

ルール2は、それらを他の90個の数値の配列に置き換えることができると述べています。1の後に89の0が続く配列に置き換えるのは有効ではないので、1が常に正しい答えになりますか?あるいは、「必要な入力は何でも取るが、出力を取得する数はテストケースと一致する必要がある」という意味ですか?
— カミルドラカリ

1
@KamilDrakariは、好きな1-1変換を行うことができます。ただし、実際の正解に到達する必要があります。誰かが累積的なリターンを好むかもしれない、またはそれらのリターンからマイナス1を好むかもしれないという考えです。それは柔軟性のためにあります。しかし、隠れたゴルフの機会もあるなら、それもそうです。
— ngm

@ngmは大丈夫なので、「この入力の特定の値に対してのみ答えが必要であり、それが何であるかを選択できるようになる」ではなく、「この入力を好きな方法でエンコードできます」
— Kamil Drakari

@KamilDrakariはい、非常にされていないが、あなたが好きな方法 -あなたはまだ90個の要素を持つ配列に限定されています。
— ngm

「だから、1927年に、あなたは言うかもしれない...」 -私はあなたが1928年の平均を考える
— ジョナサン・アラン

回答:


6

ゼリー、9 バイト

PÐƤ⁹L¤ƤḋM

すべての最大の開始1ベースのインデックスのリストを生成するダイアディックリンク。

オンラインでお試しください!

(またはṡL}PÐƤ€ḋM)

どうやって?

PÐƤ⁹L¤ƤḋM - Link: list of returns, list of nominal investments
      Ƥ   - for infixes of (the returns)...
          - ...of length:
     ¤    -               nilad followed by links as a nilad:
   ⁹      -                 chain's right argument (nominals)
    L     -                 length
          - ...do:
 ÐƤ       -        for post-fixes:
P         -          product
       ḋ  - dot-product (each) with (the nominals)
        M - maximal indices

3

Japt、25バイト

ãVl)míV ®rÈ+YÌ *Yg}0
bUrw

オンラインでお試しください!

0インデックス付きの出力。

U返品Vのリストおよび投資のリストとしての説明:

ã                       :Get subsections of U
 Vl)                    : with the same length as V
    m                   :For each of those sections
     í                  : pair each element with
      V                 : the corresponding element from V
        ®          0    :Calculate the investment results of each by:
         r        }     : for each year:
          È+            :  add the result of the previous year
            YÌ          :  to this year's investment
               *Yg      :  and multiply by this year's return

b                       :Get the index of
 Urw                    : the maximum

ボーナス不正行為の答え:

Japt、13バイト

OvUÎò3 ®n dÃq

オンラインでお試しください!

戻り値のリストをこの配列として受け取ります。これは、各文字列に1929桁までパディングされた10を底とする整数が含まれる90文字列の配列です。これは技術的に要件を満たしていると思います。完全なものがパーマリンクジェネレーターを壊したため、「試してみる」リンクには「戻り値」リストの最初の要素しかありませんが、使用されるのはそれだけです。必要に応じて、ペーストビンから全体を貼り付けることができます。

説明:

前述のように、実際には「returns」配列の最初の要素のみが使用されます。ペーストビンでは他のすべての要素は0であり、プログラムによって無視されます。最初の要素はthisによって生成され、Japtプログラムの文字列表現を取得し、各文字を3桁の数字に変換し、それらの数字を数字のみの新しい文字列に結合します。エンコードされているコードはthisです。これは基本的に、リターンをハードコードするように調整された私の主な答えです。次に、「応答」プログラムは次のとおりです。

  UÎ             :Get the first element
    ò3           :Cut it into slices of length 3
       ®n        :Convert those strings to numbers
          dà    :Convert those numbers to characters
            q    :Join all the characters into one string
Ov               :Execute it as Japt

13バイトバージョンがデフォルトのルールに従っているかどうかはわかりません(実際のコードを柔軟な入力にエンコードすることは抜け穴のように見えます)とにかく好きです!
— ngm

@ngmつまり、私はそれをチートアンサーと呼び、理由のために実際のアンサーに付け加えました。私は主に、「あなたが好む他の90の数の配列」の限界を広げようとしていました。
— カミルドラカリ


2

J、48バイト

1+[:(i.>./)[:({:@[*{.@[+*/@])/"2[(|.@,."1)#@[]\]

オンラインでお試しください!

ない

1 + [: (i. >./) [: ({:@[ * {.@[ + */@])/"2 [ |.@,."1 #@[ ]\ ]

どうやって

123左側が入力リスト(例:)、右側がデータです。

#@[ ]\ ] データを長さが入力と一致するインフィックスに切り刻みます。

1.3788 0.8809 0.7152
       0.8809 0.7152 0.5293
              0.7152 0.5293 0.8485

[ ,."1 これら3つのグループのそれぞれを入力リストで圧縮します

1      2      3
1.3788 0.8809 0.7152
       1      2      3
       0.8809 0.7152 0.5293
              1      2      3
              0.7152 0.5293 0.8485

|.@ そしてそれらを逆にします:

3      2      1
0.7152 0.8809 1.3788

(verb to insert)/"2 3の各圧縮グループの項目の間に、括弧内に動詞を挿入します。

3             2             1
        VERB          VERB
0.7152        0.8809        1.3788

({:@[ * {.@[ + */@]) 挿入された動詞で、3の圧縮されたグループのリストの各項目を1つの数に減らします。これは、その年のグループで獲得した金額です。

          2. plus the first      1. */] = product of right args
             (top) item on left
              +-+     +--------+
              |2|  +  |    1   |
              +-+     |    *   |     
                      | 1.3788 |
             *        +--------+

          0.8809  

          3. Multiply that sum by the bottom
             number on the left.

(i. >./) このように削減されたリストを取り、最大のインデックスを見つけます。

1 + [: そして1つ追加


1

ゼリー、11バイト

ṡ⁹L¤U×\€UḋM

オンラインでお試しください!

預金の収益率は、年末までの年の収益率の累積積ですK。入力を逆にして、2018- [終了日]として年数を出力することが許可されている場合、10バイトのソリューションが×\⁹L¤Ƥ×S€M機能します。

ṡ                All overlapping slices of left input of length:
 ⁹L¤               length(right input)
                 Calculate cumulative returns list for each possible year:
    U              Reverse each element of the result
     ×\€           Take the cumulative product
        U          Reverse again
         ḋ      Dot product with the deposits list.
                The final balance when invested in each year.
          M     Get all indices of maximum values

ṡL}バイトを節約しますṡ⁹L¤(私の代替9バイト、ṡL}PÐƤ€ḋM事実上よりゴルフバージョンです)
— ジョナサンアラン

@JonathanAllan私はまだゼリーを勉強しています。正確にはどのように機能}し⁹[monad]¤ますか?それは常に同等ですか?
— リルトシアスト

1
いいえ、まったく同じではありません。}迅速な扱いは、その左にモナドはそれがダイアドたと含むコードの解析などとして、(左引数で何もしない)そのダイアドに左入力として、右の引数を使用しているかのようにL}、ダイアドたことがあるかのようですを含むコードの解析は、⁹L¤それがニラッドであるかのようです-Erikのコードで置き換えを試みた場合、チェーンの次の部分はダイアドであるので機能しません(次の部分はモナドです)。
— ジョナサンアラン


1

05AB1E、21 20 バイト

Œsgùεø0©\vy`s®+*©]Zk

長すぎる…

0インデックス。

オンラインそれを試してみたり、すべてのテストケースを確認してください。

説明:

Œ                  # Get all sublists of the (implicit) input-list of stock-changes
 s                 # Swap to take the second (implicit) input-list of investments
  g                # And take its length
   ù               # Only leave sublists of that size
ε                  # Map each to:
 ø                 #  Create pairs with the second (implicit) input-list of investments
  0©               #  Store 0 in the register
    \              #  Discard the 0 from the stack
     vy            #  Loop `y` over the pairs
       `           #   Pop and push both values of the pair to the stack
        s          #   Swap them
         ®+        #   Add the value from the register to the investment amount
           *       #   And multiply it by the current number of the sublist
            ©      #   And then replace the value in the register with this
             ]     # Close both the loop and map
              Z    # Take the max of the mapped sublists (without popping the list)
               k   # Determine the index of that max (and output implicitly)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.