定量 的 な 開発 者 に なる ため の 自己 勉強 計画

作者: リン・ハーン優しさ作成日: 2019-02-12 09:08:19, 更新日:

私は最近,エンジニアリング,学術界,ITから転職したいという個人から多くのメールを受け取っています. 知的挑戦と高い報酬のために,数値金融は最近特に魅力的な分野になりました. これらのメールで常に生じる質問は,面接者に私に仕事を与えるように説得するために何を勉強する必要があるかです. これは数値金融業界で仕事を得るための自己学習計画をどのように形成するかについて議論する3つのシリーズの最初のものです. この記事は数値開発者になるためにどのように自己学習するかについて議論します. 他の2つは数値分析家と数値トレーダーに焦点を当てます.

定量金融におけるキャリアは,広範な専門化ではなく,ある程度の一般化を必要とします.定量開発者は異なります.投資銀行が新しい構造投資製品を価格化し販売したり,資金が取引インフラストラクチャとポートフォリオ管理システムを開発するのを助けるために,トレーダー,金融エンジニア,ITサポートのチームに適合する必要があります.

科学計算

定量開発への最も一般的な経路は,科学コンピューティングの学術的背景を通じてである.これは,量子開発に必要なコアスキルは,高度なプログラミングスキルと数値アルゴリズム実装であるためである.これらのスキルは,物理科学または工学のための大学院研究環境の中で当然のごとく開発される.これがあなたの背景である場合,あなたの仕事は,一般的な実装とプログラミングスキルが十分に発達している可能性が高いため,定量金融で使用される特定の製品と数値アルゴリズムと向き合うことになるだろう.

しかし,あなたの背景が科学コンピューティングではない場合,プログラミングの背景を活用して定量開発者になる機会はまだたくさんあります.少なくとも,アルゴリズムを実装することに慣れている必要がありますが,その実践については以下に説明します.

プログラミング 能力

まず第一に,定量的な開発者はソフトウェア開発者である.したがって,その役割はほぼ100%プログラミングに基づいている.あなたは,取引プロトタイプを最適化したり,ゼロから取引インフラストラクチャを開発する.あなたが銀行役割をターゲットにしている場合,あなたはおそらくMicrosoft/Windows環境でC++,JavaまたはC#を使用する必要があります.あなたがヘッジファンドをターゲットにしている場合,あなたはおそらくMatLabまたはRをC++および/またはPythonに翻訳します.資金は,C++とPythonがより意味のあるUNIX環境にあるため,JavaとC#を少なく使用する傾向があります.これらのプログラミング環境のいずれかに背景がある場合,あなたの強みを見つけて,あなたがよく知っているソフトウェアに固執することが意味があります.したがって,あなたがJavaを知っている場合,例えば,投資銀行役割をターゲットにすることは賢明です.

C++とPythonを非常によく学ぶことを提案します. それは業界のさまざまな分野に最も横断的な能力を与えてくれます.

アンドリュー・コニグによるAccelerated C++ を全部読んでください.この本は,C++ の構文について,特にポインタやメモリ管理について詳しく説明します.これは多くのプログラマー (Java と C# の背景を持つ者を含む) があまり馴染めない分野です.単に読み込むのではなく,構文を実践するために,Microsoft Visual Studio や Linux/UNIX の GCC コンパイラーで例を実装しながら読むのが最善です! スコット・マイヤーズの"Effective C++"を全文 (複数回) 読んでみてください.このアドバイスをサイト全体で一貫して繰り返しましたが,それでも繰り返す価値があります.この本は,初心者C++プログラマーからインタビューの準備ができている中級プログラマーへとあなたを導くでしょう.この本は,マイヤーズがいくつかの複雑な例を設定しているため,ターミナルの前で実際に練習するのが難しいです.この本を実行する方法の1つは,自分のプロジェクトでパターンを適用できる場所を決定することです. C++ の仕事に対して直接応募している場合は,これらの2つの作品を超えて行きたいと思います.スコット・マイヤーズはさらに有効な C++ と有効な STL を書きました.その後,Boost ライブラリ,マルチスレッドプログラミング,Linux オペレーティング システムの基礎を考慮して真の専門家になる必要があります. Python の場合も同様です

C++/Java/C#プログラマであれば,マーク・ルッツによるLearning Pythonの特定のセクションを読んでください.特に,タイプに組み込まれたPythonについて議論する第4章から第9章までをスキムしてください.第10章から第13章までには,Pythonの分岐とループの構文について説明されています.したがって,構文を決定するために軽く読むこともできます.しかし,第14章から第20章までには,Iterations/Comprehensionsや高度な関数使用などのPythonの特定の機能について議論しているため,かなりの時間を費やす価値がある.第5章と第6章はネームスペスとオブジェクト指向プログラミングをカバーし,これらの概念がC++/Javaのような言語とPythonでどのように異なっているのか.あなたが良い中級Pythonプログラマーになりたい場合は,本書の残りの章も考慮する必要があります.この本は1,000ページ以上長くなるので,あなたの背景に関連するセクションを選択する必要があります. Mark Lutzの2冊目の書『Pythonのプログラミング』は,実際にPython内でアプリケーションを構築することについてです.これは最初の本で得た文法知識すべてを取り,強力なアプリケーションを構築できるようになります.これは,あなたがはるかに優れたPythonソフトウェアエンジニアになるのを助けます. 業界における定量的な取引の側面に興味がある人は,Python内でデータ分析を行う方法を学ぶ必要があります.これは大学院でよく習得されるスキルですが,Wes McKinneyによるPython for Data Analysisは,SciPyやpandaなどの新しいライブラリの一部をうまくカバーしています. 上記の計画に従った後,C++またはPythonのインタビューで良い機会を持つべきです.しかし,開発者のスキルを強化するために,ソフトウェアエンジニアリングの最近のイノベーションのいくつかを認識する必要があります.

ソフトウェアエンジニアリング

量子開発者のポジションの良い面接候補者になるためには,あなたは良いプログラマーと良いソフトウェア開発者の両方になる必要があります. 多くの人は教科書や実践から前者を学ぶことができます.しかし,後者は,一般的に他の開発者とより大きなソフトウェアプロジェクトに取り組むことでのみ学ぶことができます.しかし,これは家庭学習プログラムに組み込めないことを意味しません.例えば,現在インターネットを通じてオープンソースソフトウェアプロジェクトに貢献することは簡単です.最大の定量金融プロジェクトの一つは,

量子リブ

このプロジェクトのソースコードの一部を読むと,大規模な C++ ソフトウェアプロジェクトがどのように書かれるかについての良い考えが得られます.

優れたソフトウェア開発者になるためには,大規模なソフトウェアプロジェクトをどのように作るか理解する必要があります.現代のソフトウェア開発では,バージョン制御,継続的統合,その他のアジャイルな慣行を使用する必要があります.以下,これらの概念を把握するのに役立つ学習計画です:

スティーブ・マッコネルの"コード・コンプリート"とロバート・マーティンの"クリーン・コード"の両方を読んでください. この2つの本は,最初の原則から,ソフトウェアの設計方法について真剣に考え直すようにします. 例えば,キーボードに触れる前にソフトウェアを設計するのにどれくらいの時間を費やすのですか? この2つの本は,無駄なコード開発の時間を節約します. これらの本内の多くのヒントをできるだけ早くプロジェクトに適用して,悪い習慣をなくすことをお勧めします. インタビューで議論することも素晴らしいです. 必ずいくつかのコードを書くように求められるからです. 良いソフトウェアの工芸に関する議論は,デザインパターンを言及することなく完了しません.この本はC++のような言語に非常に関連していますが,Pythonのようなスクリプト言語にはあまり関係ありません.この本は,あなたがコードで類似したデザインを使用していることに気付くでしょう.この本は,いつ,どこで適用すべきかを決定するのに役立ちます.利点の1つは,他の優れた開発者がそれらを認識することであり,開発仲間の中であなたの方が人気があるということです.これは自己学習にとってかなり難しい読み物です.したがって,最も頻繁に使用されるファクトリー,デコレーターまたはシングルトンなどの2〜3つのデザインを選択して,そこから進むようにしてください. 複数のチームメンバーと大規模なソフトウェアプロジェクトに取り組むとき,バージョン制御ソフトウェアを使用することは絶対的な必要性です.自動修正,ロールバック,ブランチング/マージング,より良いテスト機能は,バージョン制御がほぼすべての (良い) ソフトウェア機関で普遍的であることを意味します. 2つの大きなコンテストはGitとSubversion (SVN) です.SVNが類似しているため (使用が少し難しい場合でも!),ほとんどの機関がSVNリポジトリをGitと同等なものに置き換えています.Gitを学ぶための無料の電子書籍,Git Proがあります.それをやり抜くことをお勧めします.無駄な開発時間を数時間節約します! 現在,一部の業界は,完全に自動化されたテストおよび展開システムを通じてコードの継続的なテストと展開を奨励する継続的な統合慣行に目を向けています.あなたは,CIシステムの働きのほとんどを仕事で拾うことが可能ですが,ポール・デュヴァルのContinuous Integrationのような本を通して作業することで,その分野の知識を実証することで,面接者に印象を与えたいかもしれません. データベース インタラクション

優秀なプログラマーと優れたソフトウェア開発者がインタビューのポジションを獲得するための前提条件であるにもかかわらず,データストレージと分析に関連する問題も問われます.量子開発者の日常生活における重要な構成要素の1つはデータベースとの相互作用です.したがって,データベースの処理に一定レベルの成熟が期待されます.データストレージシステムを一度も利用していない場合は,リレーショナルデータベース管理システム (RDBMS) とその言語 - 構造化クエリ言語 (SQL) を理解し始めることが最善です.一般的なRDBMSにはMicrosoft SQL Server,Oracle,MySQLが含まれます.他のタイプのデータストレージシステムには,10Gens MongoDB,Cassandraを含むいわゆるNoSQLデータストレージが含まれます.

RDBMSについて学び始める最善の方法は,オープンソースバージョンをインストールし (無料でダウンロードできるので!) 下の読み込みリストに従うことです.RDBMSのインストール方法を教えることは,この記事の範囲を超えていますが,これはヘッジファンド内の非常に一般的なデータベースであるため,MySQLを試すことができます.SQL ServerとOracleは,銀行内ではより普及しています.MySQLのようなデータベースをインストールした後,データのストレージとアクセスを理解するのに役立つ以下のガイドを使用してください:

SQL に慣れていない場合,Alan Beaulieu の OReilly の書 Learning SQL は素晴らしいスタートです.データに保存,アクセス,レポートを提供するために必要なすべての初心者および中級 SQL をカバーしています.データベース最適化についても簡単に説明します.すべての資料が日常の量子データ開発任務に関連しているため,本全体を読んでください.特定のデータベースタスクのために,OReilly SQL 料理本を見てみたいと思います.私は特定の日付/時間またはレポートクエリを検索するために,この本を継続的に棚から引き出していたので,この本は信じられないほど有用でした!これをカバーする必要はなく,内容の概要と材料の検索場所を知ることは確かに有用です. 量子開発者はしばしばデータベース管理者ではありませんが,MySQLの高度な最適化についてもっと学びたい場合は,次の2冊の本は確かに必要ではありませんが,データベースの問題に直面している場合は非常に役立ちます. 金融と数値アルゴリズム

定量開発者は金融市場で働くため,銀行が生産する製品や資金が取引される楽器について比較的良い理解を持つことは有用です.したがって,株式,外為,固定所得,商品および関連派生品市場 (幅広く) を身近にすることが必要になります.特に,定量開発者の仕事の大きな部分は,財務データへの保存とアクセスを提供するため,このデータがどのように表現され,保存され,アクセスされるのかについて絶えず考えていきたいと思います.仕事に入ると,あなたはほぼ確実に特定の領域に深く集中するでしょう.したがって,最初の研究がかなり広いことを確認してください.

投資銀行の派生品価格設定技術は,ほぼ確実に,確率,統計,数値分析および部分微分方程式の知識に依存するモンテカルロ方法と有限差分方法に集中する.これらは,良い学生が大学院で熟悉するすべてのテーマですが,キャリア変更を検討している人は,銀行で価格設定オプションの量子開発者になりたい場合は,これらの方法をよく理解する必要があります.

ヘッジファンドでは,低周波または高周波の取引インフラストラクチャを実装する可能性があります.これは,MatLab,RまたはPython (またはC++) で既にコードされているアルゴリズムを取り,C++などのより速い言語で最適化し,またこのアルゴリズムをプライムブローカージアプリケーションプログラミングインターフェイス (API) に接続し,取引を実行することを含むでしょう.ここで必要なスキルはかなり異なっています.さまざまなソースからデータを集め,正しい文脈に置き,それを迅速に繰り返し,その後固定形式 (PDF),ウェブ上で,またはAPIとしてオンデマンドレポートを生成する必要があります.これらのスキルは本から直接学ぶことが困難で,技術業界での数年間のソフトウェア開発経験が必要です.

C++の実装記事,Pythonの実装記事,定量金融の読書リストをご覧ください.

仕事 に 応募 する

上記のリストは,研究するための膨大な資料のように見えるが,これはプログラミングに全く新しい人の場合のみである. 定量開発者のポジションは,そのような個人にとって適している可能性は低い. あなたの背景はプログラミングや物理科学であると仮定します. あなたが自分の状況に関連性があると考えるセクションのみを読むことを確認してください. そうでなければ,あなたは簡単に上記の材料を学ぶためにあなたの余暇時間の数年を費やすることができます.

面接の準備ができていると確信したら,定量的な採用者との連絡のプロセスを開始する必要があります.投資銀行やヘッジファンドと取引する専門会社があります.特定の名前が必要な場合は,私にメールしてください.mike@quantstart.comそして私は喜んで正しい方向にあなたを指し示すでしょう.

優秀な採用担当者は,あなたを面接に勧める際に評判を賭けているので,あなたの背景を合理的な程度に詳細に議論します. 採用担当者は一般的に定量技術の技術的な側面にあまり馴染みがないし,そうする必要もありません. しかし,これは,自分のCV/履歴書フィルタリングのために"バズワードマッチング"により頼る必要があることを意味します. C++で強いなら,C++のスキルを述べることを確認してください. STL,ブースト,およびあなたが取り組んできたすべてのC++プロジェクトを参照してください. あなたのスキルのことを謙虚にしないでください. しかし,それらを誇張しないでください. あなたがあなたのCV/履歴書に何かを書く場合,技術面接でそれをグリルされるのはフェアゲームです!

2013年の就職市場 (特に初級者) は,現在最も良い状況ではないため,あなたが探している仕事を見つけるのに時間がかかるかもしれません.コツは,あなたが参加するすべての面接で,あなたが募集者や面接者が求めているものについてより多くの知識を得ることができ,あなたの研究をそれに合わせて調整することができます.


もっと