-
Notifications
You must be signed in to change notification settings - Fork 32
/
README.org
335 lines (295 loc) · 13.2 KB
/
README.org
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
# -*- mode:org; org-confirm-babel-evaluate: nil -*-
#+TITLE: abquant
#+AUTHOR: Jimmy M. Gong
#+EMAIL: [email protected]
#+LANGUAGE: zh-Hans
#+OPTIONS: H:3 num:nil toc:nil \n:t ::t |:t ^:nil -:nil f:t *:t <:t html-postamble:nil html-preamble:t tex:t
#+URI: /blog/%y/%m/%d/
#+DATE: 2020-01-01
#+LAYOUT: post
#+TAGS: OFFICE(o) COMPUTER(c) HOME(h) PROJECT(p) READING(r)
#+CATEGORIES:
#+DESCRIPTON: A&B professional platform for quantitative finance. God is asking & bidding Me. ABQ. GABQ. GABM.
#+KEYWORDS: quant c++
#+STARTUP: overview
#+STARTUP: logdone
* Description
A&B professional platform for quantitative finance. God is asking & bidding Me.
ABQ.
abquant 分为三大模块 a) 数据获取 b) 策略回测 c) 模拟/实盘交易
- abquant-data ::
开源项目, 快速对 *通达信* 数据的获取,除权除息,各种指数的计算
- abquant-strategy ::
闭源项目,基于 zeromg/nanomsg
- abquant-trade ::
[[https://github.com/yssource/rqalpha-mod-xtrade][xtrade]]
闭源项目
* Note
[WIP]
开发中 ...
ABQuant is an early developer preview, and is not suitable for general usage yet. Features and implementation are subject to change.
* 构建
作者本人是在 x86_64 Linux 4.19.105-1-MANJARO 上构建本项目,暂时不支持
Windows. \\
你需要安装好 clang++/llvm ccache ninja python pip poetry conan cmake/qmake 等基础开发工具
- 核心模块 cpp
- 中间层 binding ([[https://github.com/pybind/pybind11.git][pybind11]] [[https://doc.qt.io/qtforpython/shiboken2/][ +shiboken2+ ]])
- 用户接口层 python
** cpp 依赖
- ORM 层 [[https://github.com/yssource/treefrog-framework.git][treefrog-framework]] ::
#+name: treefrog-framework
#+begin_src shell :exports code
git clone -b feature/withConan https://github.com/yssource/treefrog-framework.git
cd treefrog-framework && mkdir -v qbuild && cd qbuild
conan install .. --build missing --profile ../tf.profile
conan build ..
sudo make install
sudo ldconfig
#+end_src
- abquant 核心应用层 ::
#+name: abquant-building
#+begin_src shell :exports code
git clone https://github.com/yssource/abquant-data.git
cd abquant-data && mkdir -v qbuild && cd qbuild
conan install .. --build missing --profile ../abquant.profile
conan build ..
sudo make install
sudo ldconfig
# binding
cd abquant-data && mkdir -v cbuild && cd cbuild
conan install .. --build missing --profile ../abquant.profile
conan build ..
# todo:: qbuild, cbuild 将来会直接放在 setup.py 中作为 ext_modules 完成。
# 用户只需 poetry install
#+end_src
** python 依赖安装
#+begin_src python :exports code
poetry install
poetry update
#+end_src
** 环境变量
请参照 .envrc 文件, 推荐使用 direnv 管理环境变量
#+begin_src shell :exports code
export ABQ_HOME=${PWD}
export ABQ_CXX_HOME="${ABQ_HOME}/cxx"
export LD_LIBRARY_PATH="${ABQ_HOME}/lib:${LD_LIBRARY_PATH}"
export PYTHONPATH="${ABQ_HOME}/lib:${PYTHONPATH}"
#+end_src
* Usage
** abquant config
#+name: config
#+begin_src shell :exports code
# 当前项目根目录下,拷贝 config 文件夹
mkdir -pv ~/.config/abquant && cp -rfv $PWD/cxx/config ~/.config/abquant/
#+end_src
** abquant 数据获取
- python 层获取数据源,支持 mongodb
#+name: data-saving
#+begin_src shell :exports code
# 保存所有数据
# 但是不包含除权数据,除权数据不是经常更新,请手动 "abquant stock xdxr"
abquant save base
# 股票和指数列表获取
abquant stock list
# 保存所有股票日线,日线指数
abquant stock day
abquant stock day --add '["000001", "300001", "600001"]'
# 保存所有股票分钟线,分钟指数
# Default 保存所有频率 (1min, 5min, 15min, 30min, 60min)
abquant stock min
abquant stock min --add '["000001", "300001", "600001"]'
# 保存股票分钟线,分钟指数不同频率数据 (1min, 5min, 15min, 30min, 60min)
# 1min 一分钟
abquant stock min "1min"
abquant stock min -f '["1min"]' --add '["000001", "300001", "600001"]'
# 5min 五分钟
abquant stock min -f '["5min"]'
abquant stock min -f '["5min"]' --add '["000001", "300001", "600001"]'
# ...
# 1min 一分钟和 5min 五分钟
abquant stock min -f '["1min", "5min"]'
abquant stock min -f '["1min", "5min"]' --add '["000001", "300001", "600001"]'
# 股票除权除息
abquant stock xdxr
abquant stock xdxr --add '["000001", "300001", "600001"]'
# 股票数据板块
abquant stock block
# 股票数据明细信息
abquant stock info
abquant stock info --add '["000001", "300001", "600001"]'
# 股票财务数据
abquant stock financial
# ETF 列表获取
abquant etf list
# 保存所有 ETF 日线,日线指数
abquant etf day
abquant etf day --add '["159001", "510010", "510300"]'
# 保存所有 etf 分钟线,分钟指数
# Default 保存所有频率 (1min, 5min, 15min, 30min, 60min)
abquant etf min
abquant etf min --add '["159001", "510010", "510300"]'
# 保存 etf 分钟线,分钟指数不同频率数据 (1min, 5min, 15min, 30min, 60min)
# 1min 一分钟
abquant etf min "1min"
abquant etf min -f '["1min"]' --add '["159001", "510010", "510300"]'
# 5min 五分钟
abquant etf min -f '["5min"]'
abquant etf min -f '["5min"]' --add '["159001", "510010", "510300"]'
# ...
# 1min 一分钟和 5min 五分钟
abquant etf min -f '["1min", "5min"]'
abquant etf min -f '["1min", "5min"]' --add '["159001", "510010", "510300"]'
# ...
#+end_src
#+name: error-data-saving
#+begin_src shell :results output :exports both
# 查看保存数据后的错误信息
bat ~/.config/abquant/log/error_codes.json
#+end_src
#+RESULTS: error-data-saving
: {"Stock_index_day": ["395005"], "Stock_index_min": ["395041", "395005"], "Stock_stock_min": ["300822", "603949", "603353", "300819", "300821", "002976", "688051"], "Stock_xdxr": ["002976", "603949", "300822", "688051", "603353"]}
#+name: error-data-saving
#+begin_src shell :results output :exports both
# 如果在保存数据后,发现数据错误,可以使用
abquant stock day --add '["395005"]'
abquant stock min --add '["395041", "395005", "300822", "603949", "603353", "300819", "300821", "002976", "688051"]'
abquant stock xdxr --add '["002976", "603949", "300822", "688051", "603353"]'
# 注意:这些数据错误可能是退市,已经不存在的数据。也有可能是网络原因,数据不完整,你需要具体分析。
# 在下一次保存数据时,最好先
echo "" 1> ~/.config/abquant/log/error_codes.json
#+end_src
** abquant 数据使用
#+name: cpp-data-using
#+begin_src C++ :exports code
#include <chrono>
#include "abquant/actions/abquant.hpp"
#include "abquant/actions/stockmin.hpp"
#include "abquant/actions/utils.hpp"
using namespace abq;
int main(int argc, char* argv[])
{
// abq entry_point
Abquant::start();
// QStringList codes = {"000001", "000002", "000003"};
QStringList codes = {"000001"};
const char* start = "2017-01-01";
const char* end = "2019-12-01";
MIN_FREQ freq = MIN_FREQ::FIVE;
StockMinAction sma(codes, start, end, freq);
int N = 10;
auto begin = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; ++i) {
// 分钟前复权
sma.to_fq_type(FQ_TYPE::PRE);
// 分钟后复权
// sma.to_fq_type(FQ_TYPE::POST);
}
auto finish_ = std::chrono::high_resolution_clock::now();
std::chrono::duration<double> elapsed = finish_ - begin;
qDebug() << "Elapsed time: " << elapsed.count() << " s\n";
// abq exit_point
Abquant::finish();
return 0;
}
#+end_src
** binding 层
#+name: binding-plot
#+begin_src shell :exports both
python ./bind11/test/test_plot.py
#+end_src
#+RESULTS: binding-plot
#+begin_example
open close high low vol amount date_stamp
code date
000001 2019-01-02 9.39 9.19 9.42 9.16 539386.0 4.986951e+08 1.546358e+09
2019-01-03 9.18 9.28 9.33 9.15 415537.0 3.844577e+08 1.546445e+09
2019-01-04 9.24 9.75 9.82 9.22 1481159.0 1.422150e+09 1.546531e+09
2019-01-07 9.84 9.74 9.85 9.63 865687.0 8.411664e+08 1.546790e+09
2019-01-08 9.73 9.66 9.74 9.62 402388.0 3.892478e+08 1.546877e+09
2019-01-09 9.74 9.94 10.08 9.70 1233486.0 1.229465e+09 1.546963e+09
2019-01-10 9.87 10.10 10.20 9.86 1071817.0 1.079711e+09 1.547050e+09
2019-01-11 10.11 10.20 10.22 10.05 696364.0 7.080018e+08 1.547136e+09
2019-01-14 10.22 10.11 10.25 10.07 500443.0 5.078629e+08 1.547395e+09
2019-01-15 10.11 10.24 10.28 10.09 542160.0 5.530273e+08 1.547482e+09
#+end_example
*** 注意 entry_point && exit_point
#+name: note_c++
#+begin_src C++ :exports code
int main(int argc, char* argv[])
{
// abq entry_point
Abquant::start();
// Your C++ code here.
// abq exit_point
Abquant::finish();
return 0;
}
#+end_src
#+name: note_python
#+begin_src python :exports code
from pyabquant import PyAbquant
# abq entry_point
PyAbquant.start()
# Your python code here.
code = "000001.XSHE"
start = "2020-01-01 00:00:00"
end = "2020-01-01 23:55:00"
fields = ["open", "close"]
actual = get_price(code, start, end, frequency="5min", fields=fields, adjust_type="pre")
ulog.debug(actual)
assert isinstance(actual, (pd.DataFrame))
assert actual.empty is True
# abq exit_point
PyAbquant.finish()
#+end_src
*** plotting
[[file:./screenshot/pyabqstockday.png]]
* DONE Development:
CLOSED: [2021-01-01 Fri 00:00]
:LOGBOOK:
- State "DONE" from "STARTED" [2021-01-01 Fri 00:00]
:END:
- 兼容 rqalpha apis ::
1. [X] get_price
2. [X] get_fundamentals[fn:1]
- 兼容 jointquant apis ::
1. [X] get_all_securities
2. [X] get_security_info
- 东方财富 概念 apis ::
1. [X] easymoney concept base get_blocks
2. [X] easymoney concept history get_price
* WAITING Development:
:LOGBOOK:
- State "STARTED" from "DONE" [2021-02-13 Sat 00:00]
:END:
- 对 Docker, K8s 的支持 ::
* 开发初衷
作者本人专业是理论物理,工作经验则是程序开发,很偶然在网上了解到了量化交易,觉得可以利用上以前的知识和经验,于是乎喜欢上了量化交易。
交易三部曲,a) 数据获取 b) 策略回测 c) 模拟/实盘交易 \\
市面上开源的 a,b,c 项目大部分都是 python 开发,但是在实践过程中性能都不理想,于是想
到站在巨人肩上利用 C++ 造轮子。核心模块 C++,通过中间层 binding 交给用户 python 层。
* 感谢
- [[https://github.com/QUANTAXIS/QUANTAXIS.git][QUANTAXIS]]
abquant-data 兼容 quantaxis 数据库
* 打赏
欢迎请作者喝杯咖啡 :+1:
| 微信 | 支付宝 |
|------------------------------------+------------------------------------|
| [[file:./screenshot/jimmy.wechat.png]] | [[file:./screenshot/jimmy.alipay.png]] |
* LICENSE
Copyright (c) 2020-present Jimmy M. Gong \\
All rights reserved.
除非遵守当前许可,否则不得使用本软件。
** 非商业用途(非商业用途指个人出于非商业目的使用本软件,或者高校、研究所等非营利机构出于教育、科研等目的使用本软件):
遵守 [[https://www.tldrlegal.com/l/gpl-3.0][GPL3]] 和 [[https://www.tldrlegal.com/l/lgpl-3.0][LGPL3]]
除非法律有要求或以书面形式达成协议,否则本软件分发时需保持当前许可“原样”不变,且不得附加任何条件。
** 商业用途(商业用途指个人出于任何商业目的使用本软件,或者法人或其他组织出于任何目的使用本软件):
未经原作者授权,任何个人不得出于任何商业目的使用本软件(包括但不限于向第三方
提供、销售、出租、出借、转让本软件、本软件的衍生产品、引用或借鉴了本软件功能
或源代码的产品或服务),任何法人或其他组织不得出于任何目的使用本软件,否则原
作者有权追究相应的知识产权侵权责任。 \\
在此前提下,对本软件的使用同样需要遵守 [[https://www.tldrlegal.com/l/gpl-3.0][GPL3]] 和 [[https://www.tldrlegal.com/l/lgpl-3.0][LGPL3]] 许可, [[https://www.tldrlegal.com/l/gpl-3.0][GPL3]] 和 [[https://www.tldrlegal.com/l/lgpl-3.0][LGPL3]] 许可与本
许可冲突之处,以本许可为准。
详细的授权流程,请联系 [email protected] 获取。
* Footnotes
[fn:1]闭源