By QuantStart Team
March 7th, 2013
I've recently received many emails from individuals wishing to change careers from engineering, academia and IT. Quantitative finance has become a particularly attractive area recently due to the intellectual challenge and high remuneration. A question that constantly arises in these emails is "what do I need to study to convince an interviewer to give me a job?". This is the first in a three-part series that will discuss how to form a self-study plan to gain a job in the quantitative finance industry. This post will discuss how to self-study to become a quantitative developer. The other two will concentrate on quantitative analysts and quantitative traders.
Any career in quantitative finance requires a degree of generalisation rather than extensive specialisation. Quantitative developers are no different. They must fit into a team of traders, financial engineers and IT support in order to help investment banks price and sell new structured investment products or help funds develop trading infrastructure and portfolio management systems.
The most common route into quantitative development is via an academic background in scientific computing. This is because the core skills necessary for a "quant dev" are advanced programming skills and numerical algorithm implementation. These skills are developed as a matter of course within a grad school research environment for the physical sciences or engineering. If this is your background then your task will be to get to grips with the specific products and numerical algorithms used within quantitative finance, as your general implementation and programming skills are likely to be sufficiently developed.
However, if your background is not in scientific computing, there are still plenty of opportunities to become a quantitative developer leveraging a background in programming. At the very least though you will need to be familiar with implementing algorithms, the practice of which I will discuss below.
First and foremost a quantitative developer IS a software developer. Thus the role will almost exclusively be 100% programming based. You will find yourself optimising trading prototypes or developing trading infrastructure from scratch. If you're targeting bank roles, then you will likely need to be using C++, Java or C# in a Microsoft/Windows environment. If you are targeting hedge funds then you will likely be translating MatLab or R into C++ and/or Python. Funds tend to use Java and C# less, since they're often in a UNIX environment where C++ and Python make more sense. If you have a background in either of these programming environments, it makes sense to develop your strengths and stick with software you know well. Thus if you know Java, for instance, it would be wise to target investment banking roles. I've written an article on programming languages for quant developer roles if you want more detail.
Assuming you are a competent programmer and are happy changing to the software most widely used in the financial industry, then I would suggest learning C++ and Python extremely well, as that gives you the most cross-sectional capability across different sectors of the industry. Here is my suggested study plan to become a good C++ programmer:
- Read through the entirety of Accelerated C++ by Andrew Koenig. This book will get you up to scratch on C++ syntax and, in particular, will go into detail about pointers and memory management. This is an area that many programmers (including those from a Java and C#) background will not be as familiar with. It is best to read through while implementing the examples, either with Microsoft Visual Studio or the GCC compiler on Linux/UNIX, in order to practice the syntax, rather than just reading it!
- Read through (multiple times!) the entirety of Effective C++ by Scott Meyers. I've repeated this advice consistently across the site, but it still bears saying again. This book will take you from a beginner C++ programmer to an intermediate programmer who is ready for interview. This book is harder to actually practice in front of the terminal, as Meyers sets up some complicated examples. One way of running through this book would be to determine where in your own projects you can apply the patterns.
- If you are applying for C++ jobs directly, you will probably want to go beyond these two works. Scott Meyers has also written More Effective C++ and Effective STL. You will then need to consider the Boost library, multithreaded programming and Linux operating system fundamentals to become a true expert.
Similarly for Python:
- If you are already a skilled C++/Java/C# programmer, then read through certain sections of Learning Python by Mark Lutz. In particular, skim Chapters 4-9, which discuss Python's built in types. Chapters 10-13 discuss Python's syntax for branching and looping, so they can also be lightly read to determine syntax. However, it is worth spending significant time on Chapters 14-20, as they discuss Python specific features such as Iterations/Comprehensions and advanced function usage. Sections V and VI cover namespacing and object-oriented programming, and how these concepts differ in Python from a language such as C++/Java. If you want to be a good intermediate Python programmer, then you should also consider the remaining chapters in the book. Remember though that this book is over 1,000 pages long, so you will need to pick and choose the sections relevant to your background.
- Mark Lutz's second book, Programming Python, is on actually building applications within Python. This will take all of the syntax knowledge gained in the first and allow you to start building robust applications. This will help you become a much better Python software engineer.
- For those who are definitely keen on the quantitative trading side of the industry, it will be necessary to learn how to carry out data analysis within Python. This is a skill often picked-up while in grad school, but Python for Data Analysis by Wes McKinney nicely covers some of the newer libraries available such as SciPy and pandas.
After following the above plan you should have a good chance at any C++ or Python interview. However, in order to solidify your developer skills it is necessary to be aware of some of the recent innovations in software engineering, which only tend to be figured out "on the job", but can certainly be studied and practiced at home in your spare time.
Being a good interview candidate for a quant developer position requires that you become both a good programmer AND a good software developer. Many can learn the former from textbooks and practice. However the latter can only be learnt from working on larger software projects, generally with other developers. However, this does not mean it cannot be incorporated into a home study program! For instance, it is now easy to contribute to open source software projects via the internet. One of the largest quantitative finance projects is the QuantLib project. Reading through (some of) the source code to this project will give you a good idea at how large-scale C++ software projects are written.
To become a good software developer it is necessary to understand how to craft large-scale software projects. For modern software development this requires using version control, continuous integration and other agile practices. Here is a study plan to help you get to grips with these concepts:
- Read through both Steve McConnell's Code Complete and Robert Martin's Clean Code. Both of these books will cause you to seriously rethink how you go about designing software, from first principles. For instance - how much time do you spend upfront designing your software before touching the keyboard? Both of these books will save you hours of wasted code development. I would suggest applying as many of the tips within these books to your projects as soon as possible to remove any bad habits. They are also great to discuss at interview, as you'll invariably be asked to write some code.
- A discussion on good software craftsmanship would not be complete without mentioning Design Patterns, also known as the "Gang Of Four" book. This book is highly relevant for a language such as C++, although less so for a scripting language such as Python. You will likely notice that you are using similar designs in your code. This book helps you determine when and where they should be applied. One benefit is that other good developers will be aware of them - making your more popular among your development peer group. It is quite a hard read for self-study, so try and pick 2-3 designs such as the Factory, Decorator or Singleton that are used most often and then work your way through from there.
- When working on large-scale software projects with multiple team members it is an absolute necessity to make use of version control software. Automatic revisioning, rollback, branching/merging and better testing capability means that version control is ubiquitous in nearly all (good) software institutions. The two big contenders are Git and Subversion (SVN). I would suggest becoming familiar only with Git as SVN is similar (if a little harder to use!) and most institutions are replacing their SVN repositories with Git equivalents. There is a free eBook on learning Git, Pro Git, which I suggest you work your way through. It will save you hours of wasted development time!
- Some industries are now turning towards continuous integration practices, which encourage continuous testing and deployment of code via a fully automated testing and deployment system. Although you are likely to be able to pick up most of how a CI system works "on the job", you might want to impress your interviewer by demonstrating your knowledge of the subject via working through a book such as Paul Duvall's Continuous Integration.
Although becoming an excellent programmer and an excellent software developer are the prerequisites to gaining an interview position, you will also be asked problems relating to data storage and analysis. One of the key components in a quant dev's day to day life is interacting with databases. Thus a certain level of maturity with database handling is to be expected. If you have never utilised a data storage system, then the best way to start is by beginning to understand Relational Database Management Systems (RDBMS) and their language - Structured Query Language (SQL). Common RDBMS' include Microsoft SQL Server, Oracle and MySQL. Other types of data store systems include the so-called NoSQL data stores, including 10Gen's MongoDB and Cassandra.
The best way to begin learning about RDBMS is to install an open source version (as you can download them for free!) and follow the reading list below. It is beyond the scope of this article to teach you how to install an RDBMS, but you can try MySQL, as this is a very common database within hedge funds. SQL Server and Oracle are more likely to be prevalent within banking. Once you have installed a database such as MySQL, use the following guides to help you understand storage and access of data:
- If you have no familiarity with SQL then the O'Reilly book Learning SQL by Alan Beaulieu is a great start. It covers all of the beginner and intermediate SQL you will need to know to store, access and provide reports for data. It will discuss database optimisation in a brief way as well. Make sure you read the entire book as all of the material is relevant for day to day quant dev database duties. For specific database tasks, you will want to have a look at the O'Reilly SQL Cookbook. I found this book incredibly useful when I was a quant dev, as I was continually pulling it off the shelf to look up a certain date/time or reporting query! There's no need to read this cover-to-cover, but certainly having an overview of the contents and where to look the material up is useful.
- Although quant devs are not often database administrators, if you wish to learn more about advanced MySQL optimisation, then the following two books, while certainly not necessary, are highly useful if you are running into database problems: High Performance MySQL and MySQL High Availability.
Finance and Numerical Algorithms
Since a quantitative developer works in the financial markets, it is useful to have a relatively good understanding of the products that banks produce or the instruments that funds will be trading. Thus it will be necessary to familiarise yourself (broadly) with the equities, forex, fixed income, commodities and related derivatives markets. In particular you want to be continually thinking about how this data is represented, stored and accessed as a big part of a quant dev's job is to provide storage and access to financial data. Once in the job you will almost certainly concentrate on one particular area in depth, so make sure your initial research is quite broad.
Of more relevance are the algorithms used in quantitative finance to carry out both instrument pricing and algorithmic trading. The investment bank derivatives pricing techniques will almost certainly concentrate on Monte Carlo Methods and Finite Difference Methods, both of which rely on knowledge of probability, statistics, numerical analysis and partial differential equations. These are all topics which a good student will be familiar with in grad school, but for those considering a career change, you will need to gain a good understanding of these methods if you wish to become an options pricing quant developer in a bank.
For hedge funds, you will likely be implementing trading infrastructure - either low or high frequency. This will involve taking an algorithm already coded up in MatLab, R or Python (or even C++) and then optimising it in a faster language, such as C++, as well as hooking up this algorithm to a prime brokerage application programming interface (API) and executing trades. The skills required here are quite disparate. You will need to be able to pull together data from various sources, put it into the correct context, iterate over it rapidly and then generate on-demand reports either in fixed-format (PDF), over the web or as an API itself. These skills are hard to learn from books directly and require a few years of software development experience in the technology industry.
Applying for Jobs
Although the above list looks like an extensive amount of material to study, this will only be the case for somebody completely new to programming. It is unlikely that a quantitative developer position would be suitable for such an individual and I assuming that your own background will be in programming or the physical sciences. Make sure to read only the sections you deem relevant to your own situation, as otherwise you could easily spend a few years of your spare time learning the above material!
Once you believe you are ready for interview then you will need to begin the process of contacting quantitative recruiters. There are specialist firms that deal with investment banks and hedge funds. If you require specific names, then feel free to email me at email@example.com and I will happily point you in the right direction.
Any good recruiter will discuss your background to a reasonable degree of detail as they are putting their reputation at stake when they recommend you for an interview. Recruiters aren't generally highly familiar with the technicalities of quantitative technology and nor do they need to be. However, this does mean they have to rely more on "buzzword matching" for their own CV/resume filtering. Make sure if you are strong with C++ that you state "C++ skills - strong" and reference the STL, Boost and any C++ projects you have worked on, for instance. Do not be modest about your skills, but also do not overstate them. If you write anything on your CV/resume, it is fair game to be grilled about it in a technical interview!
Since the job market (in 2013) is not the best (particularly at entry-level) right now, you might find it will take a while to get the job you are looking for. The trick is to keep trying as with each interview you attend, you'll gain more knowledge about what the recruiters and interviewers are looking for and so you'll be able to tailor your study towards this.
If you have any questions at all about becoming a quant developer at all please take a look at this article on my own experiences as a quant developer