Bootstrap

15天搭建ETF量化交易系统Day6—打通同花顺自动交易 原创


a9ad2adb0d92471b0ed9d63495b06334.png

搭建过程

650cdd1eafb58195fd64fdcaa9156a15.png

每个交易者都应该形成一套自己的交易系统。

很多交易者也清楚知道,搭建自己交易系统的重要性。现实中,从0到1往往是最难跨越的一步。
授人鱼不如授人以渔,为了帮助大家跨出搭建量化系统的第一步,我们决定推出这个主题系列。
这个系列中,我们用Python从0开始一步步搭建出一套ETF量化交易系统(选择ETF标的是因为对于普通交易者来说,ETF相对于选强势股难度要小,而且没有退市风险)。大家可以跟随着我们的实现路径来一起学习,从过程中掌握方法。
掌握了方法之后,你可以换成期货系统、比特币系统、美股系统,然后在实战中不断去完善自己的系统了。
搭建一套ETF量化交易系统涉及多个模块和组件的协同工作,包括数据源模块、量化策略模块、可视化模块、数据库模块、回测评估模块、自动交易模块等等。
DAY1链接如下:15天搭建ETF量化交易系统Day1—数据源模块
DAY2链接如下:15天搭建ETF量化交易系统Day2—图形显示模块
DAY3链接如下:15天搭建ETF量化交易系统Day3—上手经典回测框架
DAY4链接如下:15天搭建ETF量化交易系统Day4—玩转海龟交易策略
DAY5链接如下:15天搭建ETF量化交易系统Day5—打造实盘量化机器人
DAY6我们要打通自动交易环节。我们采用的方案是使用easytrader库搭建本地自动交易环境,然后用程序自动操作同花顺交易客户端下单。

7c82faec42e05d8fcbe592ec33264d52.png

概述原理

fc11ddf9e0c022dd1ecd86c8d02d2bc9.png

通常使用PC时,与PC交互的主要途径是看屏幕显示、听声音,点击鼠标和敲键盘等等。

在自动化办公的趋势下,繁琐的工作可以让程序自动完成,比如自动化测试等,这时会使用到不少的软件程序。

很多软件除了可以GUI方式操作外还可以用CLI接口操作,不过当一些软件未提供CLI接口时,我们应该怎么办呢?

答案是我们可以用程序控制桌面上的窗口、模拟点击鼠标或按下键盘等动作来释放自己。这类方案当前只适用在windows桌面软件。

所以目前市面上股票量化交易中所谓的外挂软件、easytrader库等等,它们即是基于这个原理,利用程序登陆证券账号客户端,模仿人的交易行为。

5da31584984a0b9297adcabce3c04d22.png

安装与部署

c53e50684f9e0fc8969b04ae3c14b48b.png

不同券商的客户端操作方法是不一样的,所以自动交易程序也都不一样。

同花顺客户端是可以用来登陆其他证券公司账户的,这样就不用再使用其他证券客户端了。

接下来,我们主要以同花顺客户端为例进一步介绍自动交易股票的实现方案。

实现自动交易股票的核心是pywinauto这个Python库。它可以将鼠标和键盘操作发送到窗口对话框和控件,常用于在Windows平台上自动化操作GUI界面。

目前比较流行的easytrader库就是基于这个原理实现了调用一些券商客户端完成股票自动化交易的功能。

接下来介绍下如何安装和部署easytrader库。

如何安装和使用easytrader库可以参考官网的介绍:

https://easytrader.readthedocs.io/zh/master/

此处记录下我自己部署自动交易环境的整个过程。

第一步,安装easytrader库。

pip install easytrader

第二步,安装tesseract-ocr,用于解决验证码识别。

在操作账户的时候有时候会跳出输入“图形验证码”窗口,上面显示一些不规则(字符稍加扭曲变换得到的)的字符。tesseract-ocr(Optical Character Recognition)能够扫描字符,根据字符形状将其翻译成电子文本的过程。因此需要安装tesseract-ocr自动识别验证码。

tesseract下载地址:

https://digi.bib.uni-mannheim.de/tesseract/

进入下载页面,可以看到有各种.exe文件的下载列表,其中文件名中带有dev的为开发版本,不带dev的为稳定版本,可以选择下载不带dev的版本。我下载的是 tesseract-ocr-setup-3.05.01.exe。

下载完成后双击,此时会出现如下图所示的页面。

186e236f55f6018a4253f8ab5a9857dd.png

然后连续点击Next按钮,直到安装完成。记得勾上“Additional language data(download)”选项安装OCR识别支持的语言包,这样OCR便可以识别多国语言。

第三步,安装完成后要确保命令行下 tesseract 可用。

为了在全局使用方便,先配置下环境变量。比如安装路径为C:\Program Files (x86)\Tesseract-OCR,将该路径添加到环境变量的path中。

配置完成后在命令行输入tesseract -v,如果出现如下图所示,说明环境变量配置成功

C:\Program Files (x86)\Tesseract-OCR>tesseract -v
tesseract 3.05.01
leptonica-1.74.1
libgif 4.1.6(?) : libjpeg 8d (libjpeg-turbo 1.5.0) : libpng 1.6.20 : libtiff 4.0.6 : zlib 1.2.8 : libwebp 0.4.3 : libopenjp2 2.1.0

 然后找个样例图片进行测试,下载链接:

https://raw.githubusercontent.com/Python3WebSpider/TestTess/master/image.png。

首先用命令行进行测试。把图片下载到C盘Downloads文件夹,保存为image.png,然后在该文件夹中打开命令行,用tesseract命令测试: 

C:\Users\Administrator\Downloads>tesseract image.png result
Tesseract Open Source OCR Engine v3.05.01 with Leptonica

6e115f2e6a66ccfbe266d3f2bec0b32f.png

这里我们调用了tesseract命令,其中第一个参数为图片名称,第二个参数result 为结果保存的目标文件名称。

运行结果便是图片的识别结果:Python3WebSpider。可以在Download文件夹中看到result.txt,这时已经成功将图片文字转为电子文本了。

第四步,通过Python代码测试tesseract功能。

首先安装tesserocr 库,可以下载tesserocr-2.6.0-cp39-cp39-win_amd64.whl进行安装。

import tesserocr
from PIL import Image
text = tesserocr.image_to_text(Image.open('tmp.png'))
print(text)

如果成功输出结果,则证明tesseract已经安装成功。

第五步,安装同花顺客户端。

同花顺客户端必须是V8.0,可以在官网下载,也可以在星球对应的主题附件中下载。把自己的登陆帐号信息同步到xiadan.exe中,之后直接运行xiandan.exe就可以了。

事先勾选自动登录、保存密码配置,这样打开后则自动完成登录。记得先用模拟账户进行测试,调稳定后再换上实盘账户。

fba2d4f2dc70fe81b2d903e2a758ef57.png

需要注意的是,有些可以简化的步骤选择默认确定:

a41a5e0fdd7c064ced33fbd3fbbaa520.png

第六步,测试自动下单程序。

import easytrader
import tesserocr
import time
 
user = easytrader.use('ths')
user.connect(u"C:\\同花顺软件\\同花顺\\xiadan.exe") # 类似 r'C:\htzqzyb2\xiadan.exe'
# 设置客户端编辑文本形式:type_keys
user.enable_type_keys_for_editor()
 
#user.prepare('THS_client.json')  # 配置文件路径
# 获取资金状况
balance = user.balance
print(f"资金余额:{balance['资金余额']}") 
print(f"可用金额:{balance['可用金额']}")
print(f"可取金额:{balance['可取金额']}")
print(f"股票市值:{balance['股票市值']}")
print(f"总资产:{balance['总资产']}")
 
# 获取持仓
position = user.position
for item in position:
    print(item) 
 
# 买入
buy_result = user.buy('603220', price=19.05, amount=100)
print(buy_result)
 
buy_result = user.buy('603220', price=19.08, amount=100)
print(buy_result)
 
buy_result = user.buy('603220', price=19.07, amount=100)
print(buy_result)
 
buy_result = user.buy('603220', price=19.06, amount=100)
print(buy_result)
 
# 查询当日成交
today_trades_result = user.today_trades
for item in today_trades_result:
    print(item) 
 
# 查询当日委托
entrusts_result = user.today_entrusts
for item in entrusts_result:
    print(item) 
print("test over!!!")

b83377c63a92b2531589ab1b6ea2c8b0.png

封装成类

2f08af5e5fd8c6a80a15dbb63e3635f8.png

调通了基础例程后,我们把这些交易的功能封装成一个类,以供系统整体的调用。

类名为ThsTrader,其中包括了“连接客户端”、“获取资金状况”、“获取当前仓位”、“查询当日成交”、“买入”、“卖出”等方法。

class ThsTrader:


    def __init__(self,
                exe=r'C:\同花顺软件\同花顺\xiadan.exe',
                tesseract_cmd = r'C:\Program Files (x86)\Tesseract-OCR\tesseract',
                is_slippage=True,
                slippage=0.01):
        pass # "略"
    


    def get_balance(self):
        '''
        获取资金状况
        '''
        pass # "略"
        return pd.DataFrame()


    def get_position(self):
        '''
        获取持股
        '''
        pass # "略"
        return pd.DataFrame()


    def today_trades(self):
        '''
        当日成交
        '''
        pass # "略"
        return pd.DataFrame()


    def today_entrusts(self):
        '''
        当日委托
        '''
        pass # "略"
        return pd.DataFrame()


    def make_buy(self, security='600031', price=16.5, amount=100):
        pass # "略"
        return True




    def make_sell(self, security='300780', price=14, amount=100):
        pass # "略"
        return False


    def connect(self, client='universal_client'):
        print('链接同花顺')
        user=easytrader.use(client)
        #path=self.exe[:-9]+'xiadan.exe'
        user.connect('{}'.format(self.exe))
        #不使用这个可能无法输入数据
        user.enable_type_keys_for_editor()
        self.user=user

2507976ddedd212c3d721712a40d0baf.png

效果展示

fe7e4dca0f399c7b868f001480289894.png

比如查询当日成交:

1e5d071d06ec4b3f6f23b025ce4bc2ec.png

6b82e3c842c8f25251332199a6ad9058.png

比如查询资金股票:

d1e0a69080acccaf16c8f8b2aba2098d.png

2828a5a307711c26df7f60326e41dde0.png

这里展示下自动下单的效果,我们将筛选出来的股票事先加到下单的例程中,然后按现价买入。

本篇内容介绍了市面上推行的股票自动交易原理,揭开这层神秘的面纱,另外也给想实现自动交易的朋友们指引一个可行的方向。

不同券商客户端具体的下单、撤单、查询资金、查询持仓等方法略有不同,更多地是需要不断地去调试出模拟的方法。

97eedb31f54d3409d1db0cb1f3742722.png

总结

d90d0181b58ad9d71586ed28c228628a.png

实现了自动下单这个环节之后,接下去我们可以形成闭环的量化交易系统,全自动化交易。

说明

此系列为连载专栏,完整代码会上传知识星球《玩转股票量化交易》!作为会员们的学习资料。

想要加入知识星球《玩转股票量化交易》的小伙伴记得先微信call我获取福利!

非星球会员需要的话,需要单独联系我购买!

知识星球介绍点击:知识星球《玩转股票量化交易》精华内容概览

d0ebcc03a59d256a5d26e7ea719cb689.jpeg

;