Code Monkey home page Code Monkey logo

quantaxis's Introduction

QUANTAXIS 2.0.0

Github workers GitHub stars GitHub forks

[点击右上角Star和Watch来跟踪项目进展! 点击Fork来创建属于你的QUANTAXIS!]

QUANTAXIS_LOGO_LAST_small.jpg

gvp

更多文档在QABook Release

Quantitative Financial FrameWork

本项目分为几个大块:

  1. QASU/ QAFetch 支持多市场数据存储/ 自动运维/ 数据获取(mongodb/ clickhouse)

  2. QAUtil 支持交易时间, 交易日历, 时间向前向后推算, 市场识别, dataframe 数据转换等

  3. QIFI/ QAMarket 一套统一的多市场 多语言账户体系

    • qifiaccount qifi 的标准账户体系, 在多语言上和 rust/cpp 版本的 qifi account 保持一致性
    • qifimanager qifi 多账户管理体系 支持多个语言的账户统一管理
    • qaposition 单标的仓位管理模块, 支持对于单标的的精准多空控制(套利场景/ cta 场景/ 股票场景)
    • marketpreset 市场预制基类, 方便查询期货/股票/虚拟货币 品种 tick/ 保证金/ 手续费等
  4. QAFactor 因子研究套件

    • 单因子研究入库

    • 因子管理, 测试

    • 因子合并

    • 优化器

  5. QAData 多标的多市场的数据结构, 可以作为实时计算和回测的内存数据库使用

  6. QAIndicator 支持自定义指标编写, 批量全市场 apply, 支持因子表达式构建

  7. QAEngine 自定义线程进程基类, 可以自行修改计算的异步和局域网内分布式计算 agent

  8. QAPubSub 基于 MQ 的消息队列, 支持 1-1 1-n n-n 的消息分发, 可用于计算任务分发收集, 实时订单流等场景

  9. QAStrategy cta/套利回测套件, 支持 QIFI 模式

  10. QAWebServer tornadobase 的 webserver 套件, 可以作为中台微服务构建

  11. QASchedule 基于 QAWerbServer 的后台任务调度 支持自动运维, 远程任务调度等

本版本为不兼容升级的 2.0 quantaxis, 涉及一些改变

数据部分

  • 增加 clickhouse client 自建数据源分发

  • 增加数据格式

    • 对于 tabular data 的支持
    • 支持因子化的数据结构
  • 支持 tick/l2 order/transaction 的数据格式

微服务部分

  • 增加 QAWEBSEBVER

  • 支持动态的任务指派的 sechedule

  • 增加 基于 DAG模型的pipeline

  • 增加 QAPUBSUB模块 支持 rabbitmq

账户部分

  • 删除 QAARP 不再维护老版本 account 系统

  • 升级完整的 qifi 模块 支持多市场/跨市场的账户模型

    • 支持保证金模型

    • 支持股票

    • 支持期货

    • 期权[升级中]

实盘模拟盘部分

  • 使用稳定的 qifi 结构对接

  • 支持 CTP 接口的

    • 期货
    • 期权
  • 支持股票部分

    • QMT 对接
  • 母子账户的订单分发跟踪 [OMS]

  • ordergateway 风控订单流规则

多语言部分

  • 支持于 QUANTAXIS Rust 版本的通信

  • 基于 arrow 库, 使用多语言支持的 pyarrow 格式, 对接 arrow-rs, datafusion-rs, libarrow(CPP)

  • 支持 RUST/ CPP 账户

  • 支持因子化的 rust job worker

社区/项目捐赠

github

QUANTAXIS 是一个开放的项目, 在开源的3年中有大量的小伙伴加入了我, 并提交了相关的代码, 感谢以下的同学们

许多问题 可以在 GITHUB ISSUE中找到, 你可以提出新的issue

捐赠

写代码不易...请作者喝杯咖啡呗?

(PS: 支付的时候 请带上你的名字/昵称呀 会维护一个赞助列表~ )

QQ群

欢迎加群讨论: 563280067 群链接

DISCORD 社区 https://discord.gg/mkk5RgN

QUANTAXIS 开发群: 773602202 (如果想要贡献代码 请加这个群 需要备注你的GITHUB ID)

QUANTAXIS 期货实盘多账户的本地部署群 (请勿浪费群资源 没有本地多账户部署的请勿加): 945822690

公共号

欢迎关注公众号: 公众号

QAPRO公共号免费提供了下单推送接口, 关注公共号回复trade即可使用

论坛 QACLUB

QUANTAXIS 内测版论坛 QUANTAXISCLUB上线

http://www.yutiansut.com:3000

凡通过论坛进行提问的 均有最高的回复优先级

quantaxis's People

Contributors

barretthugh avatar bin-wang-sh avatar breath123 avatar buyinfosun avatar chaopaoo12 avatar esun6060996 avatar forrestzhang avatar happybeta avatar hiteck88 avatar hugh211 avatar jaysonalbert avatar jljlj avatar junfalin avatar kite8 avatar nehcuh avatar pchaos avatar renovate-bot avatar rgveda avatar royburns avatar sixuerain avatar somewheve avatar sun-rs avatar tauruswang avatar wangyuefenggh avatar wxj0916 avatar yehonghao avatar yutiansut avatar zhongjyyy avatar zsl3034669 avatar zsluedem avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

quantaxis's Issues

QUANTAXIS | 小白配置全过程笔记

准备工作

下载python3.6(最新版),安装配置(简单),如果要对接交易,python需是32位的。
下载Nodejs,并安装(简单),安装最新即可(目前的版本是8.0.0)
下载mongodb,安装配置(稍复杂)

  • 将mongodb安装在d盘(非C盘均可)
  • 在mongodb文件夹下新建data\db路径。
  • 以管理员方式启动cmd命令行,进入d:\mongodb\bin目录,输入命令:mongod.exe --dbpath D:\mongodb\data\db。在浏览器中打开:http://localhost:27017/,即可看到一段文字,则表示连接成功。否则,可能是因为端口被占用。
  • 在d:\mongodb\data下新建文件夹log(存放日志文件)并且新建文件mongodb.log,在d:\mongodb新建文件mongo.config。
  • 用记事本打开mongo.config输入两行:dbpath=D:\mongodb\data\db,logpath=D:\mongodb\data\log\mongodb.log。
  • 在cmd中输入:mongod.exe --config d:\tangyang\mongodb\mongo.config --install --serviceName "MongoDB",在"服务"中添加MongoDB这个服务项。
  • 在cmd中输入services.msc,这会"服务",找到MongoDB这个服务项,点击"启动"。即开启MongoDB服务。
    注:安装mongodb服务报错,解决方案:待记录。参考资料:http://jingyan.baidu.com/article/d5c4b52bef7268da560dc5f8.html

下载git,安装配置(github的用户名和密码等基本配置,稍复杂)

Quantaxis安装配置

以管理员身份启动git,将github远程代码下载到本地仓库。
git clone https://github.com/yutiansut/quantaxis
代码本地部署

cd quantaxis 
python setup.py install

下载全市场数据(数据存储在mongodb数据库中)
python easy_start_tushare.py #下载全市场数据,需要一点时间
简单策略测试

#这个策略跑完了之后,后面在web端或client端的模拟回测中才能看到回测结果
cd test
python test_strategy.py 

启动网络插件(这里就用到了nodeJS)

cd QUANTAXISWebkit
npm run install #安装quantaxis
npm run Xweb #同时启动后台(backend)和网页端(web)

关于npm的详细命令,可参考QUANTAXISWebkit中的package.json文件。

"quantaxis":"npm run install & npm run all",
"install-backend":"cd ./backend && npm install",
"install-web":"cd ./web && npm install",
"install-client":"cd ./client && npm install | cd ./app && npm install ",
"install": "npm run install-backend | npm run install-web | npm run install-client",
"backend": "node ./backend/bin/www",
"website":" cd ./web && npm run dev",
"client": "cd ./client && npm run dev",
"Xweb":" npm run website|npm run backend ",
"Xclient":"npm run backend | npm run client",
"all":" npm run Xweb | npm run client"

查看web端界面回测结果
运行了npm run Xweb命令之后,会自动开启http://localhost:8080网页,初始化界面如下(默认使用账户名admin和密码admin登录):

Alt text
回测的结果,点击”模拟回测“选项,默认是在admin用户名下跑的策略回测。
Alt text
点击任意一行,查看回测明细结果。
Alt text
好啦,到此为止,你已经可以实现自定义策略,以及查看策略回测结果。下一步,很自然想到将好的策略进行模拟交易,甚至实盘交易。

对接交易(模拟和实盘)

在QA_trade_stock文件下有如下截图中高亮的几个文件。其中,setting.init是用来配置账户信息的。TradeX.lic是tradeX的相关配置,app.py用来开启python服务(以在web端查看实盘状况)。example.py是一个查看实盘状况的简单示例。
Alt text
(1)模拟和实盘交易配置
去掉setting.init.example和TradeX.lic.example的后缀.example。配置示例如下:
Alt text
注意:通达信模拟账户需要自行去下载注册哈。下载地址:http://mock.tdx.com.cn/site/app/mock/index/index.html

(2)开启实盘交易服务

运行命如下两个命令即可。(注意切到文件相应的目录)

python example.py
python app.py   

再进入web网页查看实盘状况,即可查看到响应的模拟账户的账户基本情况。
Alt text
好啦,基本就是这样,到目前为止,你已经可以使用QUANTAXIS平台进行自定义策略,策略回测,以及模拟交易和实盘交易啦。接下来,就靠自己的发挥啦,赶紧撸几个牛掰的策略,抓紧时间挣钱。

QA部分

(1)运行npm run Xweb启动后台和web端后,点击模拟回测结果,进入个股回测结果时,回测的曲线一直刷不出来,结果直接卡死掉了。原因,没有做索引,数据量太大,然后直接崩了。网页网页端网页端。

#quantaxis目录下,运行
python test/test_make_index.py

(2)远程github代码有更新,git pull时报错时,该怎么办?

git fetch --all
git reset --hard origin/master
git pull

(3)github分支上代码有更新,更新本地仓库的操作

git merge
git pull

(4)启动服务时,遇到端口被占用该怎么办?
使用如下命令查看占用端口的PID号(比如3000端口被占用)
netstat -ano | findstr "3000"
获取到对应的程序的PID后,调出程序管理器,查找对应PID的进程程序,关掉即可。如果未找到,则重启一下计算机也可以解决该问题。

相关网址链接

https://github.com/yutiansut/QUANTAXIS/wiki

#69

http://www.yutiansut.com/

QUANTAXIS_WEBKIT 网站部署的常见问题

网站的安装

  1. nodejs版本一定要大于7

  2. 首先要在各个有package.json的文件目录下 npm install

  3. npm install -g forever 全局安装 forever

  4. 进入backend文件夹:
    forever start bin/www
    这一步是在后台启动 3000端口 一般电脑不关机 就会一直存在

  5. 进入web文件夹
    npm run dev
    会生成一个8080端口 在0.0.0.0:8080 是为了给局域网内访问方便
    本地电脑打开 localhost:8080

快速安装python 版本(linux)

#!/usr/bin/env bash
--
  |  
  | sudo add-apt-repository ppa:fkrull/deadsnakes
  | sudo apt-get update
  | wget https://bootstrap.pypa.io/get-pip.py -O /tmp/get-pip.py
  | py_ver=`python -c 'import sys; print ".".join(str(x) for x in sys.version_info[:2])'`
  |  
  | for i in 2.6 2.7 3.2 3.3 3.4 3.5
  | do
  | if [ "$i" != "$py_ver" ]
  | then
  | sudo apt-get -y install python$i python$i-dev
  | sudo python$i /tmp/get-pip.py
  | else
  | echo "Default Python version is $i, installing dev libraries and pip only"
  | sudo apt-get install -y python$-dev
  | sudo python$i /tmp/get-pip.py
  | fi
  | done

QUANTAXIS Protocol 标准化QAS/未来协议QAF

QUANTAXIS-Protocol
标准化协议QAS/未来协议QAF

简介 Intro

QAProtocol是为了规范化和标准化QUANTAXIS的数据获取,数据存储,模拟市场交易,以及标准化输出而建立的协议.

QUANTAXIS Standard Protocol [QAS]

QUANTAXISStandard是目前的协议标准,简称QAS

QUANTAXIS Future Protocol [QAF]

QUANTAXISFuture 是未来即将添加的或是在测试版中的功能标准,简称QAF

QAStandard-00x QUANTAXIS

QAStandard-001 品牌

QUANTAXIS的Logo需要遵循docs/logo标准下的logo,有两种形式的logo

QAStandard-002 开源协议

QUANTAXIS 基于MIT开源协议

The MIT License (MIT)

Copyright (c) 2016-2017 yutiansut/QUANTAXIS

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

被授权人有权利使用、复制、修改、合并、出版发行、散布、再授权及贩售软体及软体的副本。

被授权人可根据程式的需要修改授权条款为适当的内容。

在软件和软件的所有副本中都必须包含版权声明和许可声明。

此授权条款并非属copyleft的自由软体授权条款,允许在自由/开放源码软体或非自由软体(proprietary software)所使用。

QAStandard-10x 数据

QAS-10x需要遵循QAS-501-4规范

QAStandard-101 行情数据

QAS-101-1 Stock

  • Client: QUANTAXIS
  • DataBase: Stock
  • Collections: day,min
  • BasicalName: varietyName,dateTime,open,high,low,close,volume
  • AdvanceName:

Basical指的是存入数据库/更新数据时必须要有的字段

Advance指的是存入数据库/更新数据时定制的字段,非必须

QAS-101-2 Future

  • Client: QUANTAXIS
  • DataBase: Future
  • Collections: day,min,ms
  • BasicalName: varietyName,dateTime,open,high,low,close,volume
  • AdvanceName:

Basical指的是存入数据库/更新数据时必须要有的字段

Advance指的是存入数据库/更新数据时定制的字段,非必须

QAS-101-3 Options

  • Client: QUANTAXIS
  • DataBase: Options
  • Collections: day,min,ms
  • BasicalName: varietyName,dateTime,open,high,low,close,volume
  • AdvanceName:

Basical指的是存入数据库/更新数据时必须要有的字段

Advance指的是存入数据库/更新数据时定制的字段,非必须

QAS-101-4 Indicator

  • Client: QUANTAXIS
  • DataBase: Indicator
  • Collections: day,min,ms
  • BasicalName:
  • AdvanceName:
参考:

ADTM动态买卖气指标,ATR真实波幅,BBI多空指数,BBIBOLL多空布林线,BIAS乖离率,BOLL布林带,CCI顺势指标,CDP逆势操作,DMA平均线差,DMI趋向标准,DPO区间震荡线,ENV,EXPMA指数平滑移动平均,KDJ随机指标,slowKD慢速kd,MA简单移动平均,MACD指数平滑移动平均,MIKE麦克指数,MTM动力指标,PRICEOSC价格震荡指标,PVT量价趋势指标,RC变化率指数,ROC变动速率,RSI相对强弱指标,SAR抛物转向,SI摆动指标,SOBV能量潮,SRMI MI修正指标,STD 标准差,TAPI 加权指数成交值,TRIX 三重指数平滑平均,VHF纵横指标,VMA量简单移动平均,VMACD量指数平滑移动平均,VOSC成交量震荡,WVAD威廉变异离散量,vol_ratio量比

QAStandard-102 文本信息数据

QAS-102-1 舆情

  • Client: QUANTAXIS
  • DataBase: Info
  • Collections: news/opinion
  • BasicalName: title,datetime,content,author,reference
  • AdvanceName: comments,likeNum

QAS-102-2 财务

  • Client: QUANTAXIS
  • DataBase: Financial
  • Collections: info,balance,profit,cash

QAStandard-103 爬虫

QAS103主要规范了爬虫的命名标准,UserAgent设置,cookie,session等规范。

QAStandard-104 自定义数据

自定义数据需要按照分类标准引入数据库,如果是QAS101时间序列行情数据,QAS102文本信息数据,可以定制性的更新数据库(使用高级字段AdvanceName)

QAStandard-20x 市场

QAStandard-201 交易

QAS-201-1 交易日

分市场的交易日存储,属于行情序列,但是是分片数据[不遵循QAS101]
按时间序列存储当日交易的所有股票,期货名称

  • Client: QUANTAXIS
  • DataBase: Days
  • Collections: days
  • BasicalName: varietyName,datetime,exchange
coll=pymongo.MongoClient().Days.days
coll.find({"varietyName":self.varietyName,"datetime":self.datetime}).count()

QAS-201-2 交易量

交易量从QAS-101的数据格式规范中获取,此处的规范主要针对撮合机制,当策略的请求交易量大于当日真实成交量的1/8,则判断无法成交.

QAStandard-202 撮合机制

简单的行情判断机制是报价在[low,high]区间内,同时bid_amount小于真实交易量的1/8

QAF: 未来将加入更多的判断机制,尤其是深度池

QAStandard-30x 用户

QAStandard-301 账户状态

QAStandard-302 账户策略

QAStandard-303 账户自定义模块

QAStandard-40x 状态

QAStandard-401 状态码

QAStandard-50x API

QAStandard-501 内部API

QAS-501-1 Fetch

QAS501-1主要规定了数据获取的打包规范,遵循此规范,可以进行API二次打包

get_stock_day
get_stock_min
get_stock_tick
get_stock_info
get_stock_indicator
get_future_day
get_future_min
get_future_tick
get_future_info
get_options_day
get_options_min
get_options_tick
get_options_info


save_stock
save_future
save_options
save_all

QAS-501-2 Market

QAS-501-2 主要规定了市场交易的调用接口规范,包括数据返回和响应状态码遵循QAS-401

QAS-501-3 Account

QAS-501-4 Databases

QAS-501-4 主要规定了数据库存储和调用时的命名规范,采用驼峰法则去定义
常见的Name定义

  • varietyName
  • datetime(timestamp)
  • open(double)
  • high(double)
  • low(double)
  • close(double)
  • volume(double)

QAStandard-502 Http API/RESTFul

QUANTAXIS-Data

QUANTAXIS-Data

数据获取部分

这部分分两块:

python核心的爬虫(手动操作)

Nodejs核心的爬虫(在测试后会加入到backend/模块下的method中)

主要需要将数据存储的格式,内容规范化

======

文本信息数据

-- 财经网站舆情数据

-- 跟单网站的持仓换仓数据

-- 天眼查等公司信息数据

-- 财经网站的公司数据

-- 期货标的的影响因素信息

======

数字型数据
-- 股票/期货的历史Bar/Tick数据

-- 公司财务数据/期货合约等

-- 用户行为模拟数据接口

-- 回测数据

=======

用户自定义数据

-- XXXX

======

目前项目已经有:

-- 华尔街中文网的文章爬虫

-- tushare数据接口

-- 期货数据的数据接口(tq)

-- wind 数据接口

-- btc的数据接口

也可以自己定义爬虫,接入数据库

windows下需要phantomjs.exe

Linux需要phantomjs(Ubuntu用户不能直接apt-get install phantomjs 那个包有问题,只能去github上下载)

QUANTAXIS WebKit不能登录的问题

经过排查,是之前把数据库调用代码从mongoose换成mongodb(JavaScript)的时候,遗留的一个错误,目前已经修正 #commit 519, 如果有相同问题,可以git pull一下再运行

网站页面(注册成功)

tim 20170417235615

后台显示

登录后页面

各种报错啊

从nodejs 7.08.0各种版本试,python3.53.6,没一个能完整安装完成的。BUG很多啊。

装饰器做回测模块

class QA_Backtest_stock_day():
    
    account = QA_Account()
    market = QA_Market()
    bid = QA_QAMarket_bid()
    setting = QA_Setting()
    clients = setting.client
    user = setting.QA_setting_user_name





    def __init__(self):

        self.account = QA_Account()
        self.market = QA_Market()
        self.bid = QA_QAMarket_bid()
        self.setting = QA_Setting()
        self.clients = self.setting.client
        self.user = self.setting.QA_setting_user_name

    @classmethod
    def backtest_init(__backtest_cls, func, *a, **b):

        def __init_backtest(__backtest_cls,*a, **b):

            __backtest_cls.QA_backtest_init(__backtest_cls)
            func( *a, **b)
            __backtest_cls.__QA_backtest_init_inside(__backtest_cls)
        return __init_backtest(__backtest_cls)

    @classmethod
    def before_backtest(__backtest_cls, func, *a, **b):
        # yield __backtest_cls.cash
        func( *a, **b)
        __backtest_cls.QA_backtest_start()

    @classmethod
    def before_trading(__backtest_cls, func, *a, **b):
        # yield __backtest_cls.cash
        return func( *a, **b)

    @classmethod
    def strategy(__backtest_cls, func, *a, **b):

        return func( *a, **b)

    @classmethod
    def end_trading(__backtest_cls, func, *a, **b):
        # yield __backtest_cls.cash
        return func( *a, **b)
    @classmethod
    def end_backtest(__backtest_cls, func, *a, **b):
        # yield __backtest_cls.cash
        return func( *a, **b)

    def __QA_backtest_set_bid_model(self):
        if self.__backtest_setting['bid']['bid_model'] == 'market_price':
            self.bid.bid['price'] = 'market_price'
            self.bid.bid['bid_model'] = 'auto'
        elif self.__backtest_setting['bid']['bid_model'] == 'close_price':
            self.bid.bid['price'] = 'close_price'
            self.bid.bid['bid_model'] = 'auto'
        elif self.__backtest_setting['bid']['bid_model'] == 'strategy':
            self.bid.bid['price'] = 0
            self.bid.bid['bid_model'] = 'strategy'
        else:
            QA_util_log_info('support bid model')
            sys.exit()

    def __QA_backtest_set_save_model(self):
        pass

    def QA_backtest_init(self):

        """既然是被当做装饰器使用,就需要把变量设置放在装饰函数的前面,把函数放在装饰函数的后面"""

        # 设置回测的开始结束时间

        self.strategy_start_date = str('2017-01-05')
        self.strategy_end_date = str('2017-07-01')

        # 设置回测标的,是一个list对象,不过建议只用一个标的
        # gap是回测时,每日获取数据的前推日期(交易日)
        self.strategy_gap = int(60)

        # 设置全局的数据库地址,回测用户名,密码,并初始化
        self.setting.QA_util_sql_mongo_ip = str('127.0.0.1')
        self.setting.QA_setting_user_name = str('admin')
        self.setting.QA_setting_user_password = str('admin')
        self.setting.QA_setting_init()

        # 回测的名字
        self.strategy_name = str('example')

       # 股票的交易日历,真实回测的交易周期,和交易周期在交易日历中的id
        self.trade_list = QA_fetch_trade_date(
            self.setting.client.quantaxis.trade_date)

        self.benchmark_code = 'hs300'
        """
        这里会涉及一个区间的问题,开始时间是要向后推,而结束时间是要向前推,1代表向后推,-1代表向前推
        """
        self.start_real_date = QA_util_get_real_date(
            self.strategy_start_date, self.trade_list, 1)
        self.start_real_id = self.trade_list.index(self.start_real_date)
        self.end_real_date = QA_util_get_real_date(
            self.strategy_end_date, self.trade_list, -1)
        self.end_real_id = self.trade_list.index(self.end_real_date)

        self.strategy_stock_list=['000001','000002','000004']

        self.account.init_assest = 1000000

    def __QA_backtest_init_inside(self):
        """
        这是模型内部的 初始化,主要是初始化一些账户和市场资产
        写成了私有函数
        @yutiansut
        2017/7/20
        """

        # 重新初始账户资产


        self.setting.QA_setting_init()
        self.account.init()
        # 重新初始化账户的cookie
        self.account.account_cookie = str(random.random())
        # 初始化股票池的市场数据
        self.__market_data = QA_fetch_stocklist_day(
            self.strategy_stock_list, self.setting.client.quantaxis.stock_day,
            [self.trade_list[self.start_real_id - int(self.strategy_gap)],
             self.trade_list[self.end_real_id]])

    def QA_backtest_start(self, outside_handle, *args, **kwargs):
        """
        这个是回测流程开始的入口

        """
        assert len(self.strategy_stock_list) > 0
        assert len(self.trade_list) > 0
        assert isinstance(self.start_real_date, str)
        assert isinstance(self.end_real_date, str)
        self.__QA_backtest_init_inside()

        assert len(self.__market_data) == len(self.strategy_stock_list)

        QA_util_log_info('QUANTAXIS Backtest Engine Initial Successfully')
        QA_util_log_info('Basical Info: \n' + tabulate(
            [[str(__version__), str(self.strategy_name)]], headers=('Version', 'Strategy_name')))
        QA_util_log_info('Stock_List: \n' +
                         tabulate([self.strategy_stock_list]))

        # 初始化报价模式
        self.__QA_backtest_set_bid_model()



        try:
            # 在末尾增加一个回调给策略
            outside_handle.on_start(self)
        except:
            pass
        # 加载外部策略
        self.__QA_backest_handle_data(outside_handle)

    def __QA_backest_handle_data(self, outside_handle):
        '这个outside_handle就是一个外部的注入函数'

        # 首先判断是否能满足回测的要求`
        _info = {}
        _info['stock_list'] = self.strategy_stock_list
        __messages = {}
        self.__init_cash_per_stock = int(
            float(self.account.init_assest) / len(self.strategy_stock_list))

        # 策略的交易日循环
        for i in range(int(self.start_real_id), int(self.end_real_id) - 1, 1):
            # 正在进行的交易日期
            __running_date = self.trade_list[i]
            QA_util_log_info(
                '=================daily hold list====================')
            QA_util_log_info('in the begining of ' + __running_date)
            QA_util_log_info(
                tabulate(self.account.message['body']['account']['hold']))
            for __j in range(0, len(self.strategy_stock_list)):
                if __running_date in [l[6] for l in self.__market_data[__j]] and \
                        [l[6] for l in self.__market_data[__j]].index(__running_date) \
                        > self.strategy_gap + 1:

                    __data = self.__QA_data_handle(
                        [__l[6] for __l in self.__market_data[__j]].index(__running_date), __j)
                    __amount = 0
                    for item in __data['account']['body']['account']['hold']:

                        if self.strategy_stock_list[__j] in item:
                            __amount = __amount + item[3]
                    if __amount > 0:
                        __hold = 1
                    else:
                        __hold = 0

                    __result = outside_handle.predict(
                        __data['market'], __data['account'], __hold, _info)

                    if float(self.account.message['body']['account']['cash'][-1]) > 0:
                        self.__QA_backtest_excute_bid(
                            __result, __running_date, __hold,
                            str(self.strategy_stock_list[__j])[0:6], __amount)

                    else:
                        QA_util_log_info('not enough free money')
                else:
                    pass

        # 在回测的最后一天,平掉所有仓位(回测的最后一天是不买入的)
        while len(self.account.hold) > 1:
            __hold_list = self.account.hold[1::]
            pre_del_id = []
            for item_ in range(0, len(__hold_list)):
                if __hold_list[item_][3] > 0:
                    __last_bid = self.bid.bid
                    __last_bid['amount'] = int(__hold_list[item_][3])
                    __last_bid['order_id'] = str(random.random())
                    __last_bid['price'] = 'close_price'
                    __last_bid['code'] = str(__hold_list[item_][1])
                    __last_bid['date'] = self.trade_list[self.end_real_id]
                    __last_bid['towards'] = -1
                    __last_bid['user'] = self.setting.QA_setting_user_name
                    __last_bid['strategy'] = self.strategy_name
                    __last_bid['bid_model'] = 'auto'
                    __last_bid['status'] = '0x01'
                    __last_bid['amount_model'] = 'amount'

                    __message = self.market.receive_bid(
                        __last_bid, self.setting.client)
                    _remains_day = 0
                    while __message['header']['status'] == 500:
                        # 停牌状态,这个时候按停牌的最后一天计算价值(假设平仓)

                        __last_bid['date'] = self.trade_list[self.end_real_id - _remains_day]
                        _remains_day += 1
                        __message = self.market.receive_bid(
                            __last_bid, self.setting.client)

                        # 直到市场不是为0状态位置,停止前推日期

                    __messages = self.account.QA_account_receive_deal(
                        __message)
                else:
                    pre_del_id.append(item_)
            pre_del_id.sort()
            pre_del_id.reverse()
            for item_x in pre_del_id:
                __hold_list.pop(item_x)

        try:
            # 在末尾增加一个回调给策略
            outside_handle.on_end(
                __data['market'], __data['account'], __hold, _info)
        except:
            pass
        # 开始分析
        QA_util_log_info('start analysis====\n' +
                         str(self.strategy_stock_list))
        QA_util_log_info('=' * 10 + 'Trade History' + '=' * 10)
        QA_util_log_info('\n' + tabulate(self.account.history,
                                         headers=('date', 'code', 'price', 'towards',
                                                  'amounts', 'order_id', 'trade_id', 'commission')))
        QA_util_log_info(tabulate(self.account.detail,
                                  headers=('date', 'code', 'price', 'amounts', 'order_id',
                                           'trade_id', 'sell_price', 'sell_order_id',
                                           'sell_trade_id', 'sell_date', 'left_amount',
                                           'commission')))
        __exist_time = int(self.end_real_id) - int(self.start_real_id) + 1
        self.__benchmark_data = QA_fetch_index_day(
            self.benchmark_code, self.start_real_date,
            self.end_real_date)

        performace = QA_backtest_analysis_start(
            self.setting.client, self.strategy_stock_list, __messages,
            self.trade_list[self.start_real_id:self.end_real_id + 1],
            self.__market_data, self.__benchmark_data)
        _backtest_mes = {
            'user': self.setting.QA_setting_user_name,
            'strategy': self.strategy_name,
            'stock_list': performace['code'],
            'start_time': self.strategy_start_date,
            'end_time': self.strategy_end_date,
            'account_cookie': self.account.account_cookie,
            'annualized_returns': performace['annualized_returns'],
            'benchmark_annualized_returns': performace['benchmark_annualized_returns'],
            'assets': performace['assets'],
            'benchmark_assets': performace['benchmark_assets'],
            'trade_date': performace['trade_date'],
            'total_date': performace['total_date'],
            'win_rate': performace['win_rate'],
            'alpha': performace['alpha'],
            'beta': performace['beta'],
            'sharpe': performace['sharpe'],
            'vol': performace['vol'],
            'benchmark_vol': performace['benchmark_vol'],
            'max_drop': performace['max_drop'],
            'exist': __exist_time,
            'time': datetime.datetime.now()
        }

        QA_SU_save_backtest_message(_backtest_mes, self.setting.client)
        QA_SU_save_account_message(__messages, self.setting.client)
        QA_SU_save_account_to_csv(__messages)
        # QA.QA_SU_save_backtest_message(analysis_message, self.setting.client)

    def __QA_backtest_excute_bid(self, __result,  __date, __hold, __code, __amount):
        """
        这里是处理报价的逻辑部分
        2017/7/19 修改

        __result传进来的变量重新区分: 现在需要有 if_buy, if_sell
        因为需要对于: 持仓状态下继续购买进行进一步的支持*简单的情形就是  浮盈加仓

        if_buy, if_sell都需要传入

        现在的 买卖状态 和 持仓状态 是解耦的
        """

        # 为了兼容性考虑,我们会在开始的时候检查是否有这些变量
        if 'if_buy' not in list(__result.keys()):
            __result['if_buy'] = 0

        if 'if_sell' not in list(__result.keys()):
            __result['if_sell'] = 0

        self.__QA_backtest_set_bid_model()
        if self.bid.bid['bid_model'] == 'strategy':
            __bid_price = __result['price']
        else:
            __bid_price = self.bid.bid['price']

        __bid = self.bid.bid

        __bid['order_id'] = str(random.random())
        __bid['user'] = self.setting.QA_setting_user_name
        __bid['strategy'] = self.strategy_name
        __bid['code'] = __code
        __bid['date'] = __date
        __bid['price'] = __bid_price
        __bid['amount'], __bid['amount_model'] = self.__QA_bid_amount(
            __result['amount'], __amount)

        if __result['if_buy'] == 1:
            # 这是买入的情况
            __bid['towards'] = 1
            __message = self.market.receive_bid(
                __bid, self.setting.client)

            if float(self.account.message['body']['account']['cash'][-1]) > \
                    float(__message['body']['bid']['price']) * \
                    float(__message['body']['bid']['amount']):
                    # 这里是买入资金充足的情况
                    # 不去考虑
                pass
            else:
                # 如果买入资金不充足,则按照可用资金去买入
                __message['body']['bid']['amount'] = int(float(
                    self.account.message['body']['account']['cash'][-1]) / float(
                        float(str(__message['body']['bid']['price'])[0:5]) * 100)) * 100

            if __message['body']['bid']['amount'] > 0:
                # 这个判断是为了 如果买入资金不充足,所以买入报了一个0量单的情况
                #如果买入量>0, 才判断为成功交易
                self.account.QA_account_receive_deal(__message)
        elif __result['if_buy'] == 0:
            # 如果买入状态为0,则不进行任何买入操作
            pass

        # 下面是卖出操作,这里在卖出前需要考虑一个是否有仓位的问题:
        # 因为在股票中是不允许卖空操作的,所以这里是股票的交易引擎和期货的交易引擎的不同所在

        if __result['if_sell'] == 1 and __hold == 1:
            __bid['towards'] = -1
            __message = self.market.receive_bid(
                __bid, self.setting.client)

            self.account.QA_account_receive_deal(__message)

    def __QA_bid_amount(self, __strategy_amount, __amount):
        if __strategy_amount == 'mean':
            return float(float(self.account.message['body']['account']['cash'][-1]) /
                         len(self.strategy_stock_list)), 'price'
        elif __strategy_amount == 'half':
            return __amount * 0.5, 'amount'
        elif __strategy_amount == 'all':
            return __amount, 'amount'

    def __QA_get_data_from_market(self, __id, stock_id):
        # x=[x[6] for x in self.__market_data]
        if __id > self.strategy_gap + 1:
            index_of_day = __id
            index_of_start = index_of_day - self.strategy_gap + 1
            return self.__market_data[stock_id][index_of_start:index_of_day + 1]

         # 从账户中更新数据

    def __QA_data_handle(self, __id, __stock_id):
        __market_data = self.__QA_get_data_from_market(__id, __stock_id)
        __message = self.account.message

        return {'market': __market_data, 'account': __message}

QUANTAXIS 如何在局域网内协作?

#QUANTAXIS 如何在局域网内协作?

QUANTAXIS致力于低耦合性的模块化协作,也就是说,你可以通过将不同的模块部署在不同的机器或者集群上,同时开放REST跨域API,就可以进行局域网的协作(如果有公网IP,也可以超越局域网的限制)

新的回测模式:

import QUANTAXIS as QA
from QUANTAXIS import QA_Backtest_stock_day as QB


@QB.backtest_init
def init():
        #
    QB.setting.QA_util_sql_mongo_ip='192.168.4.189'
    QB.account.init_assest=250000
    QB.strategy_start_date='2017-03-01'
    QB.backtest_bid_model='market_price'
    

@QB.before_backtest
def before_backtest():
    global risk_position
    QA.QA_util_log_info(QB.account.message)
    
    
    
@QB.load_strategy
def strategy():
    print(QB.account)
    print(QB.market_data)
    
@QB.end_backtest
def after_backtest():
    print(dir(QB))

Linux安装文档的步骤增加lxml安装

在一个新的环境安装QUANTAXIS的时候,由于 QUANTAXIS 依赖了tushare,而tushare在pip安装之前需要提前安装lxml包,所以可能导致如下的报错,建议在文档的安装步骤上提示一下..

rainx@ubuntu170:~/dev/QUANTAXIS$ sudo pip3.6 install -e .
The directory '/home/rainx/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/rainx/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Obtaining file:///home/rainx/dev/QUANTAXIS
Collecting pandas>=0.20 (from quantaxis==0.3.9b2.dev53)
  Downloading http://pypi.doubanio.com/packages/fe/6f/5733658857dffb998afa2120027171c263384ada0487a969e5ecd5bf9ac9/pandas-0.20.3-cp36-cp36m-manylinux1_x86_64.whl (24.5MB)
    100% |████████████████████████████████| 24.5MB 6.3MB/s
Collecting numpy>=1.12.0 (from quantaxis==0.3.9b2.dev53)
  Downloading http://pypi.doubanio.com/packages/59/e2/57c1a6af4ff0ac095dd68b12bf07771813dbf401faf1b97f5fc0cb963647/numpy-1.13.1-cp36-cp36m-manylinux1_x86_64.whl (17.0MB)
    100% |████████████████████████████████| 17.0MB 11.5MB/s
Collecting tushare==0.7.4 (from quantaxis==0.3.9b2.dev53)
  Downloading http://pypi.doubanio.com/packages/e6/86/ad0b88b85119292a4503a43355091988c25a234d0e89511b782464c4ff46/tushare-0.7.4.tar.gz (89kB)
    100% |████████████████████████████████| 92kB 13.6MB/s
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-mbu_8l9t/tushare/setup.py", line 4, in <module>
        import tushare
      File "/tmp/pip-build-mbu_8l9t/tushare/tushare/__init__.py", line 6, in <module>
        from tushare.stock.trading import (get_hist_data, get_tick_data,
      File "/tmp/pip-build-mbu_8l9t/tushare/tushare/stock/trading.py", line 13, in <module>
        import lxml.html
    ModuleNotFoundError: No module named 'lxml'

回测运行失败

def QA_fetch_stocklist_day(stock_list, collections, date_range):
data = []
for item in stock_list:
data.append(QA_fetch_stock_day(
item, date_range[0], date_range[-1], collections))
return data

这里QA_fetch_stock_day调用时没有指定type_参数,导致new_test/stragety.py运行失败。

def QA_fetch_stock_day(code, startDate, endDate, type_='numpy', collections=QA_Setting.client.quantaxis.stock_day,):

运行版本3.7的疑惑

我今日在您的文档知道下重新运行了这个版本有几个疑惑想问您一下:
1.运行web or client后注册和登录后没有返回。
2.是否需要先运行爬虫,再用图形界面。
3.爬虫入口只有node一项否。

另外,在运行您的backend/methods/stock/test 中的例子总是会有问题,我是否还应该配置除了Scrapy之外的您在首页Readme中没有提到的其他库呢?

新的回测的报单接口

        我们需要的是一个简化的报单api


        买入/卖出
        股票代码
        买入/卖出数量
        
        参考实盘的下单接口:
        tradex:
        nCategory - 委托业务的种类
            0 买入
            1 卖出
            2 融资买入
            3 融券卖出
            4 买券还券
            5 卖券还款
            6 现券还券
        nOrderType - 委托报价方式
            0 限价委托上海限价委托/ 深圳限价委托
            1 市价委托(深圳对方最优价格)
            2 市价委托(深圳本方最优价格)
            3 市价委托(深圳即时成交剩余撤销)
            4 市价委托(上海五档即成剩撤/ 深圳五档即成剩撤)
            5 市价委托(深圳全额成交或撤销)
            6 市价委托(上海五档即成转限价)
        sAccount - 股东代码
        sStockCode - 证券代码
        sPrice - 价格
        sVolume - 委托证券的股数
        返回值errinfo - 出错时函数抛出的异常信息result - 查询到的数据然后去检查
        1.当前账户是否持仓该股票
        2.当前账户现金是否足以支持购买该股票
        返回
        3.是否委托(委托id)
        4.是否成交(成交id)
        5.成交笔数

能给个在win7 64下面的部署步骤吗?

Windows/Linux(ubuntu) 已测试通过
python3.6优先(开发环境) python2系列要改个Queue的名字
nodejs 需要安装>7的版本,来支持es6语法
mongodb是必须要装的
Wind万得数据库 机构版/免费(大奖章版)
一个简易demo(需要先安装并启动mongodb,python版本需要大于3)

git clone https://github.com/yutiansut/quantaxis
cd quantaxis
(sudo) python setup.py install
python easy_start_tushare.py(会存全市场的数据,较慢)
python test_strategy.py(一个简单的策略)
启动网络插件(nodejs 版本号需要大于6,最好是7)

cd QUANTAXISWebkit
(sudo) npm run install
(sudo) npm run Xweb
会自动启动localhost:8080网页端口,用账户名admin,密码admin登录

git clone https://github.com/yutiansut/quantaxis
cd quantaxis
(sudo) python setup.py install
我已经运行到这里了
然后你这个文件呢? easy_start_tushare.py

QUANTAXIS 官方推荐配置清单/过程

安装前准备:

python 3.6+

windows

直接安装exe版本即可

linux

sudo add-apt-repository ppa:fkrull/deadsnakes
sudo add-apt-repository ppa:jonathonf/python-3.6

sudo apt-get update
sudo apt-get install python3.6

下载安装mongodb

windows

下载安装mongodb 3.2+

到mongod的目录下 👍 一般是

C:\Program Files\MongoDB\Server\3.4\bin

MongoDB需要一个data目录一个logo目录
一般我们会在D:中新建一个data目录

cd D:
md data

然后在data目录下 新建一个data目录用于存放mongo的数据,log目录用于存放log

cd data
md data
md log

使用命令:

.\mongod.exe --dbpath  你的数据path  --logpath 你的日志path.log --httpinterface --rest --serviceName 'MongoDB' --install

示例:

.\mongod.exe --dbpath D:\data\data --logpath D:\data\log\mongo.log --httpinterface --rest --serviceName 'MongoDB' --install

安装Nodejs

windows

官网链接: https://nodejs.org/zh-cn/download/current/
直接下载exe 按要求安装即可 最新版本 8.2.1

Linux

linux 可以直接

sudo apt-get install nodejs

sudo npm install n -g
n lastest

linux/mac下的nodejs有一个版本管理包 叫n 需要全局安装 -g

所以无论装了什么版本的nodejs 只需要npm install n -g 就行

git

windows

百度搜索:git 下载--exe安装

linux

自带 无需安装

用装饰器形式来组装backtest

def strategy(func,*a,**b):
    def before_day(): 
        print('before of day in strategy')
    def end_day():
        print('end of day in strategy')
    def deoc(*a,**b):
        before_day()
        func(*a,**b)
        end_day()
    return deoc

def backtest(func,*a,**b):
    def before_backtest():
        print('before backtest')

    def end_backtest():
        print('end_backtest')

    def inside_backtest(*a,**b):
        before_backtest()
        func(*a,**b)
        end_backtest()
    return inside_backtest

@backtest
@strategy
def exec_bid():
    print('exec bid market and account')


"""
before backtest
before of day in strategy
exec bid market and account
end of day in strategy
end_backtest
"""

QUANTAXIS如何获取股票日线数据并存储?

3种办法

  • 从本地API localhost:3000/stock/history/time?code=xxx&start=(yyyy-mm-dd)&end=(yyyy-mm-dd)获取
    返回的是:日期 ,开盘价, 最高价, 收盘价, 最低价, 成交量, 价格变动 ,涨跌幅,5日均价,10日均价,20日均价,5日均量,10日均量,20日均量,换手率
  • 从万德数据获取wsd模块(免费版/机构版/学生版均可)
  • 从pydata获取(在data模块下)

=======

方法1 从本地API获取[利用任何ajax请求包,或者直接网络访问包都可以]

(本地的api是基于nodejs的爬虫打包)

#coding:utf-8
import requests

code='600010'
startdate='2015-06-02'
enddate='2016-06-02'
data=requests.get("http://localhost:3000/stock/history/time?code="+str(code)+"&start="+str(startdate)+"&end="+str(enddate))
lists=data.json()

存储

#mysql
#mongodb
import pymongo
client=pymongo.MongoClient
db=client.你的数据库名(比如stock)
coll=db.集合名(比如K_data,或者day或者ts等等)
# 日期 ,开盘价, 最高价, 收盘价, 最低价, 成交量, 价格变动 ,涨跌幅,5日均价,10日均价,20日均价,5日均量,10日均量,20日均量,换手率
coll.insert({"date":list[0],"open":list[1],"high":list[2],"low":list[3],"close":list[4]}
#可以自己决定存什么进去

装饰器 backtest

try:
    sys.path.append(os.getcwd())
    import user_strategy
except:
    QA_util_log_info(Exception)


def strategy(func, *a, **b):
    def before_day():
        print('before of day in strategy')

    def end_day():
        print('end of day in strategy')

    def deoc(*a, **b):
        before_day()
        func(*a, **b)
        end_day()
    return deoc


def backtest(func, *a, **b):
    def before_backtest():
        print('before backtest')

    def end_backtest():
        print('end_backtest')

    def inside_backtest(*a, **b):
        before_backtest()
        func(*a, **b)
        end_backtest()
    return inside_backtest


@backtest
@strategy
def exec_bid():
    print('exec bid market and account')


"""
before backtest
before of day in strategy
exec bid market and account
end of day in strategy
end_backtest
"""

QUANTAXIS 绩效分析 预计修改

目前的绩效分析主要是:

"""
    Annualized Returns: 策略年化收益率。表示投资期限为一年的预期收益率。
    具体计算方式为 (策略最终价值 / 策略初始价值 - 1) / 回测交易日数量 × 250

    Alpha:阿尔法
    具体计算方式为 (策略年化收益 - 无风险收益) - beta × (参考标准年化收益 - 无风险收益),这里的无风险收益指的是**固定利率国债收益率曲线上10年期国债的年化到期收益率。

    Beta:贝塔
    具体计算方法为 策略每日收益与参考标准每日收益的协方差 / 参考标准每日收益的方差 。

    Sharpe Ratio:夏普比率。表示每承受一单位总风险,会产生多少的超额报酬。
    具体计算方法为 (策略年化收益率 - 回测起始交易日的无风险利率) / 策略收益波动率 。

    Volatility:策略收益波动率。用来测量资产的风险性。
    具体计算方法为 策略每日收益的年化标准差 。

    Information Ratio:信息比率。衡量超额风险带来的超额收益。
    具体计算方法为 (策略每日收益 - 参考标准每日收益)的年化均值 / 年化标准差 。

    Max Drawdown:最大回撤。描述策略可能出现的最糟糕的情况。
    具体计算方法为 max(1 - 策略当日价值 / 当日之前虚拟账户最高价值)
    """

下面会增加:

  • 单次交易收益
  • 收益/次数的频次直方图
  • 单日最大持仓
  • 继续补充

运行报错

\web\node_modules\quantaxiswebkit\client\app\src\renderer\main.js Unexpected token (47:2
You may need an appropriate loader to handle this file type.
| new Vue({
| router,
| ...App
| }).$mount('#app')
|
@ multi (webpack)-dev-server/client?http://localhost:9080 webpack/hot/dev-server ./app/src/renderer/main.js

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.