Significant update to the Bloomberg to Mathematica link

I’ve been making significant changes to the Bloomberg-to-Mathematica link recently, including

  1. the ability to specify whether historical data has DPDF adjustments (in other words, whether or not prices have been adjusted for dividends, splits, and other capital events),
  2. the ability to pull bulk data like historical dividend records and current holders, and
  3. the ability to keep the link live between queries, significantly reducing latency.

Other improvements include more sophisticated handling and reporting of errors and more widespread use of modern Mathematica data types (Associations and TimeSeries). I will provide all the source code, perhaps in the form of a GitHub depository. The new and improved functions are based on Wolfram’s current WSTP libraries and the current version of the Bloomberg BLP API. I’ve built to 32-bit architecture but I believe that 64-bit versions should be possible as well.

I’m waiting for Bloomberg to help with one source of crashes (when a company announces a distribution but cancels it before record date). When that’s taken care of I will upload the improved binaries and interfaces, etc. Those who want to play with the source code should visit

[update March 7, 2016: the new executables are also available on Github, at]

Disassembling the Apple Studio Display 21″ CRT

Once upon a time, computers used cathode ray tube monitors (CRTs), and the best ones were made by Sony, and in 1999 Apple bought some Sony tubes for use in creating the wonderful monster that is the Apple Studio Display 21″ CRT.

It was beautiful and enormous.

The monitor is almost three feet deep.

The monitor is almost three feet deep.


And very, very heavy. The service manual contains the following warning:

Caution: Out of the box, the Studio Display (21″ CRT) weighs 77 pounds (35 kg). Use caution when lifting or moving the display. To move it, lift it by the hand grips on the bottom of the display. It is recommended that two people lift the monitor together.

After the bloom came off the CRT rose, I got two of these monitors for free by offering to “dispose” of them for designers who were moving up to LCD screens. Neither was working well, and they’ve been in my basement basically ever since. I plan someday to convert the shells into fishtanks or litterboxes or something. At one point, I thought I might build a computer into the case with a modern LCD monitor mounted into the front, but a 20″ square monitor is an odd commodity now that the world has moved on to panoramic aspect ratios.

Anyway, it was time to move the monitors and I decided to gut them first. The things are totally over-engineered, with dozens of screws hidden under mylar stickers. The “Take Apart” section of the service manual is 101 pages long. Not very big pages, but still.

So I found a shortcut . . .

CRTs can be extreme hazardous. Use a wooden-handled implement when discharging.

CRTs can be extreme hazardous. Use a wooden-handled implement when discharging.

Also wear protective eyewear and an airmask; the tube will explode.

Also wear protective eyewear and an airmask; the tube will explode.

Then remove the shell.

Then remove the shell.

And remove the guts.

And remove the guts.

New Bloomberg-to-Mathematica interface for Mathematica 10

I have added a new interface notebook for those using Mathematica 10. It fixes some bugs, increases flexibility, and most importantly, takes input and produces output using Mathematica’s new date and temporal data types, and using an Association rather than a list. It’s cleaner and more robust than the old method (though the old notebook will continue to work for those afraid of change.) If you upgrade from the old interface to the new one, note that all the functions have changed names, and their default installation path has changed as well. It’s all documented in the new notebook in the zip file at

Sample usage of the new version:

aaplNF2 = msBBGetNF2["AAPL Equity", "Px_Last", DateObject["20070901"], DateObject["20081020"], "day"]; ibmNF2 = msBBGetNF2["IBM US Equity", "Px_Last", DateObject["20070901"], DateObject["20081020"], "day"];
DateListPlot[{aaplNF2[["data"]], ibmNF2[["data"]]}, Frame -> {True, True, False, False},
PlotLabel -> "IBM and Apple in 2007 and 2008", Epilog -> {(Text["apple", {{2008, 8, 1}, 18}]), (Text["ibm", {{2008, 8, 1}, 110}])}]


[ March 4, 2016 Update coming. See ]
[ March 7, 2016: the new source code and executables are available on Github, at The Win32 binaries and instructions for use can be found at]

Mathematica 10

Things I particularly like about Mathematica 10.

1. Multiple undo

It undoes both the typing and the results of one’s typing. Yay.

2. Curated APIs

Mathematica can now natively communicate with a number of online services, tweeting or analyzing one’s tweets, downloading images from instagram, making association graphs of one’s facebook friends, and so forth.

I have in the back of my mind to set up an IP camera that Mathematica monitors, and that tweets when it detects specified activities. It would take only about three lines of code.

In practice, so far, I’ve been using it mostly with RunKeeper.

runkeeper = ServiceConnect["RunKeeper", "New"];
ServiceExecute[runkeeper, "UserData"];
id = First[runkeeper["FitnessActivities"]]["ActivityID"];

runkeeper["AnimatedPathMap", {"ActivityID" -> id,
AnimationRunning -> False}]


The major weaknesses here are (a) not every service that Wolfram connects to publishes the information that you want via their API. So, for example, while there is the great FriendNetwork from Facebook and FollowsNetwork from Twitter, there is nothing comparable from LinkedIn. Further, sometimes the service does make information available but Mathematica gives you no way to query it. For example, the RunKeeper connection would be about a million times more useful to me if I could pull HRM data as well as the geopath. RunKeeper can provide it, but Mathematica 10 doesn’t know how to ask. Perhaps if enough of us complain about its abence, Wolfram will respond.

3. Associations

One could create structured lists before, but this is vastly more flexible. Instead of

{name, age, street address}

where the form is rigid and can be confusing especially for long records with mostly blank entries, and where the form must be carefully documented for there will be any hope of reusing the data or the code that interpreted it, one can now do

In[59]:= item1 = <|name -> "bill smith", age -> 37, streetAddress -> "121 Main Street"|>;

In[60]:= Lookup[item1, name]

Out[60]= "bill smith"

In[66]:= addressbook = {<|name -> "bill smith", age -> 37,
streetAddress -> "121 Main Street"|>, <|name -> "susan smith",
streetAddress -> "121 Main Street"|>};

In[67]:= Map[Lookup[#, name] &, addressbook]

Out[67]= {"bill smith", "susan smith"}

One can also combine elements from multiple associations into a single record, something that would have been more difficult with the old method.

4. Wolfram Cloud deployment

This is not as good for Manipulate[] as the Mathematica plugin, but far more accessible.

In[8]:= CloudDeploy[
runkeeper["AnimatedPathMap", {"ActivityID" -> id, AnimationRunning -> True}],
Permissions -> "Public"]

Out[8]= CloudObject["\

Other thoughts

Templating and, in particular, automated report generation, would have been useful in my last job. I’m not sure about this one but it feels as though it may come in handy.

Wolfram has improved support for the standardized time series datatype that they introduced in, I think, version 9. I’ve been using a homegrown method since long ago and the Wolfram version is lacking a lot of functionality still (the ability to do math between time series, dividing one by another, for example. The ability to normalize a time series, etc.). Together with the ability to manipulate metainformation (introduced in version 9), this is now a clean way of handling financial information. I expect to start migrating my code over to use the new format.