├── .github └── workflows │ └── ci.yml ├── .gitignore ├── Readme.md ├── docs ├── _js │ ├── lunr.min.js │ └── pageview.js ├── assets │ ├── 2023-03-07-14-00-03.png │ ├── 2023-03-07-14-23-50.png │ ├── 2023-03-07-14-29-10.png │ ├── 2023-03-07-14-34-40.png │ └── logo.jpeg ├── bottom-up │ └── 0-intro.md ├── index.md ├── kaggle.md ├── quant-dev │ ├── category.md │ ├── index.md │ ├── quant-dev-db.md │ ├── quant-dev-framework.md │ ├── quant-dev-in-pod.md │ ├── quant-dev-language.md │ └── quant-dev-skills.md └── research-intro.md ├── mkdocs.yml └── overrides ├── main.html └── partials └── comments.html /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: ci 2 | on: 3 | push: 4 | branches: 5 | - main 6 | permissions: 7 | contents: write 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - uses: actions/setup-python@v4 14 | with: 15 | python-version: 3.x 16 | - uses: actions/cache@v2 17 | with: 18 | key: ${{ github.ref }} 19 | path: .cache 20 | - run: pip install mkdocs-material mkdocs-git-revision-date-plugin mkdocs-git-revision-date-localized-plugin 21 | - run: mkdocs gh-deploy --force 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | .vscode/ 6 | 7 | # C extensions 8 | *.so 9 | 10 | # Distribution / packaging 11 | .Python 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | cover/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | db.sqlite3 63 | db.sqlite3-journal 64 | 65 | # Flask stuff: 66 | instance/ 67 | .webassets-cache 68 | 69 | # Scrapy stuff: 70 | .scrapy 71 | 72 | # Sphinx documentation 73 | docs/_build/ 74 | 75 | # PyBuilder 76 | .pybuilder/ 77 | target/ 78 | 79 | # Jupyter Notebook 80 | .ipynb_checkpoints 81 | 82 | # IPython 83 | profile_default/ 84 | ipython_config.py 85 | 86 | # pyenv 87 | # For a library or package, you might want to ignore these files since the code is 88 | # intended to run in multiple environments; otherwise, check them in: 89 | # .python-version 90 | 91 | # pipenv 92 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 93 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 94 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 95 | # install all needed dependencies. 96 | #Pipfile.lock 97 | 98 | # poetry 99 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 100 | # This is especially recommended for binary packages to ensure reproducibility, and is more 101 | # commonly ignored for libraries. 102 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 103 | #poetry.lock 104 | 105 | # pdm 106 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 107 | #pdm.lock 108 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 109 | # in version control. 110 | # https://pdm.fming.dev/#use-with-ide 111 | .pdm.toml 112 | 113 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 114 | __pypackages__/ 115 | 116 | # Celery stuff 117 | celerybeat-schedule 118 | celerybeat.pid 119 | 120 | # SageMath parsed files 121 | *.sage.py 122 | 123 | # Environments 124 | .env 125 | .venv 126 | env/ 127 | venv/ 128 | ENV/ 129 | env.bak/ 130 | venv.bak/ 131 | 132 | # Spyder project settings 133 | .spyderproject 134 | .spyproject 135 | 136 | # Rope project settings 137 | .ropeproject 138 | 139 | # mkdocs documentation 140 | /site 141 | 142 | # mypy 143 | .mypy_cache/ 144 | .dmypy.json 145 | dmypy.json 146 | 147 | # Pyre type checker 148 | .pyre/ 149 | 150 | # pytype static type analyzer 151 | .pytype/ 152 | 153 | # Cython debug symbols 154 | cython_debug/ 155 | 156 | # PyCharm 157 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 158 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 159 | # and can be added to the global gitignore or merged into this file. For a more nuclear 160 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 161 | #.idea/ 162 | 163 | # General 164 | .DS_Store 165 | .AppleDouble 166 | .LSOverride 167 | 168 | # Icon must end with two \r 169 | Icon 170 | 171 | 172 | # Thumbnails 173 | ._* 174 | 175 | # Files that might appear in the root of a volume 176 | .DocumentRevisions-V100 177 | .fseventsd 178 | .Spotlight-V100 179 | .TemporaryItems 180 | .Trashes 181 | .VolumeIcon.icns 182 | .com.apple.timemachine.donotpresent 183 | 184 | # Directories potentially created on remote AFP share 185 | .AppleDB 186 | .AppleDesktop 187 | Network Trash Folder 188 | Temporary Items 189 | .apdisk -------------------------------------------------------------------------------- /Readme.md: -------------------------------------------------------------------------------- 1 | # Quant 修炼路线图 2 | 3 | 本路线图还在施工中,请持续关注。计划更新如下: 4 | 5 | - 职业概述 6 | - 职业入门路线图 7 | - 学习路线 8 | - 课程推荐 9 | - 书籍推荐 10 | - 项目实战,比如: 11 | - 🔥 [事件驱动系统化交易框架](https://github.com/wangzhe3224/simple/tree/main) 12 | - 🔥 [棒棒的系统化交易合集](https://github.com/wangzhe3224/awesome-systematic-trading) 13 | - 🔥 [loman - 动态计算图开发实战](https://github.com/janushendersonassetallocation/loman) 14 | - 💻 更多需求请在下方评论区给泛泛留言! 15 | 16 | [![Star History Chart](https://api.star-history.com/svg?repos=wangzhe3224/quant-roadmap&type=Timeline)](https://star-history.com/#wangzhe3224/quant-roadmap&Timeline) 17 | 18 | ## 支持我? 19 | 20 | ![支持我](https://funcoder-assets.s3.ap-east-1.amazonaws.com/payme.png) -------------------------------------------------------------------------------- /docs/_js/lunr.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.6 3 | * Copyright (C) 2019 Oliver Nightingale 4 | * @license MIT 5 | */ 6 | !function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.3.6",e.utils={},e.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.utils.clone=function(e){if(null===e||void 0===e)return e;for(var t=Object.create(null),r=Object.keys(e),i=0;i0){var c=e.utils.clone(r)||{};c.position=[a,l],c.index=s.length,s.push(new e.Token(i.slice(a,o),c))}a=o+1}}return s},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){var r=t.label&&t.label in this.registeredFunctions;r||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){var t=Array.prototype.slice.call(arguments);t.forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(i==-1)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);t!=-1&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r1&&(se&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:sa?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t0){var o,a=s.str.charAt(0);a in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length&&(o["final"]=!0),n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(0!=s.editsRemaining){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new e.TokenSet;s.node.edges["*"]=u}if(0==s.str.length&&(u["final"]=!0),n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&n.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),1==s.str.length&&(s.node["final"]=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length&&(l["final"]=!0),n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var c,h=s.str.charAt(0),d=s.str.charAt(1);d in s.node.edges?c=s.node.edges[d]:(c=new e.TokenSet,s.node.edges[d]=c),1==s.str.length&&(c["final"]=!0),n.push({node:c,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=0,s=t.length;n=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r["char"]]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){var i=new e.QueryParser(t,r);i.parse()})},e.Index.prototype.query=function(t){for(var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u1?this._b=1:this._b=e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t,r){var i=t[this._ref],n=Object.keys(this._fields);this._documents[i]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do t=this.next(),r=t.charCodeAt(0);while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if("+"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if("-"==r&&1===t.width())return t.emit(e.QueryLexer.PRESENCE),e.QueryLexer.lexText;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseClause;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseClause=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.PRESENCE:return e.QueryParser.parsePresence;case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parsePresence=function(t){var r=t.consumeLexeme();if(void 0!=r){switch(r.str){case"-":t.currentClause.presence=e.Query.presence.PROHIBITED;break;case"+":t.currentClause.presence=e.Query.presence.REQUIRED;break;default:var i="unrecognised presence operator'"+r.str+"'";throw new e.QueryParseError(i,r.start,r.end)}var n=t.peekLexeme();if(void 0==n){var i="expecting term or field, found nothing";throw new e.QueryParseError(i,r.start,r.end)}switch(n.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expecting term or field, found '"+n.type+"'";throw new e.QueryParseError(i,n.start,n.end)}}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(t.query.allFields.indexOf(r.str)==-1){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){var n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0==i)return void t.nextClause();switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0==s)return void t.nextClause();switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;case e.QueryLexer.PRESENCE:return t.nextClause(),e.QueryParser.parsePresence;default:var n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():e.lunr=t()}(this,function(){return e})}(); 7 | -------------------------------------------------------------------------------- /docs/_js/pageview.js: -------------------------------------------------------------------------------- 1 | var initAll = function () { 2 | var path = window.location.pathname; 3 | // add visitors count 4 | var ele = document.createElement("div"); 5 | ele.setAttribute("align","center"); 6 | var count = document.createElement("img") 7 | count.setAttribute("src", "https://visitor-badge.glitch.me/badge?page_id=" + path); 8 | ele.appendChild(count); 9 | var divider =document.createElement("hr") 10 | 11 | document.getElementById("__comments").appendChild(ele); 12 | document.getElementById("__comments").appendChild(divider); 13 | }; 14 | 15 | window.addEventListener('load', initAll); -------------------------------------------------------------------------------- /docs/assets/2023-03-07-14-00-03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhe3224/quant-roadmap/2b3176decf8c326d9698d918cd3dfc8d184fc60d/docs/assets/2023-03-07-14-00-03.png -------------------------------------------------------------------------------- /docs/assets/2023-03-07-14-23-50.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhe3224/quant-roadmap/2b3176decf8c326d9698d918cd3dfc8d184fc60d/docs/assets/2023-03-07-14-23-50.png -------------------------------------------------------------------------------- /docs/assets/2023-03-07-14-29-10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhe3224/quant-roadmap/2b3176decf8c326d9698d918cd3dfc8d184fc60d/docs/assets/2023-03-07-14-29-10.png -------------------------------------------------------------------------------- /docs/assets/2023-03-07-14-34-40.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhe3224/quant-roadmap/2b3176decf8c326d9698d918cd3dfc8d184fc60d/docs/assets/2023-03-07-14-34-40.png -------------------------------------------------------------------------------- /docs/assets/logo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/wangzhe3224/quant-roadmap/2b3176decf8c326d9698d918cd3dfc8d184fc60d/docs/assets/logo.jpeg -------------------------------------------------------------------------------- /docs/bottom-up/0-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 3 | date: 2023-08-02 4 | --- -------------------------------------------------------------------------------- /docs/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | comments: true 3 | status: new 4 | --- 5 | 6 | ??? info "本路线图还在施工中,请持续关注。计划更新如下:" 7 | - 职业概述 8 | - 职业入门路线图 9 | - 学习路线 10 | - 课程推荐 11 | - 书籍推荐 12 | - 项目实战,比如: 13 | - 🔥 [事件驱动系统化交易框架](https://github.com/wangzhe3224/simple/tree/main) 14 | - 🔥 [棒棒的系统化交易合集](https://github.com/wangzhe3224/awesome-systematic-trading) 15 | - 🔥 [loman - 动态计算图开发实战](https://github.com/janushendersonassetallocation/loman) 16 | - 💻 更多需求请在下方评论区给泛泛留言! 17 | 18 | ??? info "⬇⬇⬇⬇ 加入泛泛的群聊 ⬇⬇⬇⬇" 19 | ️1群满了,请关注公众号,相关群和其他信息会在公众号推送 20 | 21 | 22 | 23 | 24 | # Quant 修炼路线图 25 | 26 | 泛泛是转码程序员[这里有一份转码路线图哦](https://wangzhe3224.github.io/zhuan-ma/),却没有进入互联网行业,而是进入了量化对冲基金行业。 27 | 28 | ## Quant?! 29 | 30 | > "Quant" 这个词来源于 "quantitative analyst"(量化分析师)这个术语,指的是使用 31 | > 量化方法开发交易策略和做出投资决策的金融专业人士。"quantitative analyst" 这个 32 | > 术语最早出现于20世纪80年代,并在90年代随着先进的数学和统计技术在金融领域的广泛 33 | > 应用而变得流行起来。如今,"quant" 这个词在金融行业中常被用作量化分析师的简称。 34 | 35 | 早些年 Quant 兼顾了数据采集、策略开发、交易系统开发、系统维护等等任务,然而随着知识爆炸式的增长已经正的激烈,个人已经无法身兼数职。现如今经过了 30 多年的发展,·Quant·也产生了丰富的细分领域。其中最主要的职业分化莫过于:Quant Dev 和 Quant Research 了! 36 | 37 | ## Quant Research vs Quant Dev 38 | 39 | Quant Dev和Quant Research是金融行业中两个不同的职位,分别涉及到不同的技能和职责。 40 | 41 | Quant Dev是Quantitative Developer的简称,主要职责是使用编程语言和计算机科学技术来开发和维护金融模型和交易系统。Quant Dev的工作职责通常包括编写、测试和优化计算机代码、协助交易员分析市场数据并实现交易策略、维护模型和系统的稳定性等。 42 | 43 | Quant Research(量化研究员)则是负责开发和研究量化交易策略的专业人士。Quant Research通常需要掌握统计学、计量经济学、数学等领域的知识,并使用这些知识来分析市场数据、研究市场趋势和规律,并基于此开发出有效的交易策略。Quant Research还需要经常更新和改进交易策略,以适应市场的变化和不断提高收益。 44 | 45 | 总的来说,Quant Dev更注重技术的实现和系统的稳定性,而Quant Research则更关注市场数据的分析和交易策略的研究。两个职位都需要掌握数学、计算机科学和金融知识,但在具体的职责和技能要求上有所不同。 46 | 47 | ## Quant Research 48 | 49 | Quant Research可以按照研究的方向和对象进行分类,常见的分类如下: 50 | 51 | - Alpha Research:主要研究如何利用市场的非随机性来赚取超额收益(即Alpha)。这类研究需要运用各种统计学和数学模型来发现市场中的规律和趋势,并基于这些规律和趋势来制定交易策略。 52 | - Risk Research:主要研究市场的风险和波动性,以及如何控制和管理这些风险。这类研究需要掌握各种风险模型和风险管理技术,并能够对市场波动进行精准的预测和估计。 53 | - Portfolio Research:主要研究如何构建和管理投资组合。这类研究需要综合考虑各种投资标的的风险和收益,并基于投资目标和风险偏好来设计和优化投资组合。 54 | - Quantitative Strategy Research:主要研究如何利用量化方法来制定交易策略。这类研究需要掌握各种统计学和数学模型,并能够将这些模型应用到市场数据中来发现交易机会和制定交易策略。 55 | 56 | 以上分类并不是绝对的,不同公司和机构可能有不同的分类方式,但这些分类可以帮助人们更好地理解Quant Research的研究方向和内容。 57 | 58 | ## Quant Dev 59 | 60 | Quant Dev(量化开发)可以按照开发的方向和领域进行分类,常见的分类如下: 61 | 62 | Trading System Development:主要开发交易系统。这类开发需要掌握多种编程语言和技术,如C++、Python、Java、FIX协议等,并能够将这些技术应用到交易系统的设计、开发和维护中。 63 | 64 | Market Data Development:主要开发市场数据平台。这类开发需要掌握各种数据处理和分析技术,如数据库管理、数据挖掘、数据可视化等,并能够将这些技术应用到市场数据的处理、存储和分析中。 65 | 66 | Quantitative Analytics Development:主要开发量化分析工具。这类开发需要掌握各种数学和统计学模型,并能够将这些模型应用到市场数据的分析和建模中。开发的工具包括各种量化分析库、风险模型库等。 67 | 68 | Backtesting and Optimization Development:主要开发回测和优化工具。这类开发需要掌握各种回测和优化技术,并能够将这些技术应用到交易策略的回测和优化中。开发的工具包括各种回测框架、优化算法库等。 69 | 70 | 以上分类并不是绝对的,不同公司和机构可能有不同的分类方式,但这些分类可以帮助人们更好地理解Quant Dev的开发方向和领域。 71 | 72 | ## 支持我的创作? 73 | 74 | ![支持我](https://funcoder-assets.s3.ap-east-1.amazonaws.com/payme.png) -------------------------------------------------------------------------------- /docs/kaggle.md: -------------------------------------------------------------------------------- 1 | --- 2 | comments: true 3 | status: new 4 | --- 5 | 6 | # 量化相关 Kaggle 竞赛和数据 7 | 8 | ## G-Research Crypto Forecasting 9 | 10 | ![20230330230327](https://raw.githubusercontent.com/wangzhe3224/pic_repo/master/images/20230330230327.png) 11 | 12 | [链接](https://www.kaggle.com/competitions/g-research-crypto-forecasting/code) 13 | 14 | [数据下载](https://drive.google.com/file/d/1dC-Bru84QN1qppenuPXFFLO6tTqGWLml/view?usp=sharing) 15 | 16 | ## Jane Street Market Prediction 17 | 18 | ![](./assets/2023-03-07-14-00-03.png) 19 | 20 | [链接](https://www.kaggle.com/competitions/jane-street-market-prediction) 21 | 22 | 遗憾的是数据集已经下架了,也许网上还有相关的备份,但是 Kaggle 官网上没有了。 23 | 24 | ## Two Sigma Financial Modeling Challenge 25 | 26 | ![](./assets/2023-03-07-14-23-50.png) 27 | 28 | [链接](https://www.kaggle.com/competitions/two-sigma-financial-modeling/leaderboard) 29 | 30 | 遗憾的是数据集已经下架了,也许网上还有相关的备份,但是 Kaggle 官网上没有了。 31 | 32 | ## JPX Tokyo Stock Exchange Prediction 33 | 34 | ![](./assets/2023-03-07-14-34-40.png) 35 | 36 | [链接](https://www.kaggle.com/competitions/jpx-tokyo-stock-exchange-prediction/data) 37 | 38 | 数据提供了东京交易所股票的日线,期权价格以及一些交易额数据。形成一个 long-short 投资组合。 39 | 40 | [数据连接](https://drive.google.com/file/d/1dC6UcwGMBlOOKVi1oCourClp1sf9XBsw/view?usp=sharing) 41 | 42 | ## TowardsAIxWhitebox Quantitative Finance Challenge 43 | 44 | ![](./assets/2023-03-07-14-29-10.png) 45 | 46 | [链接](https://www.kaggle.com/competitions/towardsai-x-whitebox-startup-challenge/overview) 47 | 48 | 数据集包含了 212 只股票和ETF。 49 | 50 | ## 400+ crypto currency pairs at 1-minute resolution 51 | 52 | 400+ 加密货币 1 分钟蜡烛图历史数据。 53 | 54 | [链接](https://www.kaggle.com/datasets/tencars/392-crypto-currency-pairs-at-minute-resolution) -------------------------------------------------------------------------------- /docs/quant-dev/category.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 2021-11-06 3 | categories: Career 4 | tags: [quant-dev, hedge-fund] 5 | comments: true 6 | status: new 7 | --- 8 | 9 | !!! note 10 | 视频讲解: 11 | 12 | - [油管](https://www.youtube.com/watch?v=O9gK161q_HA&list=PL5ETbHWvsj-FJUbOyDHHqu6IyK6Sd17Ba&index=7) 13 | - [B站](https://www.bilibili.com/video/BV1E44y1v7Zp/?spm_id_from=333.999.0.0) 14 | - [知乎](https://www.zhihu.com/zvideo/1443293377500045312) 15 | 16 | 量化对冲基金程序员分类: 17 | 18 | - 基础设施 19 | - 运维 20 | - 业务 (Quant Dev) 21 | - 基础设施 22 | - 交易系统 23 | - 研究系统 24 | - 量化开发 25 | - 前端开发 26 | 27 | ## 基础设施,Infrastructure 28 | 29 | 1. 主要职能 30 | 31 | 基础设施的程序员主要是负责公司的整体计算机基础设施,保证计算、存储和网络资源正常运行,满足业务需求。 32 | 33 | 包括(不是全部): 34 | 35 | - 数据、计算中心硬件的维护和升级 36 | - 计算资源集群,Spark集群,k8s集群,日常的虚拟机群等等 37 | - 网络,网络安全、VPN等等 38 | - 分布式文件系统 39 | - 数据库开发和维护 40 | 41 | 2. 技术栈 42 | 43 | - Linux 44 | - k8s 45 | - Spark 46 | - 数据库 47 | 48 | 3. 语言 49 | 50 | - C/C++/Rust 51 | - Bash 52 | 53 | ## 运维,Dev Ops 54 | 55 | 1. 主要职能 56 | 57 | 对冲基金的运维,跟其他科技公司的运维功能类似,主要是确保各个应用的连续测试和构建,合理化的容器化APP等等。 58 | 59 | 2. 技术栈 60 | 61 | - Linux 62 | - Jenkins 63 | - K8s 64 | - Docker 65 | 66 | 3. 语言 67 | 68 | - Bash 69 | - Python 70 | 71 | ## 业务,Quant Dev 72 | 73 | 这部分是量化对冲基金比较独有的程序员,每个公司可能也会不太一样,这部分程序员需要对金融知识, 74 | 不过大体可以分为: 75 | 76 | - 基础设施 77 | - 交易系统 78 | - 研究系统 79 | - 量化开发 80 | - 前端开发 81 | 82 | ### 基础设施 83 | 84 | 这部分的基础设施主要是面向业务逻辑的一些工具和框架的开发,比如 85 | 86 | - 高性能时间序列数据库 87 | - 实时计算图,Computation Graph 88 | - 机器学习框架 89 | - 股票的话,比如Ticker map,分红,换名字啊等等一些琐碎但是重要的事情 90 | 91 | 语言框架: 92 | 93 | - C++/Rust/Python 94 | 95 | ### 交易系统 96 | 97 | 负责订单的执行和仓位管理,主要是负责把策略生成的信号或者订单提交到不同的Broker进行执行,并且 98 | 返回执行结果,也负责仓位的查询等等。这块其实内容很丰富,也会直接影响公司的PnL。 99 | 100 | 语言框架: 101 | 102 | - Java/Python 103 | 104 | ### 研究系统 105 | 106 | 这部分主要是为了研究人员进行量化研究做一些工具,比如回测工具,基本的分析模块,新的数据集, 107 | Alpha的分析等。 108 | 109 | 语言框架: 110 | 111 | - Python 112 | 113 | ### 量化开发 114 | 115 | 这部分程序员的主要任务是把研究人员证明可行的信号,转化成可以实际交易执行的代码,投放到交易系统 116 | 进行交易。属于连接想法和实践的桥梁,这块其实内容很丰富,也会直接影响公司的PnL。 117 | 118 | 语言框架: 119 | 120 | - Java/Python 121 | 122 | ### 前端开发 123 | 124 | 这部分跟正常的前端差不多,主要为后端API提供一个GUI 125 | 126 | 语言框架: 127 | 128 | - Js/Python 129 | - React 130 | -------------------------------------------------------------------------------- /docs/quant-dev/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | tags: 3 | - quant-dev 4 | --- 5 | 6 | # Quant Dev 7 | 8 | -------------------------------------------------------------------------------- /docs/quant-dev/quant-dev-db.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Quant Dev 4 - 数据库 3 | tags: [Hedge Fund, Quant, Python,Database, SQL] 4 | categories: Career 5 | date: 2022-10-03 6 | --- 7 | 8 | 继续之前的系列,这一期我们讲讲 Quant Dev 经常会接触到的数据库。同样,这里我们不讨论高频交易,虽然决大部分内容都是重合的。 9 | 10 | 数据库的类型和优缺点本身是一个非常大的主题,我无法也没有能力在一篇文章中阐述清楚,这里仅介绍一些量化领域常见的数据库实现和使用场景。 11 | 12 | 应该注意的是,通用数据库不一定适合某些量化交易使用场景,因此很多公司在使用通用数据库的同时也会开发内部的专用数据可来解决特定的问题。 13 | 14 | ## 前置信息 15 | 16 | 分析数据库,我们从以下几个方面展开: 17 | 18 | - 数据模型,Data Model 19 | - set of records,row based 20 | - graph 21 | - document,json,bson ... 22 | - columnar 23 | - 数据类型描述,Data Define Language - Schema 24 | - 查询语言,Manipulation and Query Language 25 | - SQL 26 | - awk 27 | - 通用语言,c,python,java,etc.. 28 | - 水平、纵向拓展模型 29 | 30 | 量化交易涉及到的数据库可以分成几类: 31 | 32 | - 定制数据库 33 | - 完全定制,比如 34 | - [Next generation of Arctic](https://github.com/man-group/arctic) 35 | - 半定制,比如 36 | - [Man Arctic](https://github.com/man-group/arctic) 37 | - 通用数据库 38 | - 有固定 Schema 的 39 | - 关系型 Relational,比如 PostgreSQL,MySQL,TimescaleDB 40 | - 列数据库 Columnar,比如 KDB,Cassandra 41 | - 无固定 Schema 的 42 | - 文档型 Document,比如 MongoDB,InfluxDB 43 | 44 | 值得注意的是,很多时候定制数据库也不需要重新设计并实现一套数据库(存储、执行、优化等等),我们可以使用已有的数据库进行二次开发。比如,Arctic 就是一个基于 MongoDB 的时间序列数据库,而 TimescaleDB 就是基于 PostgreSQL 开发的时间序列数据库。 45 | 46 | 另外,在分析数据库的时候还需要注意使用场景: 47 | 48 | - OLTP:适合高写入、高读取,但是数据量较小的场景 49 | - OLAP:适合低写入,但是分析复杂且数据量大的场景 50 | 51 | ![](https://i.imgur.com/aCsAYa3.png) 52 | 53 | ## 我们需要什么技能 54 | 55 | *SQL 语言是必要的。* 56 | 57 | 因为 SQL 的使用场景已经超出了关系型数据库,比如列数据库 Cassandra 的查询语言 CQL 其实也是类 SQL 语言;TimescaleDB 是时间序列数据可,其查询语言也是 SQL;即使是文档型数据库 也可以使用 SQL 进行查询。 58 | 59 | 另一方面,SQL 是一个设计非常优秀的描述性计算机语言,识别适合描述数据逻辑,由于不需要指定如何进行查询,数据库后台根据查询语句进行进行充分的优化。 60 | 61 | 最后,SQL 也是很多 DataFrame API(如 Pandas)的设计蓝本。 62 | 63 | *PostgreSQL* 64 | 65 | 选择一个 SQL 数据库,学习基本的 SQL 概念,比如Schema、表、View、Trigger、约束等等。至于使用那个一实现,可根据公司的情况,不知道用哪个就选择 PostgreSQL,它是最原汁原味的开源 SQL 数据库。 66 | 67 | *MongoDB* 68 | 69 | 文档型数据库的使用,基本的增删查改操作,Index的使用等等。 70 | 71 | ## 选择数据库 72 | 73 | 量化行业绝大部分数据可以直接使用 SQL 数据库进行存储和查询。比如中低频的价格信息、标的物的参照信息、标的物的元数据(mapping、id等等)、财报数据等等。 74 | 75 | 量化行业的另一类数据就是时间序列了。这类信息也可以采用 SQL 数据库存储,但是由于这种信息通常是追加为主,很少修改,而且查询通常涉及非常多的历史记录,且比较复杂,一般会采用专门的数据库或者数据库前端进行处理。比如 TimescaleDB 或者 Arctic。 -------------------------------------------------------------------------------- /docs/quant-dev/quant-dev-framework.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 股票中低频股票系统化交易 | Quant dev 技能框架 3 | tags: Quant 4 | categories: Career 5 | date: 2022-03-08 6 | math: true 7 | --- 8 | 9 | 中低频策略主要由两个方面的定义: 10 | 11 | 1. 持仓周期以天为单位(注意是持仓周期,不是交易频率,中低频也存在日内交易) 12 | 2. 目标仓位生成与交易执行之间的反馈循环频率较低 13 | 14 | - [场景](#场景) 15 | - [研究回测](#研究回测) 16 | - [实盘交易](#实盘交易) 17 | - [复盘审核](#复盘审核) 18 | - [基础组成部分](#基础组成部分) 19 | - [软件框架](#软件框架) 20 | - [数据存储和版本控制](#数据存储和版本控制) 21 | - [计算](#计算) 22 | - [实盘交易](#实盘交易-1) 23 | - [系统实现](#系统实现) 24 | - [数据](#数据) 25 | - [计算](#计算-1) 26 | - [部署](#部署) 27 | - [软件和框架总结](#软件和框架总结) 28 | 29 | ## 场景 30 | 31 | 系统化交易的实际场景主要可以分为:研究回测、实盘交易和复盘审核。因为产生目标投资组合(Target)与订单执行(Execution)的反馈循环较弱,通常可以拆分目标投资组合生成和订单执行,这是中低频策略的主要特征之一。 32 | 33 | 设计系统化交易系统主要实现如下目标: 34 | 35 | - 可回溯,包括数据和配置 36 | - 可警报 37 | - 人工干预接口 38 | - 易于拓展,包括数据、信号和附加组件 39 | 40 | 系统化交易中所有信息都是应该是时间序列,且是 Point in time,PIT 的。换句话说,每一个数据点应该有两个时间戳:事件发生的时间($t$, time)和事件被观测的时间($ot$, observe time)。 41 | 42 | 另外一个思路就是 Append Only,即只增加,不更新。这样每个事件只有一个时间,即发生的时间,$t$。但是,我们需要重构历史,或者建立快照,snapshot,来提速。 43 | 44 | 这样做的主要原因是提供了回溯的可能性,而可回溯是盘后分析、模拟实盘差异分析的关键。 45 | 46 | ### 研究回测 47 | 48 | 这个部分也可以叫做**信号生成**。 49 | 50 | 这部分的产出是某个时间节点,$t$,的目标投资组合 $sig_t$ 或者 $signal_t$,即在该时间点,我们希望实现的持仓,通常是一揽子股票、期货的权重,$w_i$,即 $sig := {w_0, w_1, ..., w_N}$,其中 $i$ 代表交易标的物。 51 | 52 | 通常,目标投资组合是历史数据的函数,$sig_t = g(data_{0..t-1}, config_t)$。这里 $data$ 可以包含各种类型,比如常见的价格、成交量数据、公司财报、天气、专家意见、Stock Loan $sl$、持仓 $pos$、交易约束 $cons$ 等等。$config_t$ 属于策略的配置部分,这部分就是系统化交易的人工因素。 53 | 54 | 当然,为了评估策略的历史表现,我们需要对信号,即 ${sig_0, sig_1, ..., sig_n}$,的历史收益情况进行计算,$PnL = f(sig, price, cost)$,即**回测**。$PnL$ 通常是信号、标的价格、花费的函数。在这个部分,$cost$ 的计算比较复杂,可以建立各种模型,也是研究回测的重头戏,**花费的计算对评估策略的表现有至关重要的作用**。 55 | 56 | ### 实盘交易 57 | 58 | 理想情况下,实盘交易只需要生成最新的目标,$sig_t$,当然这不代表我们只需要 $data_{t-1}$。事实上,我们希望实盘交易系统和回测研究系统采用相同的,$g$ 和 $data$ 来计算。这一点在设计交易系统时非常重要。虽然,$g$ 是一样的,但是通常实盘仅仅需要近期的历史数据。 59 | 60 | 实盘交易过程中还有一个重要的部分,就是审核。审核包含:数据异常、信号异常、订单异常三个主要部分。审核的主要目的是确保每个时间点,$t$,发出的订单都是正确和合理的。 61 | 62 | 最后,在实盘交易中还存在很大的操作风险,即 Operation Risk。这部分其实跟审核相关,也跟运行时异常相关。比如,数据出现异常,导致信号异常,如何人工介入重写? 63 | 64 | $sig_{new} = h(sig_t, data, human)$ 65 | 66 | 其中,$human$ 属于主观部分。 67 | 68 | 实盘最后一步就是根据当前仓位和信号生成订单提交: 69 | 70 | $order_t = pos_{t-1} - sig_{t}$ 71 | 72 | ### 复盘审核 73 | 74 | 复盘这个部分主要是计算回测结果和实盘结果之间的差异,并寻找差异根源。模拟和实盘的差别可以说是系统化交易一个老大难问题了。 75 | 76 | $\Delta_t^{sig} = sig_t^{sim} - sig_t^{live}$ 77 | 78 | $\Delta_t^{pnl} = PnL_t^{sim} - PnL_t^{live}$ 79 | 80 | $\Delta_t^{sig}$ 是模拟得到的投资组合权重与实盘记录的投资组合的权重之间的差异,$\Delta_t^{pnl}$ 是模拟盈亏和实盘盈亏之间的差异。这两个差异是不同的,因为 $PnL^{sim} = f(sig, price, cost)$,而实盘盈亏是直接根据仓位计算的,这里面除了 $sig$ 至少多一个 $cost$ 的区别,而且还可能有其他的区别。 81 | 82 | ## 基础组成部分 83 | 84 | 通过上述分析可以发现如下值: 85 | 86 | - $data$,一切数据源 87 | - $sig^{sim}$,信号或者 Alpha 88 | - $config$,配置文件 89 | - $human$,人工输入 90 | - $cons$,交易约束 91 | - $cost^{sim}$,模拟交易成本 92 | - $pos$,仓位 93 | - $sig^{live}$,实际成交的仓位 94 | - $PnL^{live}$,实盘盈亏 95 | - $cost^{live}$,实盘交易成本 96 | 97 | 其中,$pos$, $sig^{live}$, $PnL^{live}$, $cost^{live}$ 只能通过实盘记录累积获得历史。 98 | 99 | 可以发现如下关系: 100 | 101 | - $g$, $sig_t = g(data_{0..t-1}, config_t, cost, cons)$ 102 | - $h$, $sig_{new} = h(sig_t, data, human)$ 103 | - $f$, $PnL^{sim} = f(sig, price, cost)$ 104 | 105 | 其中,$g$ 是数据+配置产生信号的函数,$h$ 是人工干预函数,$f$ 就是模拟函数,即计算模拟盈亏的函数。 106 | 107 | 复盘信息: 108 | 109 | - $\Delta_t^{sig}$ 110 | - $\Delta_t^{pnl}$ 111 | 112 | ## 软件框架 113 | 114 | 识别基础数据类型、函数和需求后,就可以考虑构建支持这种系统的软件架构。 115 | 116 | ### 数据存储和版本控制 117 | 118 | 数据主要包含两大类:外部数据和内部数据。 119 | 120 | 外部数据即由第三方提供的数据,比如: 121 | 122 | - 价格、成交量数据 123 | - 基本面数据 124 | - Ticker Mapping 125 | - Reference Data 126 | - 其他非传统数据,比如天气、流量、新闻等等 127 | 128 | 内部数据即本地产生的数据,比如: 129 | 130 | - 策略或者信号的配置文件 131 | - 人为干预事件 132 | - 实盘成交数据、税收、交易费用等等 133 | 134 | (文本数据可以轻松版本控制,其他格式呢?比如二进制数据,如何版本控制) 135 | 136 | 所有数据应该尽可能做到版本控制,一方面可以回溯,另一方面可以快速回滚。 137 | 138 | ### 计算 139 | 140 | 计算包括:信号生成和回测、复盘分析、实盘信号生成。 141 | 142 | 这部分主要考虑如何高效组织大规模计算。通常的做法是采用计算图,Computation Graph,进行组织。 143 | 144 | ### 实盘交易 145 | 146 | 实盘交易部分主要涉及: 147 | 148 | - 警报系统 149 | - 实盘报告系统 150 | - 人工干预接口 151 | - 执行接口 152 | 153 | 一般来说,中低频交易系统中,执行系统往往呈现黑箱状态,即通过API进行沟通。 154 | 155 | ## 系统实现 156 | 157 | ### 数据 158 | 159 | - 低频数据:基于文件、Rest API、爬虫 160 | - 高频数据:socket 161 | 162 | 主要涉及的软件: 163 | 164 | - 消息队列:比如 Kafka 165 | - 高速缓存:比如 Redis 166 | - 持久化:比如 MySQL、MongoDB或者其他定制实现 167 | - 数据管道管理:比如 Airflow 168 | 169 | 特别是对于持久化,选择那种方案,多数取决于数据的使用场景和频率。在股票系统化交易中,数据多数为二维,少数情况为多维数组。最常见的数据结构就是一个二维的 Table like 数据,索引(index)通常是时间,列通常是股票id或者其他任何标签。写入通常是重写、追加、更新,而读取通常需要一些过滤,比如选中某段时间的,某些列,或者一些窗口等操作。 170 | 171 | 股票交易中还有一个比较复杂的数据就是ID的映射和一些静态信息,比如一只股票在不同的数据源就有用多个ID,比如 Bloomberg,Reuters,ISIN 等等,他们之间映射往往是 PIT 的,即不同的时间观察,会有不同的结果,这对实盘和回测都有较大影响。 172 | 173 | ### 计算 174 | 175 | 计算可以分成两个部分:描述和执行。描述一般是通过 DAG,有向无环图完成,即惰性。而执行则是 DAG 的运行时。目前 DAG 的运行时选择很多,后端也很多。 176 | 177 | 这里推荐一个:Dask。Dask 的运行时后端可以是 K8s,Spark,或者单机多核心。 178 | 179 | 当然,DAG 中的每一个任务还是执行代码,这部分 Python 生态也非常优秀: 180 | 181 | - numpy 182 | - pandas 183 | - scipy 184 | - tensorflow 185 | - polars 186 | 187 | 注意,将计算的描述和执行分开是非常有用的抽象,因为计算描述在某种程度上可以被版本控制,而且可以最大限度的降低重复计算,提高效率。 188 | 189 | 不同的任务之间,可以采用类似 Airflow 的软件进行管理。 190 | 191 | ### 部署 192 | 193 | 部署涉及: 194 | 195 | - 代码部署 196 | - 计算资源部署 197 | - 策略配置文件部署 198 | 199 | 再部署方面,把代码、计算资源和配置分离,可以最大限度的增加灵活性和可控性。 200 | 201 | 这部分用到的主要软件: 202 | 203 | - Docker 204 | - Git 205 | - Linux 206 | - Jenkins 207 | 208 | 另外,最好维护三个不同的环境:dev、stage、prod。dev 是主要的开发环境,变化最快嘴不稳定;stage 是主要的测试环境,相对比较稳定;prod是生产环境,只有通过stage测试阶段的 Image、config 才会被部署到prod。 209 | 210 | ## 软件和框架总结 211 | 212 | - Kafka 213 | - Redis 214 | - MySQL | MongoDB 215 | - Airflow 216 | - Git 217 | - Linux 218 | - Jenkins 219 | - Spark 220 | - Docker 221 | - K8s 222 | 223 | 224 | 语言和库: 225 | 226 | - Python 227 | - numpy 228 | - pandas 229 | - sicpy 230 | - dask 231 | - polars 232 | 233 | -------------------------------------------------------------------------------- /docs/quant-dev/quant-dev-in-pod.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: Pod 模式的量化交易系统 3 | date: 2023-09-17 4 | --- 5 | 6 | 量化交易属于金融行业,再细说,属于二级市场,即交易的标的物通常是公开交易的产品,比如股票、期货、期权、债券等等。 7 | 量化行业里面其实也分了很多类别,比如股票量化、期货量化、固定收益类产品等等。 8 | 这些类别中,其实也可以按照频率分成高频、中频和低频。 9 | 各个门类之间有区别也有联系,但是总体来说,作为个人,通常是专精其中某个领域。 10 | 11 | ## Pod 是什么 12 | 13 | 各大量化公司的运营模式也不尽相同,今天我们讲到的 Pod 就是其中一类。 14 | 一个 Pod 可大可小,多则数十人,少则几人。这群人有自己的专精领域,交易某类或者某几类策略或者标的物。 15 | 他们会得到母公司不同程度的支持(这里我们只从技术角度思考),比如基本的数据源、数据库、计算机资源、交易接口等等。 16 | 他们通常会自负盈亏,但也会共同进退。 17 | 18 | ## Pod 模式的量化交易系统需求 19 | 20 | Pod 模式的量化交易系统设计跟其他模式有什么区别呢?或者说 Pod 模式的量化系统设计有需求呢? 21 | 22 | - 针对某类交易策略设计,并不需要非常好的通用性,但是需要很好的专用性 23 | - 不是为很多程序员一起工作设计的,而是为了团队的所有成员,包括 Quant,Trader 和 其他程序员 24 | - 系统需要对接不同种类的数据源和交易基础设施,最好系统可以以最小的代价接入不同的公司的基础设施 25 | - 系统不能过于复杂,且具有良好的可操作性,换句话说,他的接口不应该是仅仅面对程序员的,也是面对 Quant 和 Operation 人员的 26 | - 要有一定的拓展能力,这种拓展在不同策略类型前提下可能会有不同的需求,比如一个中频统计套利系统跟高频套利系统在很多方面都是迥异的 27 | 28 | ## 如何设计呢? 29 | 30 | 一些通用原则: 31 | 32 | - 仅开发必要的功能 33 | - 面向接口编程 34 | - 按照业务逻辑设计模块 35 | - 分离配置和计算逻辑 36 | - 版本控制配置文件 37 | - 格式化日志 38 | - 通过日志和警报增加系统可见性 39 | - 通过 GUI 增加系统的可操作性 40 | 41 | ## 技术栈 42 | 43 | - 语言 44 | - Python 45 | - C++ 46 | - Cython 47 | - Numba 48 | - 数据库 49 | - PostgreSQL 50 | - DataFrame Store ( hand made or ArcticDB ) 51 | - 中间件 52 | - Redis 53 | - Kafka/RedPanda 54 | - 计算 55 | - Ray 56 | - Dask 57 | - 监控 58 | - Grafana 59 | - Prometheus 60 | - Front End 61 | - 编排 62 | - Airflow 63 | - K8s 64 | - Docker 65 | 66 | ## 组件 67 | 68 | - 计算图和计算图的运行时 69 | - Batch Based 70 | - Event Based 71 | - Prompt,用来跟系统进行实时互动,人为干涉 72 | - Alert,用来发送警报、异常等等 73 | - Monitor 74 | - Report 75 | - Log 76 | -------------------------------------------------------------------------------- /docs/quant-dev/quant-dev-language.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 如何成为 Quant Dev 3 - 语言 3 | tags: [Hedge Fund, Quant, Python] 4 | categories: Career 5 | date: 2022-01-22 6 | --- 7 | 8 | 之前的连篇文章主要介绍了 Quant Dev (QD) 的分类和学习路径,这一篇我们重点介绍行业内常用的软件、语言和框架。 9 | 10 | **注意** 本系列主要针对买方 Quant Dev,而不是卖方或者 Quant 这个职业。通常来说,Quant 和 Quant Dev 的技能和技术栈有一些重叠,但是差异仍然较大。 11 | 12 | 之前的文章提过,Quant Dev 首先必须是一个好的程序员,通常是一个好的后端程序员,因此,QD 的基础技术栈跟一般的后端程序员非常类似,而由于业务的关系 QD 对某些语言、框架和知识的需求更多一些。 13 | 14 | 15 | 首先我们来说买方 QD 常用的计算机语言,不出预料就是下面四位: 16 | 17 | - Python 18 | - Java 19 | - C# 20 | - C++ 21 | 22 | 23 | 近些年,我也观察到一些其他语言正在慢慢进入 QD 的世界,其中比较有潜力的就是`Rust`,因为 Rust 是近些年底层语言领域唯一有希望跟 C++ 在性能和流行度一争高下的语言。当然,也有一些公司会用一些比较小众的语言,比如 JaneStreet 大量使用了`Ocaml`,一些做量化交易软件的公司会配合使用`F#`。 24 | 25 | 虽然在对冲基金内部,使用的语言通常跑不出这些主流语言,但是他们的应用场景却非常不同。 26 | 27 | ## Python 28 | 29 | > TL;DR 30 | 31 | 优势: 32 | 33 | - 数据科学生态好 34 | - 研究和生产部署统一技术栈 35 | - 快速迭代、部署、Debug 36 | 37 | 劣势: 38 | 39 | - 执行效率低、内存占用高 40 | - 动态类型、运行时异常 41 | - GC、无法提供稳定延迟 42 | 43 | 解决方案: 44 | 45 | - 执行效率和内存:numba | cython | pypy 46 | - 运行时异常:mypy + 类型标注 47 | - 相对稳定 GC 延迟:pypy 48 | 49 | 适用领域: 50 | 51 | - 数据预处理、清洗 52 | - 策略以及投资组合研究、分析 53 | - 中低频策略执行 54 | - 盘后分析 55 | 56 | 不适领域: 57 | 58 | - 订单执行、管理系统 59 | - 高频策略执行 60 | 61 | ### 优势 62 | 63 | `Python` 现在是数据相关行业的首选,包括对冲基金,主要是得益于他强壮的数据科学生态:数据抓取、清洗、分析、机器学习等等方面都有丰富的支持。 64 | 65 | `Python`还有一个独特的优势,就是对于研究人员,比如 Quant 非常友好,同时它又有相对健全的通用编程生态,比如异步、并发、数据库接口、丰富的云生态等等,这些都使得`Python`在很多对冲基金同时成为了研究语言和生产语言,也就是说同一个语言兼顾了研究和生产环境。这种协调统一显然加速了策略从研究到投产的过程,使得交易策略可以快速迭代。这一点新兴的“科学计算”语言`Julia`就相差较远了。 66 | 67 | `Python`的另一优势在于动态语言方便的 Debug 能力和自省能力,代码编写变得非常轻松,通常比起语言需要更少的代码量来实现业务功能。而且,量化对冲基金的业务模式对 Bug 非常敏感,一旦出现软件问题,能否快速的定位和修复异常重要。当然,这些不是一个语言单独可以解决的问题,但动态语言的特性绝对有助于加速定位和修复。 68 | 69 | 70 | ### 劣势 71 | 72 | `Python`的短板也非常明显。主要由两个问题:性能和动态类型。这两个短板也是相互联系的,通常动态语言的性能都会相对较差。 73 | 74 | 首先,性能。性能主要体现在两个方面:内存和运行速度。Python 的内存占用对比其他语言,比如 C++,要大不少,这种劣势会随着数据量和计算量的增加逐渐凸显。特别是当使用类似 Pandas、Numpy 库时,一些数据计算单次需要用到的内存可能会达到 80 到 100GB。而且通常是峰值内存较大,比如计算过程中需要拷贝数据,这种峰值内存导致容器化的内存上线必须提高,造成浪费。而且如果类似的计算太多,就会对计算集群提出更高的需求。运行速度则是另外一个短板,尽管我们有一些方案,比如 `PyPy`,`numba`,`Cython`,但是这些方案无疑提高了开发复杂度,同时语言本身的Overhead仍然存在。 75 | 76 | 其次,动态类型。动态类型再生产过程中最主要的问题是,运行时错误。因为没有静态类型,也没有编译器,编译器无法提前告诉我们代码中潜在的类型问题。这一点在项目体积变大,文件数量庞大的时候,变得尤其突出,经常是改了一个地方,隐藏的破坏了另一个地方,而没有编译器提前告诉程序员。这些错误,通常只能在运行时暴露出来,所以 Python 开发对于测试的编写非常依赖。但是。。测试终究不能覆盖所有情况。当然,社区也有对应的解决方法,比如类型分析包:`mypy`,通过在代码中增加类型标注,配合 `mypy` 进行静态类型检查。 77 | 78 | GIL,全局解释器所,也是 CPython 一直被诟病的点,社区提出了不少应对方案,如 `PyPy`、多进程、异步,当终究隔靴搔痒。 79 | 80 | 最后一点是所有带垃圾回收的语言都会存在的问题,延迟不稳定。因为 Python 也带有一个 STW,Stop The World,GC,因此系统随时可能迎来GC,特别是当堆内存巨大的时候,这种延迟可能达到数百毫秒。因此,在对实时性要求较高的应用中 CPython 并不合适。 81 | 82 | ## C++ / Rust 83 | 84 | > TL;DR 85 | 86 | 优势: 87 | 88 | - 执行效率高 89 | - 内存占用低 90 | - 延迟可控 91 | - 类型系统和编译器( Rust 尤其突出 ) 92 | 93 | 劣势: 94 | 95 | - 数据科学工具链相对薄弱、难用 96 | - 上手难度大、语言特性繁多 97 | - 内存安全问题 ( Rust 基本没有这个问题 ) 98 | - 编写复杂业务逻辑成本较高 99 | 100 | 适用领域 101 | 102 | - 回测框架的核心代码 103 | - 高频交易系统 104 | - 低延迟订单管理、执行系统 105 | 106 | 不适领域: 107 | 108 | - 策略研究、原型测试 109 | 110 | ## Java / C# / Go 111 | 112 | > TL;DR 113 | 114 | 这一卦的语言呢,介于 Python 和 Rust、C++ 之间,基本属于万金油。特别 Java 系在大数据领域仍然出于老大哥位置,绝大部分的中间件都是 JVM 实现的,比如 Kafka、Spark、Flink 等等。在各大投行、对冲基金中,这一卦 GC 语言仍然占据半壁江山。 115 | 116 | 如果说 Python 的优势在于快速迭代测试、适合中低频策略;C++、Rust 适合高频、低延迟领域;这一卦 GC 语言就比较适合订单管理、执行系统。 117 | -------------------------------------------------------------------------------- /docs/quant-dev/quant-dev-skills.md: -------------------------------------------------------------------------------- 1 | --- 2 | title: 如何成为 Quant Dev 2 - 技能树 3 | date: 2021-12-05 4 | categories: Career 5 | tags: [Quant, Hedge Fund] 6 | --- 7 | 8 | 上一篇文章介绍了量化对冲基金中程序员的分类和职能,其中 `Quant Dev` 是量化对冲基金的核心业务开发人员,所以这一篇我们重点讨论 Quant Dev 的要求、技能和学习路径。 9 | 10 | - [总体要求](#总体要求) 11 | - [技能树](#技能树) 12 | - [合格的程序员](#合格的程序员) 13 | - [量化](#量化) 14 | - [学习路径](#学习路径) 15 | - [计算机学习](#计算机学习) 16 | - [量化学习](#量化学习) 17 | 18 | ## 总体要求 19 | 20 | Quant Dev 首先得是一个合格的开发者,然后需要对业务有比较深刻的理解。**Quant Dev 是连接策略思想和自动化交易的桥梁**,不同的策略对软件的要求也不尽相同,有一些策略,比如高频策略,对计算机底层技能的要求更高;而另一些策略,比如中低频策略,对软件架构和软件工程要求更高。 21 | 22 | 因此,一个好的 quant dev: 23 | 24 | - 首先是一个合格的程序员 25 | - 然后根据不同的策略类型,深入理解模型和执行特性等业务逻辑。 26 | - 对计算机和量化充满热情 < --- 这是最重要的 27 | 28 | ## 技能树 29 | 30 | 知道了2个需求,我们看一下技能树。 31 | 32 | ### 合格的程序员 33 | 34 | 关于这个我做过另一起视频(文章)讲解。这里总结必备基础技能如下: 35 | 36 | - 计算机组成原理 37 | - 操作系统 38 | - 数据库原理 39 | - 计算机网络 40 | - 计算机语言和编译原理 41 | 42 | 多说点,计算机语言方面: 43 | 44 | - 经典语言:Python | Java/C# | C++ 45 | - 更加现代的语言: Go | Rust 46 | - 极客公司:Ocaml | F# | Clojure 47 | 48 | 关于语言的选择,一定要有自己的“灵魂”语言,即这门语言可以做到精通:掌握基本的语法,可以流畅写出适合该语言代码风格的程序,熟悉语言的生态圈(库和框架),了解语言背后的逻辑(虚拟机、垃圾回收、编译器等等)。 49 | 50 | 绝大部分公司的技术栈都是比较单一的(这是好事情),你的灵魂语言可能决定了你可以去哪家公司。当然这不是绝对的,一个好的程序员应该可以在短时间适应一个新的语言。尽管如此,精通一门语言会让学习其他语言更轻松。 51 | 52 | ### 量化 53 | 54 | 这部分属于业务相关技能,跟从事的量化策略分类有很大关系,所以应该根据自己所处的公司选择。 55 | 56 | 当然还是有一些共通的技能: 57 | 58 | - 基本的概率论和统计 59 | - 基本的线性代数 60 | - 基本的金融市场基础知识 61 | - 基本的量化交易基础知识 62 | 63 | 这些共通技能之后,就要根据自己的领域,选择专精了。比如高频、做市、期货、股票等等。 64 | 65 | ## 学习路径 66 | 67 | ### 计算机学习 68 | 69 | 可以参考我之前关于转行计算机的视频(文章),里面有推荐书籍和课程。 70 | 71 | [如何转行计算机做程序员](https://wangzhe3224.github.io/2021/10/20/roadpath/) 72 | 73 | ### 量化学习 74 | 75 | 这里我推荐一些书籍和课程,当然主要是针对上面提到的基础知识部分,因为专精的部分我只能根据我自己的领域推荐了,以后会专门给大家讲。 76 | 77 | 以下是一些量化基础知识: 78 | 79 | [量化投资学习路线图 - 书籍篇](https://wangzhe3224.github.io/2021/12/04/quant_trading_books/) 80 | 81 | 基本的数学知识: 82 | 83 | - [Mathematics for Computer Science](https://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-042j-mathematics-for-computer-science-fall-2010/) 84 | - [Linear Algebra Done Right](https://linear.axler.net/) 85 | - [Linear Algebra](https://ocw.mit.edu/courses/mathematics/18-700-linear-algebra-fall-2013/index.htm) -------------------------------------------------------------------------------- /docs/research-intro.md: -------------------------------------------------------------------------------- 1 | --- 2 | date: 2023-05-30 3 | categories: Career 4 | tags: [hedge-fund, quant] 5 | comments: true 6 | status: new 7 | --- 8 | 9 | # Quant 学习指南 10 | 11 | > 本篇主要内容针对 Equity Long-short 类策略展开,尽管大部分内容可能也适用于其他策略类型。 12 | 13 | 系统书籍 14 | 15 | - 《Active Portfolio Management: A Quantitative Approach for Providing Superior Returns and Controlling Risk》By Richard C. Grinold and Ronald N. Kahn. 16 | - 《Advances in Active Portfolio Management: New Developments in Quantitative Investing》By Richard C. Grinold and Ronald N. Kahn. 17 | - 《Quantitative Strategies for Achieving Alpha: The Standard and Poor's Approach to Testing Your Investment Choices》 18 | - 《What works on Wall Street》 19 | - 《因子投资:方法与实践》by 石川,刘洋溢,连祥斌 20 | 21 | 学术论文 22 | 23 | - [arxiv - Quantitative Finance](https://arxiv.org/list/q-fin/new) 24 | - [SSRN](https://www.ssrn.com/index.cfm/en/) 25 | 26 | Alpha 库 27 | 28 | - [WorldQuant 101 Alpha](https://www.joinquant.com/help/api/help#name:Alpha101) 29 | - [短周期价量特征 191 Alphas 因子](https://www.joinquant.com/help/api/help#Alpha191:%E7%9F%AD%E5%91%A8%E6%9C%9F%E4%BB%B7%E9%87%8F%E7%89%B9%E5%BE%81191Alphas%E5%9B%A0%E5%AD%90%E5%87%BD%E6%95%B0%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E) 30 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Quant路线图 2 | site_author: FunCoder 3 | site_description: >- 4 | Quant路线图 5 | 6 | repo_name: quant-roadmap 7 | repo_url: https://github.com/wangzhe3224/quant-roadmap 8 | 9 | copyright: Copyright © 2022-present FunCoder 10 | 11 | theme: 12 | logo: assets/logo.jpeg 13 | name: material 14 | language: zh 15 | include_search_page: true 16 | search_index_only: true 17 | plugins: 18 | - meta 19 | features: 20 | - header.autohide 21 | - navigation.tracking 22 | - navigation.top 23 | - search.highlight 24 | - search.share 25 | - search.suggest 26 | - content.code.annotate 27 | palette: 28 | - media: "(prefers-color-scheme: light)" 29 | scheme: default 30 | primary: light blue 31 | accent: deep purple 32 | toggle: 33 | icon: material/weather-sunny 34 | name: Switch to dark mode 35 | - media: "(prefers-color-scheme: dark)" 36 | scheme: slate 37 | primary: cyan 38 | accent: deep purple 39 | toggle: 40 | icon: material/weather-night 41 | name: Switch to light mode 42 | icon: 43 | repo: fontawesome/brands/github 44 | admonition: 45 | note: octicons/tag-16 46 | abstract: octicons/checklist-16 47 | info: octicons/info-16 48 | tip: octicons/squirrel-16 49 | success: octicons/check-16 50 | question: octicons/question-16 51 | warning: octicons/alert-16 52 | failure: octicons/x-circle-16 53 | danger: octicons/zap-16 54 | bug: octicons/bug-16 55 | example: octicons/beaker-16 56 | quote: octicons/quote-16 57 | 58 | custom_dir: overrides 59 | 60 | markdown_extensions: 61 | - attr_list 62 | - md_in_html 63 | - admonition 64 | - pymdownx.details 65 | - pymdownx.inlinehilite 66 | - pymdownx.snippets 67 | - pymdownx.superfences 68 | - pymdownx.tabbed: 69 | alternate_style: true 70 | - pymdownx.arithmatex: 71 | generic: true 72 | # - pymdownx.emoji: 73 | # emoji_index: !!python/name:materialx.emoji.twemoji 74 | # emoji_generator: !!python/name:materialx.emoji.to_svg 75 | 76 | plugins: 77 | - search: 78 | lang: en 79 | - tags 80 | # doc : https://timvink.github.io/mkdocs-git-revision-date-localized-plugin/options/ 81 | - git-revision-date-localized: 82 | custom_format: "%d. %B %Y" 83 | timezone: Europe/Amsterdam 84 | locale: en 85 | fallback_to_build_date: true 86 | enable_creation_date: true 87 | exclude: 88 | - x.md 89 | enabled: true 90 | 91 | extra: 92 | analytics: 93 | provider: google 94 | property: G-G122G5QKQ7 95 | social: 96 | - icon: fontawesome/brands/github 97 | link: https://github.com/wangzhe3224 98 | generator: false 99 | 100 | extra_javascript: 101 | - https://polyfill.io/v3/polyfill.min.js?features=es6 102 | - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js 103 | - _js/pageview.js 104 | - _js/lunr.min.js 105 | 106 | nav: 107 | - 前言: "index.md" 108 | - Quant Dev: 109 | - 索引: "./quant-dev/index.md" 110 | - 量化基金程序员分类: "./quant-dev/category.md" 111 | - 如何成为 Quant Dev - 技能树: "./quant-dev/quant-dev-skills.md" 112 | - 如何成为 Quant Dev - 语言: "./quant-dev/quant-dev-language.md" 113 | - 如何成为 Quant Dev - 框架: "./quant-dev/quant-dev-framework.md" 114 | - 如何成为 Quant Dev - 数据库: "./quant-dev/quant-dev-db.md" 115 | - Quant Dev - Pod: "./quant-dev/quant-dev-in-pod.md" 116 | - Quant 入门: "research-intro.md" 117 | - 资源: 118 | - 相关 Kaggle 竞赛和数据: "kaggle.md" -------------------------------------------------------------------------------- /overrides/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} {% block disqus %} 2 | 17 | 19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /overrides/partials/comments.html: -------------------------------------------------------------------------------- 1 | {% if page.meta.comments %} 2 |

{{ lang.t("meta.comments") }}

3 | 4 | 19 | 20 | 21 | 49 | 51 | {% endif %} --------------------------------------------------------------------------------