往期推荐
量化投资实战教程(1)—基于backtrader的简单买入卖出策略
Python 量化投资原来这么简单(5) — A股回测KDJ策略
Python 量化投资原来这么简单(6) — 交易平均收益率
A股回测“孕线”策略 — Python 量化投资实战教程(8)
自定义MySQL数据流 — Python 量化投资实战教程(9)
在量化投资系列教程中,我们从理论上介绍了量化回测的基本原理和思路,并进行了一定的实战分析和演练。但是并没有涉及到实际交易的场景。
在开始之前,我们需要明确什么策略需要使用自动交易的方式。我们前面的教程都是基于日线的策略,这样的日线策略并不需要自动化交易,因为你只需要提前一天算好第二天需要买入的股票即可。
什么情况下需要本文的自动交易?
1.你的策略是基于 分钟线 (1,5,15,60) 的。
2.你的日线策略在购买的时候需要判断前一天封盘前的股票数据,并提前一天买入。
3.你希望能自动打新。
除了这三种情况,其他的策略都不适合使用本文的自动交易,包括秒级别的策略,因为Easytrader是基于GUI层面(图形界面)实现的自动化接口,而非API层面,因此实时性不会很高,而且是串行形式的,并不适合秒级策略。
此外,Easytrader对券商有一定的要求:
目前支持 海通客户端、华泰客户端、国金客户端、雪球,还有通用同花顺客户端(指的是那些基于同花顺修改的券商软件版本)。
在开始自动交易前,请确认你的策略是可靠的,否则不要轻易尝试自动交易。另外交易逻辑的处理也需要非常谨慎,错一行代码可能损失的是几千块甚至不止。所以,一开始执行自动交易的时候,推荐只用很小一部分的本金。
本文只会介绍Easytrader的安装方法和基本使用方法及构建监控股票池的重要性,其他深入介绍将于后面的 量化投资系列教程10 中介绍,敬请期待。
一个小小的预告
1.准备
开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。
如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.
此外,推荐大家用VSCode编辑器,它有许多的优点:Python 编程的最好搭档—VSCode 详细指南。
输入命令安装依赖:
1. Windows 环境 打开 Cmd (开始-运行-CMD)。
2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。
3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的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出来,不然你的检测周期可能因此中断,如果是无人值守的程序,可能整个程序都会停止。
PS:使用前请构建监控股票池
使用Easytrader前为什么需要构建股票池?如我们前面提到的,Easytrader是基于GUI层面的自动化交易接口,它会进入如下模样的界面进行自动化操作:
如果你的监控对象太多,有多个对象同时符合策略,它会一个一个地进行操作,容易耽误下个周期的计算,因此推荐构建一个50只股票左右的股票池。
你可以根据基本面构造你的股票池,比如最近几年年报中,扣非净利润均有所增长的企业,或是在你的策略下表现最好的50只股票(当然未来不一定靠谱)。
无论你怎么构造,请记录下这些股票(最好是数组变量的形式),证券市场的前缀在前,代码在后,比如 sh600519:
-
# 以
2000元的价格买入
100股sh600519, 贵州茅台
-
user.buy(
'sh600519',
2000,
100)
当然,此时会报错:
毕竟我未实现100股自由,希望各位能在下方点个“在看”,让我尽早实现100股自由。
我们的文章到此就结束啦,如果你喜欢今天的Python 实战教程,请持续关注Python实用宝典。
有任何问题,可以在公众号后台回复:加群,回答相应红字验证信息,进入互助群询问。
原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!
点击下方阅读原文可获得更好的阅读体验
Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典
转载:https://blog.csdn.net/u010751000/article/details/112504912