MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: financial chart with volumes

  • To: mathgroup at
  • Subject: [mg93866] Re: financial chart with volumes
  • From: Andreas <aagas at>
  • Date: Thu, 27 Nov 2008 05:32:28 -0500 (EST)

I took a further if not quite elegant shot at a candle stick chart.

dateOffset = 100;
datesStartEnd = {DatePlus[DateList[], -dateOffset], DateList[]};
instrument = "IBM";

(* The following uses David Parks' GetFinancialData[] function (reproduced at the end of this post):*)

financialData = 
   instrument, {"Open", "High", "Low", 
    "Close"}, {DatePlus[DateList[], -dateOffset], DateList[], 

(* The next 6 lines take the financial data and through a series of steps form 2 data lists: openAboveClose and closeAboveOpen. They each have a list of opening prices and a list of closing prices, but only for the relevant dates. When we plot these below they will make up the different colored candle bodies.

I know, the code looks ridiculously complicated to me.  Mathematica must have a more elegant way to generate these data sets. I tried to use Select[] but to no avail... Any suggestions welcome.*)

t1 = financialData[[All, 2]] - financialData[[All, 5]];
t2 = Partition[
   Flatten[Table[{financialData[[i]], t1[[i]]}, {i, 1, 
       Length[financialData]}][[All]], 2], 6];

t3a = DeleteCases[
   Table[If[t2[[i, 6]] > 0, t2[[i]]], {i, 1, Length[t2]}], Null];
t3b = DeleteCases[
   Table[If[t2[[i, 6]] <= 0, t2[[i]]], {i, 1, Length[t2]}], Null];

openAboveClose = {t3a[[All, ;; 2]], t3a[[All, {1, 5}]]};
closeAboveOpen = {t3b[[All, ;; 2]], t3b[[All, {1, 5}]]};

(* The following produces a 2 data set list to generate the high to low line of the candlestick chart *)

highLow = {FinancialData[instrument, "Low", datesStartEnd], 
   FinancialData[instrument, "High", datesStartEnd]};

(* Ploting proceeds quite directly, 3 overlaid DateListPlots: 1 for the high to low line, 1 for days where the market opens higher than its close, and 1 for the reverse.  The candle bodies scale relative to both the number of intervals plotted and the ImageSize of the overall chart. *)

 {DateListPlot[highLow , Filling -> {1 -> {2}}, 
   FillingStyle -> Directive[Black, Thin], PlotMarkers -> {"", ""}],
  DateListPlot[openAboveClose , Filling -> {1 -> {2}}, 
   FillingStyle -> 
    Directive[Red, Thickness[.0075*100/dateOffset], Opacity[1]], 
   PlotMarkers -> {"", ""}],
  DateListPlot[closeAboveOpen , Filling -> {1 -> {2}}, 
   FillingStyle -> 
    Directive[Blue, Thickness[.0075*100/dateOffset], Opacity[1]], 
   PlotMarkers -> {"", ""}]
  }, ImageSize -> 400, PlotLabel -> instrument

One can easily change the color of the candles, and they stay readable with quite a few bars. 

To summarize the strategy, I broke up the data into pieces which would each have different graphic characteristics in the final chart, then assembled the pieces using Show[].

One could combine this with some of the other responses in this thread to display volume or other indicators.

Again, if anyone has any ideas for producing the data sets a bit more elegantly, I'd much appreciate it.  

(I've wanted to do this for a long time ;-)

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.";

   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]]

  • Prev by Date: Re: Package Problem
  • Next by Date: Re: Re: v.7.0 issues
  • Previous by thread: Re: financial chart with volumes
  • Next by thread: pass by reference