From 90b02a22d42b6d416b4844281d222a3b8122333e Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Apr 2021 20:19:55 +0200 Subject: [PATCH 1/4] report: add initial introduction --- report.md | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/report.md b/report.md index 2c8a92e..b4b0f65 100644 --- a/report.md +++ b/report.md @@ -6,6 +6,36 @@ # Subject +The first description of my internship project was given to me as: + +> The project is about benchmarking a new service we're building related to +> exchange connectivity. It would involve writing a program to generate load on +> the new service, preparing a test environment and analyzing the performance +> results. Time permitting might also involve making performance improvements to +> the services. + +To understand this subject, we must start with an explanation of what exchange +connectivity means at IMC: it is the layer in IMC's architecture that ensures +the connection between internal trading services and external exchanges' own +infrastructure and services. It is at this layer that exchange-specific +protocols are normalised into IMC's own protocol messages, and vice versa. + +Here is the list of tasks that I am expected to have accomplished during this +internship: + +* become familiar with the service, +* write a dummy load generator, +* benchmark the system under the load, +* analyze the measurements. + +This kind of project is exactly the reason that I was interested in working in +finance and trading. It is a field that is focused on achieving the highest +performance possible, because being faster is directly tied with making more +trades and results in more profits. + +Because I expressed this personal interest for working on high performance +systems and related subjects, I was given this internship project to work on. + # Context of the subject # Internship roadmap From 232c72f46cc47302b8de52c974d5e26c4bd47cc9 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Apr 2021 20:20:57 +0200 Subject: [PATCH 2/4] report: add initial context section --- report.md | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/report.md b/report.md index b4b0f65..7abe811 100644 --- a/report.md +++ b/report.md @@ -38,6 +38,59 @@ systems and related subjects, I was given this internship project to work on. # Context of the subject +The exchange connectivity layer must route orders as fast possible, to stay +competitive, reduce transaction costs, and lower latencies which could result in +lost opportunities, therefore less profits. + +It must also take on other duties, due to it being closer to the exchange than +the rest of the infrastructure. For example, a trading strategy can register +conditional orders with this service: it must monitor the price of product A and +X, if product A's cost rise over X's, then it must start selling product B at +price Y. + +A new exchange connectivity service, called the Execution Gateway, is being +built at IMC, the eventual goal being to migrate all trading strategies to using +this gateway to send orders to exchanges. This will allow it to be scaled more +appropriately. However, care must be taken to maintain the current performance +during the entirety of the migration in order to stay competitive, and the only +way to ensure this is to measure it. + +With that context, let's review my expected tasks once more, and expand on each +of them: + +* Become familiar with the service: before writing the code for the benchmark + I must first understand what goes into the process of a trade at IMC, what is + needed from the gateway and from the clients in order to run them and execute + orders. There is a lot of code at IMC: having different teams working at the + same time on different trading service results in a lot of churn. The + global execution team was created to centralise the work on core services that + must be provided to the rest of the IMC workforce. The global execution + gateway is one such project, aiming to consolidate all trading strategies + under one singular method to send orders to their exchanges. +* Write a dummy load generator: we want to send orders under different + conditions in order to run multiple scenarios which can model varying cases + of execution. Having more data for varying corner cases can make us more + confident of the robustness and efficiency of the service. This is especially + needed becaue of the various roles that the gateway must fulfill: not only + must it act as a bridge for the communication between exchanges and traders, + but also as an order executor. All those cases must be accounted for when + writing the different scenarios. +* Benchmark the system under the load: once we can run those scenarios smoothly + we can start taking multiple measurements. The main one that IMC is interested + in is wall-to-wall latency (abbreviated W2W): the time it takes for a trade to + go from a trading strategy to an exchange. The lower this time, the more + occasions there are to make good trades. + FIXME: probably more context in my notes +* Analyze the measurements: the global execution team has some initial + expectations of the gateway's performance. A divergence on that part could + mean that the measurements are flawed in some way, or that the gateway is not + performing as expected. Further analysis can be done to look at the difference + between mean execution time and the 99th percentile, and analyse the tail of + the timing distribution: the smaller it is the better. Consistent timing is + more important than a lower average, because we must be absolutely confident + that a trade order is going to be executed smoothly, and introducing + inconsistent latency can result in bad trades. + # Internship roadmap # Engineering practices From 4a9e60313894639a5c3e39e7439ffb2765146a8d Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Apr 2021 20:21:08 +0200 Subject: [PATCH 3/4] report: add initial roadmap --- report.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/report.md b/report.md index 7abe811..df37541 100644 --- a/report.md +++ b/report.md @@ -93,6 +93,26 @@ of them: # Internship roadmap +The first month was dedicated to familiarizing myself with the vocabulary at +IMC, understanding the context surrounding the team I am working in, and +learning about the different services that are currently being used in their +infrastructure. I had to write a first proof of concept to investigate what, if +any, dependencies would be needed to execute the gateway as a stand-alone system +for the benchmark. This has allowed me to get acquainted with their development +process. + +After writing that proof of concept, we were now certain that the benchmark was +a feasible project, with very few actual dependencies to be run: the only one +that we needed to be concerned with it called the RDS server. The RDS server +is responsible for holding the information about all trade-able instruments at +an exchange. The gateway connects to it to receive a snapshot of the state of +those instruments, for example the mapping from IMC IDs to the ones used by the +exchange. I wrote a small module that could be used as a fake RDS server by the +benchmark framework to provide its inputs to the gateway being instrumented. + +I am now currently beginning to write the benchmark framework, using what +I wrote and learned during the previous month. + # Engineering practices # Illustrated analysis of acquired skills From a237a7503c360dcc0f19e8ff3e306b404041afb2 Mon Sep 17 00:00:00 2001 From: Bruno BELANYI Date: Sat, 10 Apr 2021 20:22:45 +0200 Subject: [PATCH 4/4] config: rename output to 'report.pdf' --- config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config.yaml b/config.yaml index 417f5d0..b094865 100644 --- a/config.yaml +++ b/config.yaml @@ -1,7 +1,7 @@ from: markdown to: pdf -output-file: output.pdf +output-file: report.pdf input-files: - report.md