financial chart with volumes
- To: mathgroup at smc.vnet.net
- Subject: [mg97139] financial chart with volumes
- From: mike.honeychurch at gmail.com
- Date: Fri, 6 Mar 2009 04:25:14 -0500 (EST)
There was an interesting thread on Nov 24 about including volumes with price to create a "typical" financial plot. The code below makes some changes to the various codes posted back then in order to "trick" the output to display volume ticks and scale. Mike ------------ Clear[getFinancialData]; (* getFinancialData was written by David Park *) getFinancialData::usage = "GetFinancialData[name, {property1,property2...},iterator] will \ generate a data set where each record will contain {datelist, \ propertyvalues..}. The iterator is the standard {start,end, period} \ used in FinancialData. This is basically a method of retrieving a \ number of property values at once."; SyntaxInformation[ getFinancialData] = {"ArgumentsPattern" -> {_, {_, __}, _}}; getFinancialData[name_String, {first_String, rest__String}, iterator_List] := Module[{work, other}, work = Transpose@FinancialData[name, first, iterator]; other = FinancialData[name, #, iterator, "Value"] & /@ {rest}; Transpose[Join[work, other]] ] (* volume label *) label /: MakeBoxes[label[x_, y_], StandardForm] := RowBox[{SuperscriptBox[MakeBoxes[x, StandardForm], MakeBoxes[y, StandardForm]]}]; ClearAll[financialChart1]; (* this function is a hack of something I saw on MathGroup *) (* \ candelstick type chart with volumes *) financialChart1[company_String, startDate_List] := financialChart1[company, startDate, Take[DateList[], 3]]; financialChart1[company_String, startDate_List, endDate_List] := Module[{dateForm, data, open, high, highest, close, low, lowest, openFall, closeFall, openRise, closeRise, volume, maxVolume, ex, maxVolumeScale, adjustedVolume, left, right}, dateForm = {"Day", " ", "MonthNameShort", " ", "YearShort"}; data = getFinancialData[ company, {"Open", "High", "Low", "Close", "Volume"}, {startDate, endDate}]; open = data[[All, {1, 2}]]; high = data[[All, {1, 3}]]; highest = Max[data[[All, 3]]]; close = data[[All, {1, 4}]]; low = data[[All, {1, 5}]]; lowest = Min[data[[All, 5]]]; (* create lists: Open on falling day, Close on Falling day, Open in rising day, Close on rising day *) {openFall, closeFall, openRise, closeRise} = Map[If[#[[2]] >= #[[ 5]], {{#[[1]], #[[2]]}, {#[[1]], #[[5]]}, {#[[1]], Null}, {#[[1]], Null}}, {{#[[1]], Null}, {#[[1]], Null}, {#[[1]], #[[2]]}, {#[[1]], #[[5]]}}] &, data] // Transpose; (*volumes*) volume = data[[All, {1, 6}]]; maxVolume = Max[data[[All, 6]]]; ex = IntegerLength[maxVolume] - 1; maxVolumeScale = Ceiling[maxVolume*10^-ex]; adjustedVolume = ({#1[[1]], highest*0.25*(#1[[2]]/maxVolume - 1.)} &) /@ volume; (* ticks *) left[xmin_, xmax_] := Join[Table[{x, ToString[ PaddedForm[ maxVolumeScale*(1 - x/Floor[xmin]), {2, 1}]], {0.01, 0}}, {x, Floor[xmin], -0.01, -Floor[xmin]/4.}], Table[{x, ToString[x], {0.01, 0}}, {x, 0, 5*Ceiling[xmax/5], Ceiling[xmax/5]}]]; right[xmin_, xmax_] := Table[{x, "", {0.01, 0}}, {x, 0, 5*Ceiling[xmax/5], Ceiling[xmax/5]}]; (* plot *) DateListPlot[{high, low, adjustedVolume, openFall, closeFall, openRise, closeRise}, Filling -> {1 -> {{2}, Directive[Black, AbsoluteThickness[1]]}, 3 -> {-highest*0.25, {{Thick, Darker[Blue, .6]}}}, 4 -> {{5}, Directive[Red, AbsoluteThickness[2.5]]}, 6 -> {{7}, Directive[Green, AbsoluteThickness[2.5]]}}, GridLines -> {Automatic, Function[{min, max}, Join[Range[Floor[min], 0, -Floor[min]/4.], Range[0, Ceiling[max], Ceiling[max/5]], {{0, {Black, AbsoluteThickness[1]}}}]]}, PlotMarkers -> {"", "", "", "", "", "", ""}, FrameLabel -> {None, "Vol. (\[Times] " <> ToString[label[10, ex], StandardForm] <> ")\t\t\tPrice (US$)\t\t"}, PlotLabel -> FinancialData[company, "Name"] <> ", " <> DateString[startDate, dateForm] <> " - " <> DateString[endDate, dateForm], ImageSize -> 500, PlotRange -> {Automatic, {-highest*0.25, Automatic}}, FrameTicks -> {Automatic, left, Automatic, right}]];