1 people like it.
Like the snippet!
Processing Prices & Charting (Demo)
Sample code using a simple library for downloading Yahoo stock prices. The demo shows how to process sequences and so on (to run this, load & run previous snippet).
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
|
// --------------------------------------------------------
// Downlaod Facebook stock prices & draw line chart
let fb = Yahoo.GetPrices("FB")
Plot.Line(fb)
Plot.Clear()
// TASK #1: Download 'AAPL' data and draw the chart
// (...)
// --------------------------------------------------------
// Do some calculations with Facebook stock prices
let count = Seq.length fb
let sum = Seq.sum fb
let avg = sum / float count
// Declare a function that calculates the average
let average data =
let count = Seq.length data
let sum = Seq.sum data
sum / float count
average fb
// Simple function with multiple arguments and type annotations
let triangle (a:float) (b:float) =
sqrt ((pown a 2) + (pown b 2))
triangle 3.0 4.0
// Using F# sequence expressions to work with data
let diffs = [ for v in fb -> v - avg ]
// --------------------------------------------------------
// TASK #2a: Calculate the standard deviation of FB prices
// TASK #2b: Write a function 'sdv' that takes a parameter
// (...)
// --------------------------------------------------------
// More advanced sequence expressions
let avg = Seq.average aapl
// More explicit way of writin the previous
// (a lot more powerful - we can filter, etc.)
let diffs =
[ for v in aapl do
yield v - avg ]
// Count number of days when price is above average
let more =
[ for v in aapl do
if v > avg then yield v ]
Seq.length more
// TASK #3: Compare the days when price is above/below avg
// --------------------------------------------------------
// More functions for processing sequences
// Sort & reverse the sequence
let sorted = Seq.rev (Seq.sort fb)
Plot.Line(sorted, name="Sorted")
Plot.Line(fb, name="Normal")
Plot.Clear()
// Take first and last elements
Seq.nth 0 fb
Seq.nth ((Seq.length fb) - 1) fb
// TASK #4a: Calculate the median of the Facebook prices
// TASK #4b: Write a function & use it on Apple data too!
// (...)
// Get values as sequence of pairs (previous and next day price)
let pairs = Seq.pairwise fb
[ for (prev, next) in pairs do
yield (prev + next) / 2.0 ]
// TASK #5: Calculate how many times did the price
// go up/down between the two consequent days
// --------------------------------------------------------
// Using functions that take other functions as parameter
let avg = Seq.average fb
let diff value = value - avg
// Apply 'diff' to all values of the 'fb' sequence
Seq.map diff fb
// Same thing, more elegantly, using lambda function
Seq.map (fun value -> value - avg) fb
// Count values greater than the average
Seq.length (Seq.filter (fun value -> value > avg) fb)
// Nicer way using the pipelining operator
fb |> Seq.filter (fun value -> value > avg)
|> Seq.length
// TASK #6: Rewrite the calculation of SDV (or other
// previous examples) using Seq.filter/map and lambdas
// (...)
// --------------------------------------------------------
// Download MSFT and YHOO prices & draw them in a single chart
let yhoo = Yahoo.GetPrices("YHOO", from = DateTime(2012, 1, 1))
let msft = Yahoo.GetPrices("MSFT", from = DateTime(2012, 1, 1))
Plot.Line(yhoo, name="Yhoo", range=(10.0, 35.0))
Plot.Line(msft, name="Msft", range=(10.0, 35.0))
Plot.Clear()
// TASK #7 (BONUS): The Seq.windowed function generalizes
// Seq.pairwise and returns windows of any given size
// (As sequences - so you get sequence of sequences!)
// TASK #7a: Use the function to calculate floating average
// over 10 days and plot that together with the origianl values
// TASK #7b: Use the function & your previous 'sdv' to
// show the price with two more lines showing value +/- sdv
|
val fb : seq<float>
Full name: Script.fb
val count : int
Full name: Script.count
module Seq
from Microsoft.FSharp.Collections
val length : source:seq<'T> -> int
Full name: Microsoft.FSharp.Collections.Seq.length
val sum : float
Full name: Script.sum
val sum : source:seq<'T> -> 'T (requires member ( + ) and member get_Zero)
Full name: Microsoft.FSharp.Collections.Seq.sum
val avg : float
Full name: Script.avg
Multiple items
val float : value:'T -> float (requires member op_Explicit)
Full name: Microsoft.FSharp.Core.Operators.float
--------------------
type float = System.Double
Full name: Microsoft.FSharp.Core.float
--------------------
type float<'Measure> = float
Full name: Microsoft.FSharp.Core.float<_>
val average : data:seq<float> -> float
Full name: Script.average
val data : seq<float>
val count : int
val sum : float
val triangle : a:float -> b:float -> float
Full name: Script.triangle
val a : float
val b : float
val sqrt : value:'T -> 'U (requires member Sqrt)
Full name: Microsoft.FSharp.Core.Operators.sqrt
val pown : x:'T -> n:int -> 'T (requires member get_One and member ( * ) and member ( / ))
Full name: Microsoft.FSharp.Core.Operators.pown
val diffs : float list
Full name: Script.diffs
val v : float
val avg : int
Full name: Script.avg
val average : source:seq<'T> -> 'T (requires member ( + ) and member DivideByInt and member get_Zero)
Full name: Microsoft.FSharp.Collections.Seq.average
val diffs : int list
Full name: Script.diffs
val v : int
val more : int list
Full name: Script.more
val sorted : obj
Full name: Script.sorted
val sort : source:seq<'T> -> seq<'T> (requires comparison)
Full name: Microsoft.FSharp.Collections.Seq.sort
val nth : index:int -> source:seq<'T> -> 'T
Full name: Microsoft.FSharp.Collections.Seq.nth
val pairs : seq<float * float>
Full name: Script.pairs
val pairwise : source:seq<'T> -> seq<'T * 'T>
Full name: Microsoft.FSharp.Collections.Seq.pairwise
val prev : float
val next : float
val diff : value:float -> float
Full name: Script.diff
val value : float
val map : mapping:('T -> 'U) -> source:seq<'T> -> seq<'U>
Full name: Microsoft.FSharp.Collections.Seq.map
val filter : predicate:('T -> bool) -> source:seq<'T> -> seq<'T>
Full name: Microsoft.FSharp.Collections.Seq.filter
val yhoo : obj
Full name: Script.yhoo
val msft : obj
Full name: Script.msft
More information