Private Equity: Risk and Outlook

Private equity (PE) is acquiring ownership of—or a stake in—a company that is not publicly listed on an exchange. A typical PE firm will invest in a portfolio of companies to create a fund open to investors with the promise of future distributed returns. However, unlike shares traded …

Value at Risk and Expected Shortfall

At its core, financial risk management is concerned with quantifying potential losses to assess the downside of financial endeavors and prepare for worst-case scenarios. Perhaps the two most salient risk measures in the field of risk management are value at risk (VaR) and expected shortfall, also known as conditional value …

Jan 2025 Jane Street Puzzle Write-up

This month's puzzle asks us to find a valid solution to a Sudoku grid (shown above) with some special constraints. Here's the puzzle description:

Fill the empty cells in the grid above with digits such that each row, column, and outlined 3-by-3 box contains the same set of nine unique digits[1], and such that the nine 9-digit numbers[2] formed by the rows of the grid has the highest-possible GCD over any such grid.

Some of the cells have already been filled in. The answer to this puzzle is the 9-digit number formed by the middle row in the completed grid.

[1] that is, you’ll be using nine of the ten digits (0-9) in completing this grid

[2] possibly with a leading 0

Surprising Results from Off-center Measurements of Circles

Two circles with chords to the circumference.

The radius of a circle is defined as the distance from the circle's center to any point on its circumference. If you move the point of measurement to be off-center (as in the figure above), the distances to the circle's circumference are no longer all equal to the circle's radius. But what if you took the mean all of those individual distances—would you recover the value of the radius?

In this post, I discuss how for any off-center point within a circle:

  • averaging the distances from the point to the circle's circumference yields a value strictly larger than the circle's radius; and
  • averaging the distances that pass through the chosen point from one side of the circle to the other yields a value strictly smaller than the circle's diameter.

Root-finding Algorithms and Graphical Interpretations

One step of Newton's method for a function

In many quantitative disciplines, problems can often be framed as the task of finding the value — or set of values — that make some expression equal zero. For example, we may want to find the theoretical break-even point of a firm (when profit is equal to zero) or under what conditions a dynamical system is at equilibrium (when the rate of change of the system is zero).

Solving Logic Puzzles in Prolog

A solved 7x7 Futoshiki board.
A solved 7x7 Futoshiki board.

Recently, I came across this fun brainteaser on Kenneth Tay's blog:

Write the numbers 1 to 14 around a circle so that the sum and difference of every pair of adjacent numbers is prime.

In this blog post, I want to use this riddle as an example to show how easy it can be to solve logic puzzles out-of-the-box with Prolog: a constraint logic programming language. Alongside this riddle, I'll cover two additional games that aren't as easy, and showcase how Prolog can allow for intuitive, declarative solutions to nontrivial problems.

Are ChatGPT's Random Numbers Actually Random?

ChatGPT's random numbers are not always so random.
ChatGPT's random numbers are not always so random.

Large language models (LLMs) have quickly become part of many people's lives — popularized by OpenAI's publicly-available ChatGPT research release, the models excel at just about every textual task. But what about random number generation? LLMs are understandably bad at arithmetic: these are probabilistic language models, not calculators. Still, LLMs like ChatGPT fulfill requests such as "predict the next number in the sequence..." and "give me a random number." So this warrants the question: are the "random" numbers generated by ChatGPT truly random?

Analytical and Simulation Approaches to Stochastic Processes

A basic absorbing Markov chain
An absorbing Markov chain.

In this post, I'd like to (perhaps overly) analyze a pretty simple problem, and explore a few routes of answering it through analytical solutions and simulation. This problem actually came from a very enjoyable class I took called Computational Modeling and Simulation, which taught me (among many other things) the beauty of simulation, stochastic processes, and dynamical systems.

Does the Weather Affect my Productivity?

A lazy summer morning, evening?
Image from The New Yorker (source)

For most of us, the environment in which we work is an extremely impactful factor that contributes to our capacity for productivity. Lighting, odor, temperature, furniture — these are parameters of our environment we can tune to allow ourselves to work better.

But we can't control everything, that would be cheating. Weather conditions are an external factor that may or may not affect productivity: one study suggests worse weather is correlated with higher productivity.

This got me thinking — could I conduct a toy case-study on myself? Where would I get the data? Suddenly, I remembered in the months of study-leave leading up to my International Baccalaureate (IB) exams, I had tracked my time spent studying and doing homework using Toggl.

My hours logged leading up to the IB examinations

So I had 135 hours' worth of data over March, April, and May 2019 that could be downloaded as a .csv — not bad. Also, at the time, I was totally blind to what I would do with the data, meaning I possibly ducked data collection biases by being naïve! I wagered it wouldn't be too hard to find the weather data, and the rest of this blog post is what ensued.

Setting up & Customizing Liquid Tags in Pelican

A word on liquid-tags and Pelican plugins

Without delving in too deep, Liquid Tags are the saving grace of media integration in Pelican — they integrate seamlessly with Markdown or reStructuredText, and can be customized. For example, the following:

{% notebook my-jupyter-notebook.ipynb cells[2:3] %}

displays cells [2–3) (so cell …