Temukan periode terbaik untuk berinvestasi dalam dana indeks S & P500

8

Berikut adalah pengembalian tahunan untuk dana indeks saham S&P 500 hipotetis untuk setiap tahun kalender dari 1928 hingga 2017, dinyatakan sebagai pengganda. Jadi pada tahun 1928 Anda mungkin mengatakan "indeks naik 37,88%" yang saya wakili di sini oleh 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

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

Tantangan

Diberikan sebagai input:

  • susunan pengembalian tahunan (tetapi lihat Aturan 2. di bawah)
  • sebuah array X dari 1K90 angka positif (jumlah yang diinvestasikan dalam setiap tahun periode investasi)

menulis sebuah program atau fungsi yang menghasilkan apa yang akan menjadi periode "terbaik" K berturut-turut untuk menginvestasikan jumlah dalam , di mana:X

  • setiap jumlah diinvestasikan pada awal tahun.
  • apa pun yang tersisa setelah setiap tahun diinvestasikan kembali pada awal setiap tahun berikutnya.
  • "terbaik" berarti jumlah terbesar pada akhir periode tahunK

Aturan

  1. Ini adalah , sehingga byte paling sedikit di setiap bahasa menang. Aturan standar berlaku. Penjelasan didorong.

  2. Jika Anda tidak menyukai cara saya merepresentasikan array pengembalian tahunan, Anda dapat mengubahnya ke array 90 nomor lainnya yang Anda inginkan.

  3. Anda dapat menampilkan periode tahun terbaik dengan cara yang konsisten (mis. 0-diindeks atau 1-diindeks, tahun pertama dan / atau tahun terakhir yang diinvestasikan, dll.) Tetapi Anda perlu mengatakan apa yang diwakili oleh output Anda jika bukan tidak jelas.K

  4. Dalam hal seri, hasilkan salah satu atau semua jawaban yang benar.

Contoh perhitungan

Misalkan .X=[10000,20000,30000]

Jika Anda menginvestasikan jumlah ini pada tahun 1928, 1929, dan 1930 (indeks 1, 2, dan 3), Anda akan berakhir dengan 42743.10. Sedih.

Tetapi jika Anda telah menginvestasikan jumlah tersebut pada tahun 2014, 2015, dan 2016 (indeks 1 87, 88, dan 89) Anda akan berakhir dengan 66722,66. Sedikit lebih baik.

Ternyata periode tiga tahun terbaik untuk menginvestasikan jumlah ini adalah 1995, 1996, dan 1997 (1-indeks 68, 69, dan 70), menghasilkan 91942.91. Bagus.

Uji kasus

1-diindeks, tahun pertama periode optimal

[ 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
sumber
Aturan 2 mengatakan kita bisa menggantinya dengan array 90 angka lainnya. Saya menganggap itu tidak valid untuk menggantinya dengan array yang 1 diikuti oleh 89 0s, sehingga 1 selalu jawaban yang benar? Atau maksud Anda "mengambil input apa pun yang Anda inginkan, tetapi jumlah yang mendapatkan output harus cocok dengan kasus uji"?
Kamil Drakari
1
@KamilDrakari Anda dapat melakukan transformasi 1-1 yang Anda suka. Anda harus mengakhiri dengan jawaban yang benar yang sebenarnya. Idenya adalah bahwa seseorang mungkin lebih suka pengembalian kumulatif, atau pengembalian itu minus 1. Ada untuk fleksibilitas. Tetapi jika ada juga beberapa peluang golf tersembunyi, biarlah.
ngm
@ ngm oke jadi "Anda dapat menyandikan input ini dengan cara apa pun yang Anda inginkan" daripada "jawaban Anda hanya perlu bekerja untuk nilai spesifik untuk input ini, dan Anda bisa memilih apa itu"
Kamil Drakari
@ KamilDrakari ya, meskipun tidak dengan cara apa pun yang Anda inginkan - Anda masih terbatas pada array dengan 90 elemen.
ngm
"Jadi pada tahun 1927 Anda mungkin mengatakan ..." - Saya pikir maksud Anda 1928.
Jonathan Allan

Jawaban:

6

Jelly , 9 byte

PÐƤ⁹L¤ƤḋM

Sebuah tautan diad yang menghasilkan daftar semua indeks awal berbasis 1 yang maksimal.

Cobalah online!

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

Bagaimana?

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
sumber
3

Japt , 25 byte

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

Cobalah online!

Output terindeks 0.

Penjelasan, dengan Usebagai daftar pengembalian dan Vsebagai daftar investasi:

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

Jawaban kecurangan bonus:

Japt , 13 byte

OvUÎò3 ®n dÃq

Cobalah online!

Mengambil daftar pengembalian sebagai array ini , yang merupakan array dari 90 string di mana setiap string berisi integer basis-10 yang diisi hingga 1929 digit; Saya percaya ini secara teknis memenuhi persyaratan. Tautan "Coba saja" hanya memiliki elemen pertama dari daftar "pengembalian" karena semuanya memecahkan generator permalink, tetapi hanya itu yang digunakan. Anda dapat menempelkan semuanya dari pastebin jika Anda mau.

Penjelasan:

Seperti disebutkan, hanya elemen pertama dari array "pengembalian" yang benar-benar digunakan; setiap elemen lainnya adalah 0 dalam pastebin dan diabaikan oleh program. Elemen pertama dihasilkan oleh ini , yang mengambil representasi string dari program Japt, mengubah masing-masing karakter menjadi angka 3 digit, dan menggabungkan angka-angka itu menjadi string baru dengan hanya digit. Kode yang dikodekan adalah ini , yang pada dasarnya jawaban utama saya disesuaikan dengan hard-code pengembalian. Maka program "jawaban" adalah:

  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
sumber
Saya tidak yakin apakah versi 13 byte mengikuti aturan default (pengkodean kode aktual menjadi input fleksibel sepertinya celah ), tetapi saya tetap menyukainya!
ngm
@ ngm maksud saya, saya menyebutnya jawaban curang dan menempelkannya pada jawaban nyata karena suatu alasan. Saya terutama hanya mencoba untuk meregangkan batas "array lain dari 90 angka yang Anda sukai".
Kamil Drakari
2

JavaScript (ES6), 73 byte

Mengambil input sebagai (annual_returns)(X). Hasilnya adalah 0-diindeks.

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

Cobalah online!

Arnauld
sumber
2

J, 48 byte

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

Cobalah online!

ungolfed

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

bagaimana

Ambil daftar input (misalnya, 123) di sebelah kiri, data di sebelah kanan.

#@[ ]\ ] Memotong data menjadi infiks yang panjangnya cocok dengan input:

1.3788 0.8809 0.7152
       0.8809 0.7152 0.5293
              0.7152 0.5293 0.8485

[ ,."1 sekarang zip masing-masing kelompok 3 dengan daftar input

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

|.@ dan balikkan:

3      2      1
0.7152 0.8809 1.3788

(verb to insert)/"2 Di antara item-item dari masing-masing kelompok zip 3, masukkan kata kerja dalam tanda kurung.

3             2             1
        VERB          VERB
0.7152        0.8809        1.3788

({:@[ * {.@[ + */@]) adalah kata kerja yang disisipkan, yang akan mengurangi setiap item dari daftar kelompok zip bertiga menjadi satu nomor, yang merupakan jumlah yang diperoleh selama kelompok tahun:

          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. >./) Ambil daftar yang dikurangi dan temukan indeks maks.

1 + [: Dan tambahkan satu

Jonah
sumber
1

Jeli , 11 byte

ṡ⁹L¤U×\€UḋM

Cobalah online!

Faktor pengembalian pada deposito adalah produk kumulatif dari faktor-faktor pengembalian di tahun-tahun sampai akhir Kperiode tahun. Jika kita diizinkan untuk mengambil input secara terbalik dan menghasilkan angka tahun sebagai 2018- [tanggal akhir], solusi 10 byte×\⁹L¤Ƥ×S€M berfungsi.

ṡ                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
sumber
ṡL}menghemat satu byte lebih ṡ⁹L¤(byter 9 alternatif saya, ṡL}PÐƤ€ḋMsecara efektif adalah versi yang lebih golf)
Jonathan Allan
@ Jonathan Allan aku masih belajar Jelly. Bagaimana tepatnya cara }kerjanya-- apakah selalu setara ⁹[monad]¤?
lirtosiast
1
Tidak, tidak persis sama. The }memperlakukan cepat monad ke kiri seolah-olah angka dua dan menggunakan argumen yang tepat sebagai masukan kiri ke angka dua itu (melakukan apa-apa dengan argumen kiri), sebagai parsing seperti kode yang berisi L}seolah-olah yang angka dua, sementara parsing dari kode yang berisi ⁹L¤adalah seolah-olah itu nilad - jika Anda mencoba penggantian dalam kode Erik itu tidak akan berfungsi karena bagian berikutnya dari rantai adalah angka dua (sedangkan yang berikutnya di Anda adalah monad).
Jonathan Allan
1

Python 2 , 97 byte

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))

Cobalah online!

Pengembalian 0-indeks

TFeld
sumber
Item terakhir rseharusnya 1.1942. Juga, len(r)adalah 90.
Erik the Outgolfer
@EriktheOutgolfer Tetap
TFeld
1

05AB1E , 21 20 byte

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

Terlalu lama..

Diindeks 0.

Cobalah secara online atau verifikasi semua kasus uji .

Penjelasan:

Œ                  # 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
sumber
0

Jelly , 15 byte

ṡ⁹L¤ż€+Ṫ×Ḣʋƒ€0M

Cobalah online!

Erik the Outgolfer
sumber