04 Apr 2020


27 Mar 2020

Stage in the center of a large concert crowd. Skyes are colorful as sun is setting.

Its nearing a year since I last posted. Here is a photo from Calexico + Iron & Wine at the Denver Botanic Gardens (Aug 19, 2019)

12 May 2019

Dramatic storm clouds seen with red rocks canyons in the distance.

Rain is always a bummer at Red Rock because you can’t climb on sandstone until it’s had time to dry for a couple of days.

15 Mar 2019

Look down denver city streets as sun is setting. You can see some mountains between the highrises.

Rebecca and I recently relocated to Denver - the sunsets are very colorful here.


08 Feb 2019

Last November, I went to climb Pleasant Overhangs at Seneca with the perfect group of 3. The weather forecast for the afternoon didn’t look too good. My excitement got the better of me, and we went for it anyways. At 2PM as I was about to start pitch 3, it started POURING - just as the forecasts had predicted. I had the wettest rappel of my life.

Looking down at a rock climber climbing horizontally beneath a rock roof.

It’s starting to rain, but we’re still protected by the especially pleasant overhang.

Steve in a rainjacket at the parking lot, with the seneca rock structure a mile behind him.

I regret nothing.

climbing photography

05 Feb 2019

Baltimore is perhaps not the best place to be for sport climbing. For a 2 hour drive, you can get to Birdsboro Quarry. The area is actually fairly well developed with nice little benches you can sit on. Its blasted walls sometimes still shed rock - careful.

Carol smiling rock climbing.

The area has tons of short & sweet sport routes, and some longer ones if you like to do 5.11+.

Rebecca climbing a jagged steep rock climb.

Jenga is a fun one to get on.

Man falling on his rope, with rebecca watching behind him.

climbing photography

04 Feb 2019

I started ExchangeEngine on GitHub in 2015 to experiment with setting up continuous integration and testing on some different services. Back in 2015 I didn’t get far with the project after I had finished messing around with the continuous integration systems. I randomly picked it back up recently and got it to a minimal product.

At its most basic, ExchangeEngine is a Node.js library that allows you to create an exchange for any generic thing you wish. Currently, it is very minimal with no explicit architecture defined for users or authentication. In theory, you can use ExchangeEngine to back any type of exchange - be it stocks, Bitcoin, or Pokemon Cards.

The order types supported are Limit and Market orders with FIFO priority execution.


Given the two orders coming in:

var order1 = {
    quantity: 1,
    price: 3,
    side: Order.SIDE.ASK,
    type: OrderTypes.LIMIT,
    owner: "user1",
    status: Order.STATUS.ACTIVE,
    time: new Date()

var order2 = {
    quantity: 1,
    price: null,
    side: Order.SIDE.BID,
    type: OrderTypes.MARKET,
    owner: "user2",
    status: Order.STATUS.ACTIVE,
    time: new Date()

The Exchange Engine will find a match and produce a trade:

[ Trade {
    fillPrice: 3,
    fillQuantity: 1,
    newOrders: [],
    childOrders: [[Object], [Object] ],
    rejectedOrders: [],
    executionTime: 2019-02-05T04:47:36.119Z } ]


Backing the order matching engine is a fibonacci heap. I picked it because it sounds cool (just kidding). This seems to produce satisfactory performance on my dying MacBook Pro retina. As expected with the heap, the performance depends on the book depth.

Book Depth - Transactions/Second
100   219,257
500   56,879
1,000   26,894
10,000   2,171

Given that the daily volume of SPY today was 60,673,524, if each trade was one share, that’d be around 2,592 trades per second in the 6.5 hour trading day. Not a bad start.

If your application is running on the cheapest MacBook, has books 10k orders deep, and transacting more volume than SPY, you can probably afford something better than this free GitHub project.

Although this performance is more than sufficient for most, I am thinking of implementing a more memory intensive but much faster matching engine. I also have some fun ideas for projects with this. More on this later…

finance software-engineering

28 Jan 2019

Woman climbing a steep indoor climb. It’s cold outside, but it’s kind of cold inside Earth Treks too.

photography climbing

26 Jan 2019

I finally added some updates to the Volatility Surface Visualizer that will allow you to finally get quantitative data from it (at GitHub). I also added some rudimentary empty fill interpolation to make the surface prettier. Furthermore, I finally added axes and ray casted value reader. Just click on the surface, and you can see the interpolated date, strike, and IV.

3D surface rendering implied volatility. Surface rises and turns red as volatility is higher. Interpolation / Parameterization

I wasn’t really aware when I started this project, but this seems to be a subject that is far more complex that I had originally anticipated. The pricing data straight from CBOE becomes fairly ugly very quickly for the illiquid contracts. In order the make the surface less chaotic, I really prefer some sort of interpolation or parameterization.

Currently, the viewer uses a pretty rudimentary strategy. The surface is populated on a grid of all observed strikes and expirations. For all expirations, from the current price, an empty fill is done for all missing values - middle out. This gets the job done for now.

Popular strategies such as Arbitrage-free SVI volatility surfaces (pdf) exist, but for my purposes, I don’t know if the juice is worth the squeeze.

Ray Cast Value Viewer

Now you can click anywhere on the surface and see the interpolated strike, price, and Implied Volatility.

3D surface rendering implied volatility. Surface rises and turns red as volatility is higher. A dot shows where the user clicked.

software-engineering finance

24 Jan 2019

Landscape view of red rocks canyon. Center is a valley where hikers can traverse.

This photo was taken at the trailhead of First Creek Canyon at Red Rock. Despite having a guide book and the wealth of information available on Mountain Project, we mistakenly started climbing an unestablished route.

We were supposed to be on a 3 star climb, but as I climbed higher, the route began to deviate from expectations. Protection became uncomfortably sparse, and the rock became soft & fragile. Thankfully, we were able to climb out to safety, however, I will never forget the feeling of being run out on questionable protection placed in soft sandstone.

This experience made me realize that I take my access to well established, “starred” climbing routes for granted. We’ve been able to take much of the original adventure out of rock climbing by sharing tons of information on the internet. For example, on Mountain Project, I can see what hundreds of other people have said about potential routes I’m considering. I can see pictures, comments, and even reviews of climbing routes. Mountain Project can often contain enough pictures to make route-finding a non-issue. Using information available online, I’m able to carefully curate my climbing experience and minimize risks by being selective with the routes I climb. I can do my research and know EXACTLY what I’ll be climbing… most of the time.

climbing photography