Tìm khoảng thời gian tốt nhất để đầu tư vào quỹ chỉ số S & P500


8

Dưới đây là lợi nhuận hàng năm cho một quỹ chỉ số chứng khoán S & P 500 giả định cho mỗi năm dương lịch từ 1928 đến 2017, được biểu thị dưới dạng số nhân. Vì vậy, vào năm 1928, bạn có thể nói "chỉ số tăng 37,88%" mà tôi đã đại diện ở đây là 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

Nguồn: https://www.macrotrends.net/2526/sp-500-historical-annual-returns

Thử thách

Đưa ra làm đầu vào:

  • mảng lợi nhuận hàng năm (nhưng xem Quy tắc 2. bên dưới)
  • một mảng gồm số dương (số tiền cần đầu tư mỗi năm của giai đoạn đầu tư)X1K90

viết chương trình hoặc hàm xuất ra khoảng thời gian "tốt nhất" trong năm đầu tiên để đầu tư số tiền vào , trong đó:KX

  • mỗi số tiền được đầu tư vào đầu năm.
  • mọi thứ còn lại sau mỗi năm được tái đầu tư vào đầu mỗi năm tiếp theo.
  • "tốt nhất" có nghĩa là số tiền lớn nhất vào cuối giai đoạn năm.K

Quy tắc

  1. Đây là , do đó, ít byte nhất trong mỗi ngôn ngữ sẽ thắng. Quy tắc chuẩn áp dụng. Giải thích khuyến khích.

  2. Nếu bạn không thích cách tôi thể hiện mảng lợi nhuận hàng năm, bạn có thể thay đổi chúng thành bất kỳ mảng 90 số nào khác mà bạn thích.

  3. Bạn có thể đưa ra khoảng thời gian năm tốt nhất theo bất kỳ cách nhất quán nào (ví dụ: 0 chỉ mục hoặc 1 chỉ mục, năm đầu tiên và / hoặc năm cuối cùng đã đầu tư, v.v.) nhưng bạn cần nói đầu ra của bạn đại diện cho điều gì nếu nó không ' t rõ ràng.K

  4. Trong trường hợp hòa, hãy đưa ra bất kỳ hoặc tất cả các câu trả lời đúng.

Tính toán ví dụ

Giả sử .X=[10000,20000,30000]

Nếu bạn đã đầu tư số tiền này vào năm 1928, 1929 và 1930 (các chỉ số 1, 2 và 3), bạn sẽ kết thúc với 42743.10. Buồn.

Nhưng nếu bạn đã đầu tư số tiền đó vào năm 2014, 2015 và 2016 (1 chỉ số 87, 88 và 89), bạn sẽ kết thúc với 66722.66. Tốt hơn một chút

Hóa ra khoảng thời gian ba năm tốt nhất để đầu tư số tiền này sẽ là 1995, 1996 và 1997 (1 chỉ số 68, 69 và 70), dẫn đến 91942.91. Đẹp.

Các trường hợp thử nghiệm

1 chỉ số, năm đầu tiên của giai đoạn tối ưu

[ 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

Quy tắc 2 nói rằng chúng ta có thể thay thế chúng bằng bất kỳ mảng 90 số nào khác. Tôi giả sử nó không hợp lệ để thay thế nó bằng một mảng có 1 theo sau là 89 0, vì vậy 1 luôn là câu trả lời đúng? Hay bạn có nghĩa là "lấy bất cứ thứ gì bạn muốn, nhưng số nhận được đầu ra phải khớp với các trường hợp kiểm tra"?
Kamil Drakari

1
@KamilDrakari bạn có thể thực hiện bất kỳ chuyển đổi 1-1 nào bạn muốn. Bạn cần phải kết thúc với câu trả lời đúng thực tế, mặc dù. Ý tưởng là ai đó có thể thích lợi nhuận tích lũy hoặc lợi nhuận trừ đi 1. Đó là sự linh hoạt. Nhưng nếu cũng có một số cơ hội chơi gôn ẩn, thì hãy là nó.
ngm

@ngm không sao, vì vậy "bạn có thể mã hóa đầu vào này theo bất kỳ cách nào bạn muốn" chứ không phải "câu trả lời của bạn chỉ cần hoạt động cho một giá trị cụ thể cho đầu vào này và bạn có thể chọn đó là gì"
Kamil Drakari

@KamilDrakari có, mặc dù không hoàn toàn theo cách bạn muốn - bạn vẫn bị giới hạn trong một mảng với 90 phần tử.
ngm

"Vì vậy, vào năm 1927, bạn có thể nói ..." - Tôi nghĩ bạn có nghĩa là 1928.
Jonathan Allan

Câu trả lời:


6

Thạch , 9 byte

PÐƤ⁹L¤ƤḋM

Một liên kết dyadic mang lại một danh sách tất cả các chỉ số dựa trên 1 bắt đầu tối đa.

Hãy thử trực tuyến!

(hoặc ṡL}PÐƤ€ḋM)

Làm sao?

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 byte

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

Hãy thử trực tuyến!

Đầu ra 0 chỉ mục.

Giải thích, với Udanh sách lợi nhuận và Vdanh sách các khoản đầu tư:

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

Phần thưởng trả lời gian lận:

Japt , 13 byte

OvUÎò3 ®n dÃq

Hãy thử trực tuyến!

Lấy danh sách trả về dưới dạng mảng này , là một mảng gồm 90 chuỗi trong đó mỗi chuỗi chứa một số nguyên cơ bản-10 được đệm đến 1929 chữ số; Tôi tin rằng kỹ thuật này đáp ứng các yêu cầu. Liên kết "Dùng thử" chỉ có phần tử đầu tiên của danh sách "trả về" vì toàn bộ đã phá vỡ trình tạo permalink, nhưng đó là phần duy nhất được sử dụng. Bạn có thể dán toàn bộ từ pastebin nếu bạn muốn.

Giải trình:

Như đã đề cập, chỉ phần tử đầu tiên của mảng "trả về" thực sự được sử dụng; mọi phần tử khác là 0 trong pastebin và bị chương trình bỏ qua. Phần tử đầu tiên được tạo bởi phần tử này , lấy biểu diễn chuỗi của chương trình Japt, biến mỗi ký tự thành một số có 3 chữ số và nối các số đó thành một chuỗi mới chỉ gồm các chữ số. Mã được mã hóa là cái này , về cơ bản là câu trả lời chính của tôi được điều chỉnh thành mã cứng trả về. Sau đó, chương trình "trả lời" chỉ là:

  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

Tôi không chắc liệu phiên bản 13 byte có tuân theo các quy tắc mặc định hay không (mã hóa mã thực tế thành các đầu vào linh hoạt có vẻ như là một lỗ hổng ), nhưng dù sao tôi cũng thích nó!
ngm

@ngm Ý tôi là, tôi gọi nó là một câu trả lời gian lận và giải quyết nó thành một câu trả lời thực sự vì một lý do. Tôi chủ yếu chỉ cố gắng kéo dài giới hạn của "bất kỳ mảng 90 số nào khác mà bạn thích".
Kamil Drakari

2

JavaScript (ES6), 73 byte

Đưa đầu vào là (annual_returns)(X). Kết quả là 0 chỉ mục.

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

Hãy thử trực tuyến!


2

J, 48 byte

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

Hãy thử trực tuyến!

vô dụng

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

làm sao

Lấy danh sách đầu vào (ví dụ, 123) bên trái, dữ liệu bên phải.

#@[ ]\ ] Cắt dữ liệu thành các phần tử có độ dài khớp với đầu vào:

1.3788 0.8809 0.7152
       0.8809 0.7152 0.5293
              0.7152 0.5293 0.8485

[ ,."1 Bây giờ nén từng nhóm 3 trong số đó với danh sách đầu vào

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

|.@ và đảo ngược chúng:

3      2      1
0.7152 0.8809 1.3788

(verb to insert)/"2 Giữa các mục của mỗi nhóm 3 khóa, chèn động từ trong ngoặc đơn.

3             2             1
        VERB          VERB
0.7152        0.8809        1.3788

({:@[ * {.@[ + */@]) là động từ được chèn, sẽ giảm từng mục trong danh sách các nhóm ba mươi được nén xuống còn một số, là số tiền kiếm được trong nhóm năm đó:

          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. >./) Lấy danh sách do đó giảm và tìm chỉ số của max.

1 + [: Và thêm một


1

Thạch , 11 byte

ṡ⁹L¤U×\€UḋM

Hãy thử trực tuyến!

Hệ số hoàn trả của khoản tiền gửi là sản phẩm tích lũy của các yếu tố hoàn trả trong các năm cho đến cuối Kkỳ. Nếu chúng tôi được phép lấy đầu vào ngược lại và xuất số năm là 2018- [ngày kết thúc], giải pháp 10 byte×\⁹L¤Ƥ×S€M hoạt động.

ṡ                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}tiết kiệm một byte hơn ṡ⁹L¤(9 thay thế của tôi, thực sự ṡL}PÐƤ€ḋMlà một phiên bản được chơi nhiều hơn)
Jonathan Allan

@Jonathan ALLan Tôi vẫn đang học Jelly. Chính xác thì nó hoạt động như thế nào }- nó luôn luôn tương đương với ⁹[monad]¤?
lirtosiast

1
Không, nó không chính xác tương đương. Các }xử lý nhanh chóng các đơn nguyên bên trái của nó như thể nó là một cặp và sử dụng lập luận đúng như đầu vào trái để hai vật giống nhau đó (không làm gì với lập luận trái), như vậy các phân tích cú pháp của mã chứa L}là như thể đó là một cặp, trong khi phân tích cú pháp mã chứa ⁹L¤như thể đó là một con số không - nếu bạn thử thay thế mã của Erik, nó sẽ không hoạt động vì phần tiếp theo của chuỗi là một con đê (trong khi phần tiếp theo của bạn là một đơn nguyên).
Jonathan Allan


1

05AB1E , 21 20 byte

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

Con đường quá dài ..

Chỉ số 0.

Hãy thử trực tuyến hoặc xác minh tất cả các trường hợp thử nghiệm .

Giải trình:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.