自动化交易(一):level2行情接入示例

在量化交易领域,个人投资者相较于机构投资者而言,最大的优势在于其灵活性。交易市场遵循着固有规律,即不可能让所有人都实现盈利,这就决定了交易策略必然具有私有属性。

从事量化交易,首先要掌握数据分析与数据获取的能力,同时需要借助工具来辅助完成量化分析和交易操作。实际上,专业量化机构所开展的工作核心也在于此。

数据是量化交易的基础,是程序运行的输入来源,因此获取数据是首要任务 。在拥有数据之后,就要进行策略的构建、验证,并将其应用到实际交易当中。

概括来说,进行程序化交易,行情数据的接入以及交易接口是不可或缺的要素。策略的可靠性并非取决于外部因素,而是源于自身的研究。

在策略研究和分析方面,如果缺乏计算机的辅助,仅依靠人眼每天浏览 3000 只股票,很难在脑海中形成对市场的准确认知,甚至极有可能因个人偏好和固有认知而产生错误判断。毕竟,人脑在处理海量数据时的学习效率远不及计算机。所以,掌握一些简单的编程技能是十分必要的。

在股票数据获取方面,虽然获取股票数据并非难事,但确保数据的准确度和实时性却颇具挑战。获取股票历史数据时,通常可以从普通财经网站抓取,这些网站一般都会开放 K 线数据。然而,对于日内交易而言,K 线回归数据的粒度较粗,无法满足对某一日内交易明细的需求,比如开盘后的走势、午盘后的走势等细节信息难以获取。所以,若要从事量化交易,从当下开始积累数据至关重要,因为每一份数据都具有不可重复性。

在进行回归回测时,历史数据的质量起着关键作用,level2 数据是较为理想的选择,它能做到事无巨细地记录各类信息,便于后续根据需求决定模型回测的粒度。交易本质上是逐笔进行的,市场中的每一次撮合交易都会留下记录。level2 行情数据提供了最为详尽的交易信息,相比于 level1 每隔几秒的快照报价,更适合用于量化投资分析。

level2行情接入示例

#!python3
# -*- coding:utf-8 -*-
import time
import websocket
import zlib


# 发送订阅
def on_open(ws):
    ws.send("all=lv2_600519,lv1_000001")


# 接收推送
def on_message(ws, message, type, flag):
    # 命令返回文本消息
    if type == websocket.ABNF.OPCODE_TEXT:
        print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Text响应:", message)
    # 行情推送压缩二进制消息,在此解压缩
    if type == websocket.ABNF.OPCODE_BINARY:
        rb = zlib.decompress(message, -zlib.MAX_WBITS)
        print(time.strftime('%H:%M:%S', time.localtime(time.time())), "Binary响应:", rb.decode("utf-8"))


def on_error(ws, error):
    print(error)


def on_close(ws, code, msg):
    print(time.strftime('%H:%M:%S', time.localtime(time.time())), "连接已断开")


wsUrl = "ws://<服务器地址>/?token=<jvQuant token>"
ws = websocket.WebSocketApp(wsUrl,
                            on_open=on_open,
                            on_data=on_message,
                            on_error=on_error,
                            on_close=on_close)
ws.run_forever()

参考链接:level2行情接口 Python 示例

### Python接口自动化测试中的日志打印 在Python接口自动化测试中,`logging`模块是个非常重要的工具,用于记录程序执行过程中的各种信息。通过合理配置日志级别、输出格式以及目标位置,可以有效提升调试效率并便于后续分析。 以下是基于引用内容和专业知识构建的个完整的日志打印示例: #### 日志配置与使用 为了实现灵活的日志管理,在实际项目中通常会先定义个全局的日志配置函数[^4]。下面展示了个典型的日志初始化代码片段: ```python import logging def setup_logging(): # 创建logger对象 logger = logging.getLogger('interface_test_logger') logger.setLevel(logging.DEBUG) # 设置最低日志等级 # 定义控制台处理器ConsoleHandler,并设置其日志等级 ch = logging.StreamHandler() ch.setLevel(logging.INFO) # 定义文件处理器FileHandler,并设置其日志等级 fh = logging.FileHandler('test.log', encoding='utf-8') fh.setLevel(logging.DEBUG) # 定义日志格式formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') # 将formatter绑定到handler上 ch.setFormatter(formatter) fh.setFormatter(formatter) # 将handler添加至logger logger.addHandler(ch) logger.addHandler(fh) return logger # 初始化日志器 logger = setup_logging() # 测试用例中调用日志功能 def test_login_success(): try: from demo_api import DemoApi api_client = DemoApi(base_url="https://example.com/api") response = api_client.login(username="admin", password="123456") if response['status'] == 'success': logger.info("登录成功!") else: logger.error("登录失败! 错误信息: %s" % response.get('error_message')) assert response['status'] == 'success' except Exception as e: logger.exception("发生异常: ") ``` 上述代码实现了以下几点: 1. **多渠道输出**:既将日志写入文件又显示在控制台上。 2. **分级处理**:不同级别的消息分别发送给不同的处理器(如错误只记入文件而般信息则同时显示于屏幕)。 3. **结构化信息**:每条日志都包含了时间戳、名称、严重程度及具体内容等字段。 #### 参数化测试结合日志 当采用参数化方式批量验证多个API端点时,同样可以通过日志来跟踪每个请求的状态变化情况[^2]: ```python import pytest from requests import get @pytest.mark.parametrize("endpoint", ['/users', '/posts', '/comments']) def test_endpoints(endpoint): url = f"https://api.example.com{endpoint}" logger.info(f"正在访问URL地址: {url}") response = get(url) status_code = response.status_code if status_code != 200: logger.error(f"{endpoint} 访问失败, HTTP状态码为 {status_code}. 响应体如下:\n{response.text}") assert status_code == 200, f"{endpoint} failed with status {status_code}" if __name__ == "__main__": pytest.main(['-vs', '--log-cli-level=INFO']) ``` 此脚本利用PyTest框架内置的支持机制简化了命令行参数传递流程,使得开发者能够轻松调整运行期间所期望看到的日志详细度。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值