@@ -19,13 +19,6 @@ var colors = [
19
19
]
20
20
21
21
var sAndP = [
22
- [ "1956" , 45.16 ] ,
23
- [ "1957" , 46.20 ] ,
24
- [ "1958" , 40.33 ] ,
25
- [ "1959" , 55.44 ] ,
26
- [ "1960" , 59.91 ] ,
27
- [ "1961" , 57.57 ] ,
28
- [ "1962" , 71.55 ] ,
29
22
[ "1963" , 63.10 ] ,
30
23
[ "1964" , 75.02 ] ,
31
24
[ "1965" , 84.75 ] ,
@@ -85,8 +78,69 @@ var sAndP = [
85
78
[ "Spacer" , "Spacer" ]
86
79
]
87
80
81
+ var bonds = [
82
+ [ "1963" , 4.00 ] ,
83
+ [ "1964" , 4.19 ] ,
84
+ [ "1965" , 4.28 ] ,
85
+ [ "1966" , 4.93 ] ,
86
+ [ "1967" , 5.07 ] ,
87
+ [ "1968" , 5.64 ] ,
88
+ [ "1969" , 6.67 ] ,
89
+ [ "1970" , 7.35 ] ,
90
+ [ "1971" , 6.16 ] ,
91
+ [ "1972" , 6.21 ] ,
92
+ [ "1973" , 6.85 ] ,
93
+ [ "1974" , 7.56 ] ,
94
+ [ "1975" , 7.99 ] ,
95
+ [ "1976" , 7.61 ] ,
96
+ [ "1977" , 7.42 ] ,
97
+ [ "1978" , 8.41 ] ,
98
+ [ "1979" , 9.43 ] ,
99
+ [ "1980" , 11.43 ] ,
100
+ [ "1981" , 13.92 ] ,
101
+ [ "1982" , 13.01 ] ,
102
+ [ "1983" , 11.10 ] ,
103
+ [ "1984" , 12.46 ] ,
104
+ [ "1985" , 10.62 ] ,
105
+ [ "1986" , 7.67 ] ,
106
+ [ "1987" , 8.39 ] ,
107
+ [ "1988" , 8.85 ] ,
108
+ [ "1989" , 8.49 ] ,
109
+ [ "1990" , 8.55 ] ,
110
+ [ "1991" , 7.86 ] ,
111
+ [ "1992" , 7.01 ] ,
112
+ [ "1993" , 5.87 ] ,
113
+ [ "1994" , 7.09 ] ,
114
+ [ "1995" , 6.57 ] ,
115
+ [ "1996" , 6.44 ] ,
116
+ [ "1997" , 6.35 ] ,
117
+ [ "1998" , 5.26 ] ,
118
+ [ "1999" , 5.65 ] ,
119
+ [ "2000" , 6.03 ] ,
120
+ [ "2001" , 5.02 ] ,
121
+ [ "2002" , 4.61 ] ,
122
+ [ "2003" , 4.01 ] ,
123
+ [ "2004" , 4.27 ] ,
124
+ [ "2005" , 4.29 ] ,
125
+ [ "2006" , 4.80 ] ,
126
+ [ "2007" , 4.63 ] ,
127
+ [ "2008" , 3.66 ] ,
128
+ [ "2009" , 3.26 ] ,
129
+ [ "2010" , 3.22 ] ,
130
+ [ "2011" , 2.78 ] ,
131
+ [ "2012" , 1.80 ] ,
132
+ [ "2013" , 2.35 ] ,
133
+ [ "2014" , 2.54 ] ,
134
+ [ "2015" , 2.14 ] ,
135
+ [ "2016" , 1.84 ] ,
136
+ [ "2017" , 2.33 ] ,
137
+ [ "2018" , 2.91 ] ,
138
+ [ "Spacer" , "Spacer" ]
139
+ ]
140
+
88
141
var dates = sAndP . map ( x => x [ 0 ] ) ;
89
- var prices = sAndP . map ( x => x [ 1 ] ) ;
142
+ var sAndPPrices = sAndP . map ( x => x [ 1 ] ) ;
143
+ var bondYields = bonds . map ( x => x [ 1 ] ) ;
90
144
var startIndex = 0
91
145
var endIndex = - 1
92
146
@@ -100,7 +154,7 @@ var config = {
100
154
datasets : [ {
101
155
label : "100% S&P" ,
102
156
borderColor : 'rgb(255, 99, 132)' ,
103
- data : prices . slice ( 0 , - 1 ) ,
157
+ data : getNewLine ( 100 , 0 , - 1 ) ,
104
158
percentStocks : 100 ,
105
159
fill : false
106
160
} ]
@@ -124,10 +178,12 @@ var config = {
124
178
125
179
document . getElementById ( 'addLine' ) . addEventListener ( 'click' , function ( ) {
126
180
var percentStocks = document . getElementById ( 'percentStocks' ) . value
127
- if ( percentStocks <= 100 && percentStocks >= 0 ) {
128
- var newLine = prices . slice ( startIndex , endIndex )
129
- newLine = newLine . map ( function ( el ) { return el * percentStocks / 100 } )
181
+ addLine ( percentStocks )
182
+ } ) ;
130
183
184
+ function addLine ( percentStocks ) {
185
+ if ( percentStocks <= 100 && percentStocks >= 0 ) {
186
+ var newLine = getNewLine ( percentStocks , startIndex , endIndex )
131
187
var colorIndex = Math . floor ( Math . random ( ) * colors . length )
132
188
133
189
config . data . datasets . push ( {
@@ -139,13 +195,17 @@ document.getElementById('addLine').addEventListener('click', function() {
139
195
} )
140
196
chart . update ( ) ;
141
197
}
142
- } ) ;
198
+ }
143
199
144
200
document . getElementById ( 'clear' ) . addEventListener ( 'click' , function ( ) {
145
- config . data . datasets = [ ]
146
- chart . update ( ) ;
201
+ clear ( )
147
202
} ) ;
148
203
204
+ function clear ( ) {
205
+ config . data . datasets = [ ]
206
+ chart . update ( ) ;
207
+ }
208
+
149
209
document . getElementById ( 'dateButton' ) . addEventListener ( 'click' , function ( ) {
150
210
var startDate = document . getElementById ( 'startDate' ) . value
151
211
startIndex = dates . indexOf ( startDate )
@@ -166,13 +226,44 @@ document.getElementById('dateButton').addEventListener('click', function() {
166
226
167
227
config . data . labels = dates . slice ( startIndex , endIndex ) ;
168
228
config . data . datasets . forEach ( function ( dataset ) {
169
- var newLine = prices . slice ( startIndex , endIndex )
170
- newLine = newLine . map ( function ( el ) { return el * dataset . percentStocks / 100 } )
171
- dataset . data = newLine
229
+ dataset . data = getNewLine ( dataset . percentStocks , startIndex , endIndex )
172
230
} ) ;
173
231
174
232
chart . update ( ) ;
175
233
} ) ;
176
234
235
+ function getNewLine ( percentStocks , startIndex , endIndex ) {
236
+ var decimalStocks = percentStocks / 100
237
+ var decimalBonds = 1 - decimalStocks
238
+ var stockReference = sAndPPrices . slice ( startIndex , endIndex )
239
+ var bondReference = bondYields . slice ( startIndex , endIndex )
240
+ var stockValue
241
+ var bondValue
242
+ var total = 100
243
+ var newLine = [ total ]
244
+
245
+ var iters = stockReference . length
246
+ for ( iter = 0 ; iter < iters ; iter ++ ) {
247
+ if ( iter + 1 == iters ) {
248
+ break
249
+ }
250
+
251
+ stockValue = total * decimalStocks
252
+ bondValue = total * decimalBonds
253
+
254
+ var stockPerformance = stockReference [ iter + 1 ] / stockReference [ iter ]
255
+ var bondPerformance = 1 + bondReference [ iter ] / 100
256
+
257
+ var endStock = stockValue * stockPerformance
258
+ var endBond = bondValue * bondPerformance
259
+
260
+ total = endStock + endBond
261
+
262
+ newLine . push ( total )
263
+ }
264
+
265
+ return newLine
266
+ }
267
+
177
268
178
269
var chart = new Chart ( ctx , config ) ;
0 commit comments