在量化投资系列教程中,我们从理论上介绍了量化回测的基本原理和思路,并进行了一定的实战分析和演练。但是并没有涉及到实际交易的场景。

在开始之前,我们需要明确什么策略需要使用自动交易的方式。我们前面的教程都是基于日线的策略,这样的日线策略并不需要自动化交易,因为你只需要提前一天算好第二天需要买入的股票即可。

什么情况下需要本文的自动交易?

1.你的策略是基于 分钟线 (1,5,15,60) 的。
2.你的日线策略在购买的时候需要判断前一天封盘前的股票数据,并提前一天买入。
3.你希望能自动打新。

除了这两种情况,其他的策略都不适合使用本文的自动交易,包括秒级别的策略,因为Easytrader是基于GUI层面(图形界面)实现的自动化接口,而非API层面,因此实时性不会很高,而且是串行形式的,并不适合秒级策略。

此外,Easytrader对券商有一定的要求:

目前支持 海通客户端、华泰客户端、国金客户端、雪球,还有通用同花顺客户端(指的是那些基于同花顺修改的券商软件版本)。

在开始自动交易前,请确认你的策略是可靠的,否则不要轻易尝试自动交易。另外交易逻辑的处理也需要非常谨慎,错一行代码可能损失的是几千块甚至不止。所以,一开始执行自动交易的时候,推荐只用很小一部分的本金。

本文只会介绍Easytrader的安装方法和基本使用方法及构建监控股票池的重要性,其他深入介绍将于后面的 量化投资系列教程10 中介绍,敬请期待。

一个小小的预告

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

在终端输入以下命令安装我们所需要的依赖模块:

pip install easytrader

看到 Successfully installed xxx 则说明安装成功。

某些券商在登录的时候可能需要识别验证码,这时候需要下载tesseract

1.下载并安装tesseract

前往 tesseract-ocr 官网下载二进制包,此外你也可以在Python实用宝典公众号后台回复: tesseract,直接获得tesseract的安装包。

双击下载下来的安装包,然后傻瓜式安装就可以,这里只需要注意一点:安装过程中有一个让你选择 Additional language data(download) 表示选择的话帮你下载语言包,这里最好不要选择勾选,因为勾选的话,安装过程非常慢,本教程只需要用到数字和英文识别而已。

2.配置环境变量

右击我的电脑/计算机,选择属性,然后选择高级属性设置,选择环境变量,在系统变量的path变量中添加你的 tesseract 目录就可以了

3.判断是否安装成功

在命令行中输入:

tesseract --version

出现下面的提示说明安装成功:

2.Easytrader 基本使用

这一章将介绍Easytrader的基本使用方法、包括客户端连接、获取资金状况、获取持仓、买入、卖出、一键打新、撤单。

在开始之前,请对客户端调整以下设置,不然会导致下单时价格出错以及客户端超时锁定。

  • 系统设置 > 界面设置: 界面不操作超时时间设为 0
  • 系统设置 > 交易设置: 默认买入价格/买入数量/卖出价格/卖出数量 都设置为 空

同时客户端不能最小化也不能处于精简模式。

2.1 自动登录客户端:

在Windows机器上下载好我们在文首提到的几个券商客户端、准备好Python相关的依赖,即可开始尝试自动登录客户端:

import easytrader

# 海通客户端
user = easytrader.use('htzq_client')
user.prepare(user='用户名', password='明文密码')

# 华泰客户端
user = easytrader.use('ht_client')
user.prepare(user='用户名', password='明文密码', comm_password='华泰通讯密码,其他券商不用')

# 国金客户端
user = easytrader.use('gj_client')
user.prepare(user='用户名', password='明文密码')

# 雪球
user = easytrader.use('xq')
user.prepare(user='用户名', password='明文密码')

# 通用同花顺客户端, 指对应券商官网提供的基于同花顺修改的软件版本, 如(银河的双子星)
user = easytrader.use('ths')
user.prepare(user='用户名', password='明文密码')

选择你的客户端,将其他的客户端去掉,运行这个py文件,程序就会开始自动登录,期间会识别很多次验证码,经常会识别错误,没关系,让他慢慢重试即可。

如果你识别验证码的时候报了错,程序停止了下来,那是因为你没安装 tesseract, 回到第一步安装tesseract即可。

2.2 获取资金、持仓情况

获取资金、持仓情况的时候,程序都会自动化地进入相关界面获取信息。有时候也需要输入验证码,这时候easytrader也会自动识别,请不要介入。

import easytrader
# 国金客户端
user = easytrader.use('gj_client')
user.prepare(user='用户名', password='明文密码')

# 获取资金状况
balance = user.balance
print(balance)
# [{'参考市值': 21642.0,
#   '可用资金': 28494.21,
#   '币种': '0',
#   '总资产': 50136.21,
#   '股份参考盈亏': -90.21,
#   '资金余额': 28494.21,
#   '资金帐号': 'xxx'}]

# 获取持仓情况
position = user.position
print(position)
# [{'买入冻结': 0,
#   '交易市场': '沪A',
#   '卖出冻结': '0',
#   '参考市价': 4.71,
#   '参考市值': 10362.0,
#   '参考成本价': 4.672,
#   '参考盈亏': 82.79,
#   '当前持仓': 2200,
#   '盈亏比例(%)': '0.81%',
#   '股东代码': 'xxx',
#   '股份余额': 2200,
#   '股份可用': 2200,
#   '证券代码': '601398',
#   '证券名称': '工商银行'}]

2.3 买入、卖出、一键打新、撤单

买入卖出时设定股票代码,价格和数量即可:

import easytrader
# 国金客户端
user = easytrader.use('gj_client')
user.prepare(user='用户名', password='明文密码')

# 买入
user.buy('162411', price=0.55, amount=100)
# {'entrust_no': 'xxxxxxxx'}

# 卖出
user.sell('162411', price=0.55, amount=100)
# {'entrust_no': 'xxxxxxxx'}

# 一键打新
user.auto_ipo()

# 撤单
user.cancel_entrust('buy/sell 获取的 entrust_no')
# {'message': '撤单申报成功'}

如果资金不足或可用证券数量不足,程序会报错,这时候请注意把错误except出来,不然你的检测周期可能因此中断,如果是无人值守的程序,可能整个程序都会停止。

3.构建监控股票池

为什么需要构建股票池?如我们前面提到的,Easytrader是基于GUI层面的自动化交易接口,它会进入如下模样的界面进行自动化操作:

如果你的监控对象太多,有多个对象同时符合策略,它会一个一个地进行操作,容易耽误下个周期的计算,因此推荐构建一个50只股票左右的股票池。

你可以根据基本面构造你的股票池,比如最近几年年报中,扣非净利润均有所增长的企业,或是在你的策略下表现最好的50只股票(当然未来不一定靠谱)。

无论你怎么构造,请记录下这些股票(最好是数组变量的形式),证券市场的前缀在前,代码在后,比如 sh600519:

# 以2000元的价格买入100股sh600519, 贵州茅台
user.buy('sh600519', 2000, 100)

当然,此时会报错:

毕竟我未实现100股自由,希望各位能在下方点个“在看”,让我尽早实现100股自由。

欢迎在公众号后台回复:加群,回答相应红字验证信息,进入互助群交流。

我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。