]> gitweb.factorcode.org Git - factor.git/commitdiff
Some improvements to math-finance based on feedback.
authorJohn Benediktsson <mrjbq7@gmail.com>
Tue, 23 Sep 2008 21:10:04 +0000 (14:10 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Tue, 23 Sep 2008 21:10:04 +0000 (14:10 -0700)
extra/math/finance/finance.factor

index 75ea69386269964c158ecbd4633aa9aa89aecae0..ffb02208d385bd9a40dee3b37a73d726b51a2fe4 100644 (file)
@@ -1,36 +1,37 @@
 ! Copyright (C) 2008 John Benediktsson
 ! See http://factorcode.org/license.txt for BSD license
 
-USING: arrays kernel grouping math math.statistics sequences ;
+USING: arrays assocs fry kernel grouping math math.statistics math.vectors sequences ;
 
 IN: math.finance
 
 : enumerate ( seq -- newseq )
-    #! Returns a sequence where each element and its index
-    -1 swap [ [ 1+ ] dip swap [ 2array ] keep swap ] { } map-as swap drop ;
+    <enum> >alist ;
+
+<PRIVATE
+
+: weighted ( x y a -- z ) 
+    tuck [ * ] [ 1 swap - * ] 2bi* + ;
+
+: a ( n -- a ) 
+    1 + 2 swap / ;
+
+: first-rest ( seq -- first rest )
+    [ first ] keep 1 tail-slice ;
+
+PRIVATE>
 
 : ema ( seq n -- newseq )
-    #! An exponentially-weighted moving average:
-    #! A = 2.0 / (N + 1)
-    #! EMA[t] = (A * VAL[t]) + ((1-A) * EMA[t-1])
-    1+ 2.0 swap / dup 1 swap - swap rot
-    [ [ dup ] dip * ] map swap drop 0 swap
-    [ [ dup ] 2dip [ * ] dip + dup ] map 
-    [ drop drop ] dip 1 tail-slice >array ;
+    a swap first-rest swap '[ [ dup ] 2dip swap rot weighted ] accumulate 2nip ;
 
 : sma ( seq n -- newseq )
-    #! Simple moving average
     clump [ mean ] map ;
 
 : macd ( seq n1 n2 -- newseq )
-    #! Moving Average Convergence Divergence
-    #! MACD[t] = EMA2[t] - EMA1[t]
-    rot dup ema [ swap ema ] dip [ - ] 2map ;
+    rot dup ema [ swap ema ] dip v- ;
 
 : momentum ( seq n -- newseq )
-    #! Momentum
-    #! M[t] = P[t] - P[t-n]
     2dup tail-slice -rot swap [ length ] keep
-    [ - neg ] dip swap head-slice [ - ] 2map ;
+    [ - neg ] dip swap head-slice v- ;