既然已经选出股票了那我们就迫不及待的想要让量化交易系统执行操作了。其实有人会觉得既然已经选出股票了那我自己在股票APP上操作一下不就行了么没那么简单如果还需要你自己在APP上操作那我这资深码农的身份还要不要啦说真的让量化交易系统去执行操作有几个理由1系统是没有情绪的不会被情绪所左右2选股结果可能并不只是选出2、3只股票而可能是20、30只股票甚至更多人手是比较难准确操作的3股票的价格差异很大买入的规则可以是不管价格每只股票买入1手也可能是每只股票都买入1000块按1000块去计算每只股票需要买多少手。这个计算结果是可以由代码给出的但是会进一步增加人手操作的难度很容易出错。4人会被各种事情打扰比如说刚上班就被老板叫去开会此时就没机会拿出手机操作股票了。所以呢不管是全自动的操作还是半自动的操作最好都是交给量化交易系统去完成。选择操作接口很简单达到资金门槛然后付费给券商开通量化交易接口 —— 这是普通人的选择。至于我资深码农有手怎么可能会去付费于是我选择自己开发一套操作模块接口级的对接肯定是必须找券商开通的所以此路不通。但是应用级的“接口”就不需要任何外部条件了。所谓应用级的接口简单来说就是自动化操作WEB自动化操作安卓自动化操作iOS自动化操作。现在一般券商提供的股票软件都支持安卓和iOS所以我们可以借助手机实现量化交易系统的自动化操作。但是且慢如果要用手机的话不是成本也不低吗运行自动化的时候还需要连接一台手机这是普通人的做法作为资深码农怎么可能用真手机直接在电脑上运行一个手机模拟器就行了手机自动化框架有若干可选有appiumairtest我最熟悉的是airtes所以就选airtest这个纯粹是个人喜好。熟悉其他框架也可以选其他的。airtest的机制是通过在手机上部署一个pocoservice应用获取手机的界面元素信息元素有name、text等属性可以通过这些属性查找对应的元素也可以通过模式匹配模糊查找元素。查找到元素之后就可以执行点击操作对于输入类的元素也可以执行输入文本的操作。当然通过自动化框架执行操作需要应对各种异常情况比如APP会弹出提示信息需要确保操作过程中不会被提示信息干扰等等。实现自动化操作首先给python环境安装airtest和pocoui注意不是poco是pocoui模块。然后就可以开始写代码了。实现自动操作的代码如下from airtest.core.api import * from poco.drivers.android.uiautomation import AndroidUiautomationPoco def _点击控件(poco, 属性, 属性值, 位置(0.5, 0.5), 序号0): # 控件 poco(**{属性: 属性值}) try: poco(**{属性: 属性值})[序号].click(focus位置) except poco.exceptions.PocoNoSuchNodeException: # 点击的时候控件不存在该异常不需要处理 pass def _输入文本(文本, enterTrue): if not (isinstance(文本, str) or isinstance(文本, bytes)): 文本 %s % 文本 text(文本, enterenter) def _获取控件文本(poco, 控件名): 控件 poco(name控件名) if 控件.exists(): return 控件.get_text() return def _滑动(poco, 方向向上): if 方向 向上: poco.swipe([0.5, 0.8], [0.5, 0.2], duration0.5) else: poco.swipe([0.5, 0.2], [0.5, 0.8], duration0.5) def _回退(): keyevent(BACK) def 执行买入操作(poco, 股票代码, 买入数量, 买入价格): _点击控件(poco, name, search) _输入文本(股票代码) _点击控件(poco, text, 买入) _点击控件(poco, name, price) _输入文本(买入价格) _点击控件(poco, name, amount) _输入文本(买入数量) _点击控件(poco, text, 提交) _点击控件(poco, text, 确认) print(_获取控件文本(poco, result)) def 执行卖出操作(poco, 股票代码, 卖出数量, 卖出价格): _点击控件(poco, name, search) _输入文本(股票代码) _点击控件(poco, text, 卖出) _点击控件(poco, name, price) _输入文本(卖出价格) _点击控件(poco, name, amount) _输入文本(卖出数量) _点击控件(poco, text, 提交) _点击控件(poco, text, 确认) print(_获取控件文本(poco, result)) def 批量操作模拟盘(股票操作列表): auto_setup(__file__) poco AndroidUiautomationPoco(use_airtest_inputTrue, screenshot_each_actionFalse) # 确保APP界面回到主页面 for x in range(5): if _获取控件文本(poco, home) ! : break else: _回退() # 如果无法回退到主页面后面的就无法操作了 if _获取控件文本(poco, home) : print(未找到主页面请检查APP是否正常启动) return # 进入模拟盘交易界面 _点击控件(poco, text, 交易) _点击控件(poco, text, 模拟) print(开始批量操作股票) for 股票操作 in 股票操作列表: print(股票操作) 股票代码 股票操作[股票代码] 操作类型 股票操作[操作类型] 买入数量 股票操作[买入数量] 买入价格 股票操作[买入价格] 卖出数量 股票操作[卖出数量] 卖出价格 股票操作[卖出价格] if 操作类型 买入: 执行买入操作(poco, 股票代码, 买入数量, 买入价格) elif 操作类型 卖出: 执行卖出操作(poco, 股票代码, 卖出数量, 卖出价格) print(批量操作股票完成) if __name__ __main__: 批量操作模拟盘([ {股票代码: 000001, 操作类型: 买入, 买入数量: 100, 买入价格: 10.00}, {股票代码: 000002, 操作类型: 卖出, 卖出数量: 100, 卖出价格: 10.00} ])对APP的操作基本可以归纳为点击输入查询滑动上下回退分别对应的“_点击控件”、“_输入文本”和“_获取控件文本”、“_滑动”, “_回退”这几个函数。完成一次股票操作比如买入操作步骤为先确保进入到模拟盘交易页面然后根据需要操作的股票列表重复以下操作对于股票操作列表中的每个操作点击查找控件输入股票代码弹出股票操作页面之后点击页面中的买入控件点击价格控价输入价格点击数量控件输入数量点击“确认买入”控件最后获取交易结果信息操作步骤中使用的控件属性值、控件名跟具体的APP相关需要用airtest的调试功能去找出对应控件的属性值。airtest的调试界面如下安装并打开Airtest IDE之后点击“刷新ADB”在Android设备连接信息表格中出现设备记录之后点击“connect”连接根据Airtest的帮助文档可以录制和获取手机上的APP控件属性进而对控件进行操作。相关资料请参考Airtest的帮助文档这里就不赘述了。实现操作模块之后就可以通过量化交易系统自动地执行模拟盘股票操作了。但是因为是基于手机自动化而实现的自动操作效率上是无法与高频量化交易相比的但是相比人手的操作效率则又高出一个量级可以让我们一次操作几十只股票。这个效果对于普通股民来说已经足够了。