Tutorial on Running TQuant Lab in Google Colab and Common Errors

Summary of Key Points in This Article

  • Article Difficulty: ★☆☆☆☆
  • Tutorial on Running TQuant Lab in Google Colab
  • Simple Test: Select the top five companies by revenue (from any industry) and backtest their returns
  • Install fonts to ensure the Pyfolio package can plot graphs smoothly

Introduction

For students who want to use TQuant Lab, in addition to the original GitHub installation tutorial, we now offer a faster and simpler way to use it directly on Google Colab. The tutorial on running TQuant Lab in Google Colab eliminates the need to set up a virtual environment, significantly lowering the barrier to entry.

Running TQuant Lab in Google Colab and Installing some Commonly used Package

You only need one simple lines of code to complete the environment setup.

              !pip install zipline-tej

If you encounter a pop-up window showing an error, simply click “Restart Runtime” to resolve it.

Running TQuant Lab in Google Colab

In the end, you may see the following error message, but you can ignore it. The system is actually ready for use.

ERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
cudf-cu12 24.4.1 requires pandas<2.2.2dev0,>=2.0, but you have pandas 1.5.3 which is incompatible.
google-colab 1.0.0 requires pandas==2.0.3, but you have pandas 1.5.3 which is incompatible.

TQuant Lab Tutorial: Selecting the Top Five Semiconductor Companies by Revenue for Backtesting

Load Commonly Used Packages

import os 
os.environ['TEJAPI_BASE'] = 'https://api.tej.com.tw'
os.environ['TEJAPI_KEY'] = 'Your_Key'

import datetime

import tejapi
import pandas as pd 
import numpy as np

First, identify all companies in the semiconductor

from zipline.sources.TEJ_Api_Data import get_universe

pool = get_universe(start = '2022-07-02', 
                    end = '2023-07-02',
                    mkt_bd_e = 'TSE',  
                    stktp_e = 'Common Stock',  
                    sub_ind_e=['M2324 Semiconductor', 'M2325 Computer and Peripheral Equipment'])

Check their revenue and select the top five highest, then save their stock symbols.

import TejToolAPI

start_time = pd.Timestamp('2022-07-02')
end_time = pd.Timestamp('2023-07-02')

data = TejToolAPI.get_history_data(start = start_time,
                                   end = end_time,
                                   ticker = pool,
                                   fin_type = 'A',
                                   columns = ['營業總收入'],
                                   transfer_to_chinese = True)

data  = data.drop_duplicates(subset=['股票代碼'], keep='last').reset_index(drop=True)

data = data.nlargest(5, '營業總收入_A')    #select the top five highest

data
stockdateTotal_Operating_Income_A
623302023-06-30508632973.0
9049382023-06-30318136546.0
2723822023-06-30266180950.0
6732312023-06-30212000207.0
423242023-06-30209458784.0
tickers = data['股票代碼'].unique()

Load the data onto your local computer.

start = '2023-07-03'
end = '2024-07-02'

os.environ['mdate'] = start + ' ' + end
os.environ['ticker'] = ' '.join(tickers) + ' ' + 'IR0001'

!zipline ingest -b tquant

from zipline.data import bundles
bundle_data = bundles.load('tquant')

from zipline.api import *
from zipline.finance import commission, slippage

def initialize(context):
    context.day = 0
    context.tickers = tickers
    set_slippage(slippage.VolumeShareSlippage(volume_limit = 0.025, price_impact = 0.1))
    set_commission(commission.Custom_TW_Commission(min_trade_cost = 20, discount = 1.0, tax = 0.003))
    set_benchmark(symbol('IR0001'))
    set_liquidity_risk_management_rule(['全額交割股票(Full-Cash Delivery Securities)', '漲停股票(Limit Up)', '跌停股票(Limit Down)', '開盤即鎖死(Limited Whole Day)'])

def handle_data(context, data):

    if context.day == 0:
        for ticker in context.tickers:
            order_percent(symbol(ticker), 1 / len(tickers))

    context.day += 1

import matplotlib.pyplot as plt

capital_base = 1e6 

def analyze(context, results):

    fig = plt.figure()
    ax1 = fig.add_subplot(111)
    results['benchmark_cum'] = results.benchmark_return.add(1).cumprod() * capital_base
    results[['portfolio_value', 'benchmark_cum']].plot(ax = ax1, label = 'Portfolio Value($)')
    ax1.set_ylabel('Portfolio value (TWD)')

    plt.legend(loc = 'upper left')

    plt.gcf().set_size_inches(18, 8)
    plt.grid()
    plt.show()

from zipline import run_algorithm

start_date = pd.Timestamp('20230703', tz = 'utc')
end_date = pd.Timestamp('20240702', tz = 'utc')

results = run_algorithm(
    start = start_date,
    end = end_date,
    initialize = initialize,
    handle_data = handle_data,
    analyze = analyze,
    bundle = 'tquant',
    capital_base = capital_base,
)

results
Running TQuant Lab in Google Colab

Font Issues Encountered with Pyfolio and How to Resolve Them

from pyfolio.utils import extract_rets_pos_txn_from_zipline
import pyfolio as pf

returns, positions, transactions = extract_rets_pos_txn_from_zipline(results) 
benchmark_rets = results.benchmark_return 

from pyfolio.plotting import plot_rolling_sharpe

plot_rolling_sharpe(returns, factor_returns=benchmark_rets)
WARNING:matplotlib.font_manager:findfont: Generic family 'sans-serif' not found because none of the following families were found: Microsoft JhengHei
WARNING:matplotlib.font_manager:findfont: Generic family 'sans-serif' not found because none of the following families were found: Microsoft JhengHei
WARNING:matplotlib.font_manager:findfont: Generic family 'sans-serif' not found because none of the following families were found: Microsoft JhengHei
WARNING:matplotlib.font_manager:findfont: Generic family 'sans-serif' not found because none of the following families were found: Microsoft JhengHei
WARNING:matplotlib.font_manager:findfont: Generic family 'sans-serif' not found because none of the following families were found: Microsoft JhengHei
Running TQuant Lab in Google Colab

Even though the charts have been successfully plotted, you may still encounter warnings about missing fonts. To resolve this issue, you can manually load the fonts.

import matplotlib
import matplotlib.font_manager as fm
!wget -O MicrosoftJhengHei.ttf https://github.com/a7532ariel/ms-web/raw/master/Microsoft-JhengHei.ttf
!wget -O ArialUnicodeMS.ttf https://github.com/texttechnologylab/DHd2019BoA/raw/master/fonts/Arial%20Unicode%20MS.TTF
 
fm.fontManager.addfont('MicrosoftJhengHei.ttf')
matplotlib.rc('font', family='Microsoft Jheng Hei')
 
fm.fontManager.addfont('ArialUnicodeMS.ttf')
matplotlib.rc('font', family='Arial Unicode MS')

After trying again, the warning messages should no longer appear.

plot_rolling_sharpe(returns, factor_returns=benchmark_rets)
Running TQuant Lab in Google Colab

Conclusion

This introduction’s testing section mostly references the code from the article “TQuant Lab Warren E. Buffett’s Business Investment Rules.” You can refer to the original extended reading content if you have any questions.

Additionally, this introduction allows everyone to use TQuant without needing extra virtual environment installations and extensive settings. It’s much more convenient to get started right away and follow this recommended approach.

【TQuant Lab Backtesting System】Solving Your Quantitative Finance Challenges

Providing Comprehensive Tools for Trading Backtesting

Source Code

Extended Reading

Relevant Links

Back
Procesing