TQuant Lab 新手上路

TQuant Lab 提供强大的量化回测系统,高精确度的绩效风险计算、高品质的资料来源、高拟真度的交易环境模拟,帮助使用者快速部属各样的交易策略,欢迎各位点击进入文章了解更多资讯。
Photo by Talha Hassan on Unsplash

本文重点概要

  • 文章难度:★☆☆☆☆
  • TQuant Lab 回测平台介绍。
  • TQuant Lab 使用方法演示。

前言

TQuant Lab 为 TEJ 以知名 Zipline 为底层所延伸开发之回测平台。TQuant Lab 所有证券相关资讯皆来自 TEJ 独家提供的资料库,保障使用资料的高质量;此外,由于以 Zipline 为基底开发,程式架构已经过多年第三方验证,确保程式上的正确性;第三,TQuant Lab 针对不同交易限制与成本皆有参数可供调整,方便使用者打造最拟真的交易环境。若有兴趣者,欢迎与我们联繫以获得更多资讯。

模组安装

TQuant Lab 提供 Windows, Mac OS 与 Google Colab 三种作业系统或环境的安装。安装模组前请务必预先安装 Anaconda,Anaconda 安装教学可以参考 Anaconda介绍及安装教学

YML 安装

请预先下载下列安装包:

开启 Anaconda prompt 并且输入以下程式码,建立虚拟环境并安装所需模组。

Window 使用者
# 将下载好的 zipline-tej.yml 档案放在以下路径中
$ cd <C:\Users\username\Downloads>
# 创建虚拟环境
$ conda env create -f zipline-tej.yml
# 开启虚拟环境
$ conda activate zipline-tej

Mac 使用者
# 将下载好的 zipline-tej.yml 档案放在以下路径中
$ cd <C:\Users\username\Downloads>
# 创建虚拟环境
$ conda env create -f zipline-tej_mac.yml
# 开启虚拟环境
$ conda activate zipline-tej

手动安装

若您对于 Python 相当孰悉,也可以手动创建虚拟环境,并逐一安装所需的依赖包。

# create virtual env
$ conda create -n <env_name> python=3.8

# activate virtual env
$ conda activate <env_name>

# download dependency packages
$ conda install -c conda-forge -y ta-lib
$ conda install -y notebook=6.4.11
$ conda install -c conda-forge nb_conda_kernels
$ conda install -y xlrd=2.0.1
$ conda install -y openpyxl=3.0.9
$ pip install zipline-tej

Google Colab 安装

由于 TQuant Lab 目前仅支持 Python 3.8 版本,因此先透过下方程式码新增 Python 3.8 的执行阶段。

!wget -O mini.sh https://repo.anaconda.com/miniconda/Miniconda3-py38_4.8.2-Linux-x86_64.sh
!chmod +x mini.sh
!bash ./mini.sh -b -f -p /usr/local
!conda install -q -y jupyter
!conda install -q -y google-colab -c conda-forge
!python -m ipykernel install --name "Python3.8" --user
!rm mini.sh
!pip install pandas==1.2.5

接着选择列表中的 执行阶段 >> 变更执行阶段类型 >> 执行阶段类型 中选择 Python 3.8 >> 点击 储存。并执行以下程式码,下载 zipline-tej,若出现 yfinance 与 pandas 版本问题请无视。

!conda install -y ta-lib -c conda-forge
!pip install zipline-tej

注意,我们需要先下载 TA-lib,这样我们才能成功下载 zipline-tej

交易日曆问题

由于 TQuant Lab 使用 TEJ 所提供的台湾证券交易资料,所以我们需要使用专属于台股的交易日曆,以便于后续回测使用。下方提供了可供下载的交易日曆文件,需要将这些文件放置在指定的 exchange_calendars 文件夹中。 download

在下载了上面提到的交易日曆文件后将 exchange_calendar_tejxtai.py 複製,并将该档案添加到 exchange_calendars 文件夹中的 calendar_utils.py 中。

导航至 site packages 中的 exchange_calendars 文件夹。通常它位于以下路径:

Window 使用者

**C:\Users\username\Anaconda3\envs\zipline-tej\Lib\site-packages\exchange_calendars**

Mac 使用者

*C:\Users\username\Anaconda3\envs\zipline-tej\Lib\python3.8\site-packages\exchange_calendars*

完整安装教学请参考 Install TQuant Lab

价量资料导入

TQuant Lab 从 TEJ 建置之资料库抓取价量资料,且以资料包 (bundle) 形式将资料存储于 RAM 当中。我们可以透过设定环境变数决定需导入资产以及时间区间。可设定环境变数有:

  • os.environ[“TEJAPI_BASE”]: 连结 TEJ 资料库域名。
  • os.environ[“TEJAPI_KEY”]: 识别使用者。
  • os.environ[“ticker”]: 所欲抓取资产。
  • os.environ[“mdate”]: 所欲抓取时间区间。

设置完环境变数后,使用 !zipline ingest -b tquant 将资料导入本地端的资料包,并且将资料包命名为 tquant。

import os
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt

os.environ['TEJAPI_BASE'] = "https://api.tej.com.tw"
os.environ['TEJAPI_KEY'] = "YOUR KEY"
os.environ['ticker'] = "IR0001 2330 2337 0050 2545"
os.environ['mdate'] = "20200821 20230821"

!zipline ingest -b tquant

载入资料后,我们可以透过以下程式码检视所载入资料。

from zipline.data.data_portal import get_bundle
data_bundle = get_bundle(
    bundle_name = 'tquant',
    calendar_name = 'TEJ',
    start_dt = pd.Timestamp("2020-08-21", tz = 'utc'),
    end_dt = pd.Timestamp("2023-08-21", tz = 'utc')
)
data_bundle.head(10)
资料包 (bundle) 表格呈现

策略回测

于此例,我们以买入持有台积电投资策略为范例,使用 TQuant Lab 建立策略并回测,首先引入所需模组。

from zipline.api import set_slippage, set_commission
from zipline.finance import slippage, commission
from zipline.api import order, record, symbol
from zipline import run_algorithm

Initialize 函式

initialize 为构建交易策略的重要函式,会在回测开始前被呼叫一次,主要任务为设定回测环境,常见用于设定滑价或手续费。分别可以使用:

  1. zipline.api.set_slippage:
    设定滑价模式,TQuant Lab 共提供四种滑价计算方法,详请请见 – zipline slippage
  2. zipline.api.set_commission:
    设定手续费模式,TQuant Lab 共提供三种手续费计算方法,详请请见 – zipline commission

常见的写法如下:

def initialize(context):
    set_slippage(slippage.FixedSlippage())
    set_commission(commission.PerShare(cost=0.00285))

除此之外,我们可以注意到 initialize 含有一个参数 context,context 为一个命名空间 (namespace),可以在储存各种自定义之变数并且在每次交易日中循环呼叫。举例来说,我们设置一个变数 (context.day = 0) 来计算交易日天数与一个变数 (context.has_ordered = False) 纪录是否已经持有台积电股票。

def initialize(context):
    context.day = 0
    context.has_ordered = False
    set_slippage(slippage.FixedSlippage())
    set_commission(commission.PerShare(cost=0.00285))

Handle_data 函式

handle_data 为构建交易策略的重要函式,会在回测开始后每天被呼叫,主要任务为设定交易策略、下单与纪录交易资讯。

其中 handle_data 含有两种参数 — context , data。 context 与上述 initialize 介绍功能相同,这里为了记录交易天数与否持有台积电股票,我们设定为:

def handle_data(context, data):

    # 每次交易日加 1 天。
    context.day += 1 

    # 判别是否持有台积电,请注意我们在 initialize 设定 context.has_ordered 为 False。
    if not context.has_ordered:

接着我们引入交易下单函式,下单函式共有六个不同种类,请见 Zipline Order (order & order_target)Zipline Order (percent & target_percent)Zipline Order (value & target_value),这里使用最基础的下单函式:

zipline.api.order

买进或卖出 n 股的资产标的。

Parameters:

  • asset: zipline.assets.Asset 
    欲下单之资产,请注意资料型态为 zipline 独有的 Asset 型态。
  • amount: int 
    欲下单股数。
  • limit_price: float, optional
    限价。
  • stop_price: float, optional
    停价。

加入下单函式 order(symbol(“2330”),其中 symbol(“2330”) 就是 zipline 中的 Asset 资料型态。之后,我们会将 context.has_ordered 调整成 True,此时下个交易日就不会再度下单,更改完程式如下:

def handle_data(context, data):

    context.day += 1 
    if not context.has_ordered:

        # 下单台积电股票一张 == 1000股
        order(symbol("2330", 1000)

        # 设定 context.has_ordered 为 True 以避免下次交易日下单
        context.has_ordered = True

最后为了记录交易天数、是否持有部位与当日价格,我们使用 record 函式,其功能为记录每个交易日的资讯并且在最终 run_algorithm 输出的资料表中,以栏位型式加入所纪录资讯。其程式编辑方式如下:

record(栏位名称 = 资讯)

这里我们纪录当天交易天数 (context.day)、是否持有部位 (context.has_ordered) 与当天收盘价格 (data.current(symbol(“2330”), “close”)) ,其中上面所提到的 data 就是在 handle_data 中的 data, data 主要功能为保存每天股价的价量资料并且提供呼叫,于本实例我们欲纪录当天收盘价,于是用到 data.current() 函式。

zipline.data.current

呼叫股票的当日价量资讯。

Parameters:

  • assets: zipline.asset.Asset 
    所欲呼叫的股票,请注意资料型态为 zipline 独有的 Asset 型态。
  • fields: str 
    所欲呼叫的价量资讯,提供 ‘close’, ‘open’, ‘high’, ‘low’ 与 ‘volume’。

由于我们希望记录台积电当日收盘价格,因此程式编辑如下:

def handle_data(context, data):
    context.day += 1 
    if not context.has_ordered:
        order(symbol("2330", 1000)
        context.has_ordered = True

    record(
        trade_days = context.day,
        has_ordered = context.has_ordered,
        TSMC = data.current(symbol("2330"), "close")
    )

Analyze 函式

analyze 主要用于回测后视觉化策略绩效与风险,这里我们以 matplotlib 绘製投组价值表与台积电股价走势表。其中 analyze 有两个参数 context 与 perf,context 就与上述相同,perf 就是最终 run_algorithm 输出的资料表 — results。我们可以提取里面特定栏位来绘製图表。此例我们汇出投资组合价值与台积电收盘价的变化图。

import matplotlib.pyplot as plt
def analyze(context, perf):
    ax1 = plt.subplot(211)
    perf.portfolio_value.plot(ax=ax1,title='portfolio values')
    ax2 = plt.subplot(212, sharex=ax1)
    perf['TSMC'].plot(ax=ax2,title='TSMC close')
    plt.gcf().set_size_inches(18, 8)
    plt.show()

Run_algorithm 函式

使用上述函式进行回测,该函式会输出 pd.DataFrame 此资料表含有投资组合的绩效与风险表现。其输入参数为:

  • start: pd.Timestamp or datetime 
    回测起始日期。
  • end: pd.Timestamp or datetime 
    回测结束日期。
  • initialize: callable 呼叫 initialize
    函式以用于回测。
  • capital_base: int 
    初始资金额度。
  • handle_data: callable, optional 呼叫 handle_data
    函式以用于回测。
  • before_trading_start: callable, optional
    呼叫 before_trading_start 函式以用于回测。
  • analyze: callable, optional
    呼叫 analyze 函式以用于回测。
  • data_frequency: {“daily”, “minute”}, optional
    设置交易频率。
  • bundle: str, optional
    设置回测用的 bundle。
  • trading_calendar: TradingCalendar, optional
    设置交易日曆。
  • benchmark_returns: pd.Series, optional
    设置指标报酬率。
  • treasury_returns: pd.Series, optional
    设置无风险利率。

更详细的资讯,请见 TSMC buy and hold strategy

start_date = pd.Timestamp('2020-08-21',tz='utc')
end_date = pd.Timestamp('2023-08-21',tz='utc')

results = run_algorithm(start= start_date,  
                       end=end_date,
                       initialize=initialize,                       
                       capital_base=1e6,                       
                       analyze=analyze,
                       handle_data=handle_data,
                       data_frequency='daily',
                       bundle='tquant'
                       )
analyze 函式汇出图表
绩效与风险表格

结论

本文主要目的为让使用者了解 TQuant Lab 的使用方法,TQuant Lab 为本公司推出的量化回测平台,相较于使用者自行建立的回测平台,TQuant Lab 提供高正确率的价量资料、高准确率的绩效风险计算、高拟真度的交易环境模拟。未来我们会提供更多部属于 TQuant Lab 之交易策略文章,请持续关注并多多支持。

原始码

延伸阅读

相关连结

返回总览页