本篇开始具体分析每个文件。
api.py
api.py
文件,是使用easyTrader
的入口,他由两个核心方法组成:use
和follower
。分别对应该库的两个api:easyTrader.use()
和easyTrader.follower()
。而这正对应了两大核心功能:下单与跟单。
该文件的代码,不算多,也比较好理解。下边分别介绍
引入模块
import logging
import sys
import six
from easytrader.joinquant_follower import JoinQuantFollower
from easytrader.log import logger
from easytrader.ricequant_follower import RiceQuantFollower
from easytrader.xq_follower import XueQiuFollower
from easytrader.xqtrader import XueQiuTrader
logging
(日志模块)和sys
(系统模块),都是Python标准库的内置模块。six
,是一个第三方库,用来处理Python2与Python3的兼容问题,不过这里只是引用,并没有使用,而且easyTrader并不支持Python2,估计是忘删了。JoinQuantFollower
,logger
,RiceQuantFollower
,XueQiuFollower
,XueQiuTrader
,都是包内部的模块,后边会用到。
Python版本检测
if sys.version_info <= (3, 5):
raise TypeError("不支持 Python3.5 及以下版本,请升级")
要求Python版本大于3.5
use方法
def use(broker, debug=False, **kwargs):
"""用于生成特定的券商对象
:param broker:券商名支持 ['yh_client', '银河客户端'] ['ht_client', '华泰客户端']
:param debug: 控制 debug 日志的显示, 默认为 True
:param initial_assets: [雪球参数] 控制雪球初始资金,默认为一百万
:return the class of trader
Usage::
>>> import easytrader
>>> user = easytrader.use('xq')
>>> user.prepare('xq.json')
"""
if debug:
logger.setLevel(logging.DEBUG)
if broker.lower() in ["xq", "雪球"]:
return XueQiuTrader(**kwargs)
if broker.lower() in ["yh_client", "银河客户端"]:
from .yh_clienttrader import YHClientTrader
return YHClientTrader()
if broker.lower() in ["ht_client", "华泰客户端"]:
from .ht_clienttrader import HTClientTrader
return HTClientTrader()
if broker.lower() in ["wk_client", "五矿客户端"]:
from easytrader.wk_clienttrader import WKClientTrader
return WKClientTrader()
if broker.lower() in ["htzq_client", "海通证券客户端"]:
from easytrader.htzq_clienttrader import HTZQClientTrader
return HTZQClientTrader()
if broker.lower() in ["gj_client", "国金客户端"]:
from .gj_clienttrader import GJClientTrader
return GJClientTrader()
if broker.lower() in ["gf_client", "广发客户端"]:
from .gf_clienttrader import GFClientTrader
return GFClientTrader()
if broker.lower() in ["universal_client", "通用同花顺客户端"]:
from easytrader.universal_clienttrader import UniversalClientTrader
return UniversalClientTrader()
if broker.lower() in ["ths", "同花顺客户端"]:
from .clienttrader import ClientTrader
return ClientTrader()
raise NotImplementedError
- 入参
broker
:字符串类型,券商客户端名称,每个名称都有中英文两种,根据不同的名称,调用不同的客户端Trader类。 - 入参
debug
:是否显示debug日志,代码注释写的默认值为True
,应该是写错了,默认参数是False
- 其他入参:雪球客户端有一些特殊的参数,分析雪球客户端时具体展开。
- 程序的实体也很简单,就是根据
broker
的值,走不同的if
分支,返回不同的类,就可以实现对不同客户端的控制。具体的对应关系,见下边列表格显示:
broker | class |
---|---|
[“xq”, “雪球”] | XueQiuTrader |
[“yh_client”, “银河客户端”] | YHClientTrader |
[“ht_client”, “华泰客户端”] | HTClientTrader |
[“wk_client”, “五矿客户端”] | WKClientTrader |
[“htzq_client”, “海通证券客户端”] | HTZQClientTrader |
[“gj_client”, “国金客户端”] | GJClientTrader |
[“gf_client”, “广发客户端”] | GFClientTrader |
[“universal_client”, “通用同花顺客户端”] | UniversalClientTrader |
[“ths”, “同花顺客户端”] | ClientTrader |
以上,就是支持的所有客户端类型,以及其broker
值,我目前也没有都试过,试过同花顺和国金,后面想办法试试其他的。
follower方法
def follower(platform, **kwargs):
"""用于生成特定的券商对象
:param platform:平台支持 ['jq', 'joinquant', '聚宽’]
:param initial_assets: [雪球参数] 控制雪球初始资金,默认为一万,
总资金由 initial_assets * 组合当前净值 得出
:param total_assets: [雪球参数] 控制雪球总资金,无默认值,
若设置则覆盖 initial_assets
:return the class of follower
Usage::
>>> import easytrader
>>> user = easytrader.use('xq')
>>> user.prepare('xq.json')
>>> jq = easytrader.follower('jq')
>>> jq.login(user='username', password='password')
>>> jq.follow(users=user, strategies=['strategies_link'])
"""
if platform.lower() in ["rq", "ricequant", "米筐"]:
return RiceQuantFollower()
if platform.lower() in ["jq", "joinquant", "聚宽"]:
return JoinQuantFollower()
if platform.lower() in ["xq", "xueqiu", "雪球"]:
return XueQiuFollower(**kwargs)
raise NotImplementedError
- 入参
platform
:字符串类型,代表各种第三方平台。 - 其他入参:雪球类型需要其他参数,以后展开分析。
- follower方法的逻辑也一样简单,根据不同的
platform
,返回不同的Follower类,以后续获得某个该平台的公开组合,进行跟单。
platform | class |
---|---|
[“rq”, “ricequant”, “米筐”] | RiceQuantFollower |
[“jq”, “joinquant”, “聚宽”] | JoinQuantFollower |
[“xq”, “xueqiu”, “雪球”] | XueQiuFollower |
结语
本文介绍了api.py
文件,从这里,我们可以继续向easyTrader
内部切入,可以明显看到两个方向:一个是对交易客户端的控制,另一个是对量化平台组合的跟单。两者结合到一起,就可以完成跟单组合,并自动化交易的目的。