Finden Sie den besten Zeitraum, um in einen S & P500-Indexfonds zu investieren

8

Hier sind die jährlichen Renditen für einen hypothetischen S & P 500-Aktienindexfonds für jedes Kalenderjahr von 1928 bis 2017, ausgedrückt als Multiplikator. Man könnte also sagen, dass der Index 1928 um 37,88% gestiegen ist, was ich hier mit 1,3788 dargestellt habe.

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

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

Herausforderung

Als Eingabe angegeben:

  • die Reihe der jährlichen Renditen (siehe jedoch Regel 2. unten)
  • ein Array von positiven Zahlen (die Beträge, in die in jedem Jahr des Investitionszeitraums investiert werden soll)X1K90

Schreiben Sie ein Programm oder eine Funktion, die den "besten" Zeitraum in Folge ausgibt, in dem die Beträge in investiert wurden , wobei:KX

  • Jeder Betrag wird zu Beginn eines Jahres angelegt.
  • Alles, was nach jedem Jahr übrig bleibt, wird zu Beginn jedes folgenden Jahres reinvestiert.
  • "am besten" bedeutet den größten Betrag am Ende des Jahres-Zeitraums.K

Regeln

  1. Dies ist , also gewinnen die wenigsten Bytes in jeder Sprache. Es gelten Standardregeln. Erklärungen erwünscht.

  2. Wenn Ihnen die Darstellung der jährlichen Renditen nicht gefällt, können Sie sie in eine beliebige andere Reihe von 90 Zahlen ändern, die Sie bevorzugen.

  3. Sie können den besten Jahreszeitraum auf beliebige konsistente Weise ausgeben (z. B. 0-indexiert oder 1-indexiert, das erste und / oder das letzte investierte Jahr usw.), aber Sie müssen angeben, was Ihre Ausgabe darstellt, wenn dies nicht der Fall ist. nicht offensichtlich.K

  4. Geben Sie im Falle eines Unentschieden einige oder alle richtigen Antworten aus.

Beispielberechnung

Angenommen, .X=[10000,20000,30000]

Wenn Sie diese Beträge in den Jahren 1928, 1929 und 1930 (die 1-Indizes 1, 2 und 3) investiert hätten, wären Sie zu 42743,10 gekommen. Traurig.

Wenn Sie diese Beträge jedoch in den Jahren 2014, 2015 und 2016 (die 1-Indizes 87, 88 und 89) investiert hätten, wären Sie zu 66722,66 gekommen. Ein bisschen besser.

Es stellte sich heraus, dass der beste Dreijahreszeitraum für die Anlage dieser Beträge 1995, 1996 und 1997 gewesen wäre (1-Indizes 68, 69 und 70), was zu 91942,91 führte. Nett.

Testfälle

1-indexiertes erstes Jahr des optimalen Zeitraums

[ 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
ngm
quelle
Regel 2 besagt, dass wir sie durch jedes andere Array von 90 Zahlen ersetzen können. Ich nehme an, es ist nicht gültig, es durch ein Array zu ersetzen, das 1 gefolgt von 89 0s ist, so dass 1 immer die richtige Antwort ist. Oder meintest du "nimm jede Eingabe, die du willst, aber die Zahl, die ausgegeben wird, muss mit den Testfällen übereinstimmen"?
Kamil Drakari
1
@KamilDrakari Sie können jede 1-1 Transformation durchführen, die Sie mögen. Sie müssen jedoch die richtige Antwort erhalten. Die Idee ist, dass jemand kumulative Renditen oder Renditen minus 1 bevorzugen könnte. Dies dient der Flexibilität. Aber wenn es auch versteckte Möglichkeiten zum Golfen gibt, dann sei es so.
ngm
@ngm okay, es ist also "Sie können diese Eingabe auf jede gewünschte Weise codieren" und nicht "Ihre Antwort muss nur für einen bestimmten Wert für diese Eingabe funktionieren, und Sie können auswählen, was das ist"
Kamil Drakari
@KamilDrakari ja, obwohl nicht ganz so, wie Sie es wollen - Sie sind immer noch auf ein Array mit 90 Elementen beschränkt.
ngm
"Also im Jahr 1927 könnte man sagen ..." - Ich denke, Sie meinen 1928.
Jonathan Allan

Antworten:

6

Gelee , 9 Bytes

PÐƤ⁹L¤ƤḋM

Eine dyadische Verknüpfung, die eine Liste aller maximal beginnenden 1-basierten Indizes ergibt.

Probieren Sie es online aus!

(oder ṡL}PÐƤ€ḋM)

Wie?

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
Jonathan Allan
quelle
3

Japt , 25 Bytes

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

Probieren Sie es online aus!

0-indizierte Ausgabe.

Erläuterung, mit Uals Liste der Renditen und Vals Liste der Investitionen:

ã                       :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

Bonus Betrug Antwort:

Japt , 13 Bytes

OvUÎò3 ®n dÃq

Probieren Sie es online aus!

Nimmt die Liste der Rückgaben als dieses Array , das ein Array von 90 Zeichenfolgen ist, wobei jede Zeichenfolge eine Ganzzahl der Basis 10 enthält, die mit 1929 Ziffern aufgefüllt ist. Ich glaube, dass dies technisch den Anforderungen entspricht. Der Link "Try it" enthält nur das erste Element der Liste "return", da das Ganze den Permalink-Generator kaputt gemacht hat, aber das ist das einzige, das verwendet wird. Sie können das Ganze aus dem Pastebin einfügen, wenn Sie möchten.

Erläuterung:

Wie bereits erwähnt, wird tatsächlich nur das erste Element des Arrays "return" verwendet. Jedes andere Element im Pastebin ist 0 und wird vom Programm ignoriert. Das erste Element wird durch erzeugt dies , das die Zeichenfolgendarstellung eines Japt Programm nimmt, dreht sich jedes Zeichen in eine 3 - stellige Nummer, und schließt sich diese Zahlen in eine neue Folge von nur Ziffern. Der Code, der codiert wird , ist dieser , was im Grunde meine Hauptantwort ist, angepasst, um die Rückgaben hart zu codieren. Dann ist das "Antwort" -Programm nur:

  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
Kamil Drakari
quelle
Ich bin mir nicht sicher, ob die 13-Byte-Version den Standardregeln entspricht (das Codieren des tatsächlichen Codes in flexible Eingaben scheint eine Lücke zu sein ), aber ich mag es trotzdem!
ngm
@ngm Ich meine, ich habe es eine betrügerische Antwort genannt und es aus einem bestimmten Grund zu einer echten Antwort gemacht. Ich habe hauptsächlich versucht, die Grenzen von "jedem anderen Array von 90 Zahlen, die Sie bevorzugen" zu erweitern.
Kamil Drakari
2

JavaScript (ES6), 73 Byte

Nimmt Eingabe als (annual_returns)(X). Das Ergebnis ist 0-indiziert.

a=>x=>a.map((_,i)=>x.map((c,j)=>(t=(t+c)*a[i+j])>m&&(r=i,m=t),t=0),m=0)|r

Probieren Sie es online aus!

Arnauld
quelle
2

J, 48 Bytes

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

Probieren Sie es online aus!

ungolfed

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

Wie

Nehmen Sie die Eingabeliste (z. B. 123) links und die Daten rechts.

#@[ ]\ ] Zerlegen Sie die Daten in Infixe, deren Länge mit der Eingabe übereinstimmt:

1.3788 0.8809 0.7152
       0.8809 0.7152 0.5293
              0.7152 0.5293 0.8485

[ ,."1 Zippen Sie nun jede dieser 3er-Gruppen mit der Eingabeliste

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

|.@ und kehre sie um:

3      2      1
0.7152 0.8809 1.3788

(verb to insert)/"2 Fügen Sie zwischen den Elementen jeder gezippten Dreiergruppe das Verb in Klammern ein.

3             2             1
        VERB          VERB
0.7152        0.8809        1.3788

({:@[ * {.@[ + */@]) ist das eingefügte Verb, das jedes Element der Liste der gezippten Dreiergruppen auf eine Zahl reduziert. Dies ist der Betrag, der in dieser Gruppe von Jahren verdient wurde:

          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. >./) Nehmen Sie die so reduzierte Liste und finden Sie den Index der max.

1 + [: Und füge eins hinzu

Jona
quelle
1

Gelee , 11 Bytes

ṡ⁹L¤U×\€UḋM

Probieren Sie es online aus!

Der Renditefaktor einer Einlage ist das kumulierte Produkt der Renditefaktoren in den Jahren bis zum Jahresende K. Wenn wir die Eingabe in umgekehrter Reihenfolge vornehmen und eine Jahreszahl als 2018- [Enddatum] ausgeben dürfen, funktioniert die 10-Byte- Lösung ×\⁹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
lirtosiast
quelle
ṡL}spart ein Byte über ṡ⁹L¤(mein alternativer 9-Byter ṡL}PÐƤ€ḋMist effektiv eine Golfversion)
Jonathan Allan
@ JonathanAllan Ich lerne immer noch Gelee. Wie genau funktioniert das }- ist es immer gleichbedeutend mit ⁹[monad]¤?
Lirtosiast
1
Nein, es ist nicht genau gleichwertig. Der }Quick behandelt die Monade zu ihrer Linken wie eine Dyade und verwendet das rechte Argument als linke Eingabe für diese Dyade (nichts mit dem linken Argument zu tun), so dass das Parsen von Code, der Code enthält, so L}ist, als wäre das eine Dyade. Während das Parsen des Codes, der enthält, so ⁹L¤ist, als wäre das ein Nilad - wenn Sie versuchen, den Ersatz in Eriks Code zu finden, funktioniert dies nicht, da der nächste Teil der Kette eine Dyade ist (während der nächste in Ihrer eine Monade ist).
Jonathan Allan
1

Python 2 , 97 Bytes

lambda r,v:max(range(len(r)-len(v)+1),key=lambda i:reduce(lambda x,(a,b):(x+a)*b,zip(v,r[i:]),0))

Probieren Sie es online aus!

Returns 0-indexed

TFeld
quelle
Der letzte Punkt von rsollte sein 1.1942. Auch len(r)ist 90.
Erik der Outgolfer
@EriktheOutgolfer behoben
TFeld
1

05AB1E , 21 20 Bytes

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

Viel zu lang..

0-indiziert.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

Œ                  # 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)
Kevin Cruijssen
quelle