2. 財務データの取得と管理

qteasy は、完全にローカルに展開され、実行される定量的取引分析ツールキットであり、次の機能があります。

  • 財務データの取得、クリーニング、保管、処理、可視化、および使用

  • 多数の基本的なトレーディング戦略が組み込まれているクオンツトレーディング戦略の作成

  • 取引戦略のベクトル化された高速バックテストと取引結果の評価

  • 取引戦略パラメーターの最適化と評価

  • 取引戦略の展開とライブ取引

このチュートリアル シリーズでは、qteasy の主な機能とその使用方法を、一連の実践例を通じて徹底的に理解できます。

2.1. 始める前の準備

このチュートリアルを開始する前に、次のことを完了してください。

  • qteasyのインストールを完了し、最新バージョンにアップグレードしてください

  • 数据通道(二选一或组合)

    • 使用 Tushare:注册tushare pro账户并确保有一定的积分(大多数高级数据需要较多积分才能下载),在qteasy.cfg中配置tushare_token

    • 使用 AKShare 或其他通道:安装 pip install akshare(若选 AKShare),无需 Tushare token;部分表覆盖范围小于 Tushare,详见数据通道文档

  • 完成mysql数据库的配置,并将数据库配置写入qteasy.cfg可选项

  • ta-lib のインストールを完了します (オプション)

前のチュートリアル では、新しい仮想環境を作成し、そこに qteasy をインストールして初期化する方法を説明しました。このステップをまだ完了していない場合は、前のチュートリアルを参照して、qteasy のインストールと基本構成を完了してください。

また、後からチャートなどの機能を使いやすくするため、開発にはjupyter notebookを使用することをお勧めします。新しく作成した仮想環境で次のコマンドを実行して、jupyter notebook をインストールできます。

(bash): pip install notebook

インストールが完了したら、次のコマンドを使用して jupyter notebook を起動できます。

(bash): jupyter notebook

起動後は、次の図に示すように、ブラウザーの対話型開発環境でコードを実行できます。

ここに画像の説明を挿入

jupyter notebook を使用しない場合は、ipython も使用できます。

(bash): pip install ipython

ipython はターミナル内で実行されますが、チャートのサポートはそれほど良くありません。

2.2. 基本データと価格データの取得

前のチュートリアルで紹介したように、新しく初期化された qteasy は履歴データにアクセスできません。履歴データの取得、戦略のバックテストや最適化など、後続のデータ依存の作業を実行するには、まずすべての履歴データをローカルにダウンロードし、Datasource というデータ リポジトリに保存する必要があります。

qteasy は多くの種類のデータを使用する必要があります。すべてのデータはいくつかの事前定義されたデータ テーブルに保存され、Datasource は一連のデータ テーブルのコレクションです。最も基本的なデータ テーブルには次のものがあります。

  • trade_calendar - さまざまな取引所の予定された市場開始日と終了日を含む取引カレンダー データ。翌年の取引カレンダーは毎年末に更新されます。

  • stock_basics - 基本的な株式情報。コード、名前、フルネーム、上場日、カテゴリなど、上海および深センの株式市場のすべての株式の基本情報が含まれます。

  • index_basics - コード、名前、フルネームなど、上海および深セン株式市場のすべての指数の基本情報を含む基本的な指数情報。

tushare_token を設定した後、初めて qteasy をインポートするときに、システムが取引カレンダー データを見つけることができない場合、取引カレンダーを読み取れないことを示すメッセージが表示されます。

DataSource データ ソース オブジェクトの詳細については、DataSource リファレンス を参照してください。

>>> import qteasy as qt

ヒント:

UserWarning: trade calendar is not loaded, some utility functions may not work properly, to download trade calendar, run 
"qt.refill_data_source(tables='trade_calendar')"

qteasy は、ローカルに保存されたデータに関する情報を表示する関数 get_table_overview() を提供します。この関数を実行すると、ローカルに保存されたデータ テーブル、保存されているデータの量、使用されているディスク領域、データ範囲などのリストが出力されます。

>>> qt.get_table_overview()

データ テーブルの分析プロセスには数分かかる場合があります。この間、分析の進行状況を示す進行状況バーが表示されます。分析が完了すると、ローカル データ ソース内のテーブルのリストが、各テーブルのデータ範囲などの情報とともに表示されます。

現在のデータ ソースにデータがない場合は、次が出力されます。

Analyzing local data source tables... depending on size of tables, it may take a few minutes
Analyzing completed!
Analyzing tables: 100%|█████████████████████████| 104/104 [00:00<00:00, 9107.58it/s]

Finished analyzing datasource: 
file://csv@qt_root/data/
0 table(s) out of 104 contain local data as summary below, to view complete list, print returned DataFrame
===============================tables with local data===============================
Empty DataFrame
Columns: [has_data, size, records, min2, max2]
Index: []

ローカルデータソースにデータがない場合は、上記の内容が表示されます。この場合、データをローカル データ ソースにダウンロードする必要があります。

取引カレンダーと基礎データをダウンロード

我们可以调用refill_data_source函数下载交易日历和基础数据。这个函数是qteasy的标准数据下载接口函数,所有的历史数据类型均可以通过此接口下载。这个函数的基本参数是tables,传入数据表的名称即可下载相应的数据到本地存储了。使用refill_data_source下载交易数据时,qteasy会自动进行数据清洗,排除重复数据,去除错误数据,发生错误自动重试,并将下载的数据合并到本地数据表中。

qteasy支持通过 tushareakshareeastmoneysina 等多个内置通道下载数据(参数 channel,未指定时默认为 tushare)。不同通道支持的表范围与前置条件不同,切换方式与能力对照见数据通道文档

要下载前面提到的交易日历、股票和指数的基本信息,只需要运行下面的代码(默认使用 Tushare,需已配置 tushare_token):

>>> qt.refill_data_source(tables='trade_calendar, stock_basic, index_basic')

データのダウンロード プロセス中、ダウンロードの進行状況を示すプログレス バーが表示されます。

出力は次のとおりです。

Filling data source file://csv@qt_root/data/ ...
into 3 table(s) (parallely): {'trade_calendar', 'index_basic', 'stock_basic'}
<trade_calendar> 72609 wrn: 100%|███████████████| 8/8 [00:03<00:00,  2.39task/s]
<index_basic> 12456 wrn: 100%|██████████████████| 8/8 [00:00<00:00,  9.68task/s]
<stock_basic> 5484 wrn: 100%|███████████████████| 4/4 [00:00<00:00,  5.45task/s]

Data refill completed! 90549 rows written into 3/3 table(s)!

ダウンロードが完了したら、qt.get_table_overview() 関数を再度実行します。

>>> qt.get_table_overview()

データがローカルに正常にダウンロードされたことがわかります。

Analyzing local data source tables... depending on size of tables, it may take a few minutes
Analyzing tables: 100%|████████████████████████| 104/104 [00:00<00:00, 967.60it/s]
Analyzing completed!

Finished analyzing datasource: 
file://fth@qt_root/data/
3 table(s) out of 104 contain local data as summary below, to view complete list, print returned DataFrame
===============================tables with local data===============================
               Has_data Size_on_disk Record_count Record_start Record_end
table                                                                    
trade_calendar   True       1.3MB         73K         CFFEX       SZSE   
stock_basic      True       651KB          5K          None       None   
index_basic      True       1.1MB         12K          None       None   

ご覧のとおり、3 つのデータ テーブルはすでにローカル データ ソースにダウンロードされています。データ ソース タイプは "file://csv@qt_root/data/" です (つまり、データは qt ルート ディレクトリの /data/ パスの下に csv ファイルとして保存されます)。これには 3 つのデータ テーブルが含まれており、取引カレンダーの範囲は 2024 年末までカバーされます。

株式や指数の基本データをご覧いただけます

上記の基本データをダウンロードした後、IDE を再起動し、qteasy を再インポートすることをお勧めします。この時点で、qteasy を使用して株式/指数をフィルタリングして検索できます。

詳細な株価/指数情報を検索するには、get_stock_info() または get_basic_info() 関数を使用できます。 2 つの関数は同じ機能を持ちます。どちらも、入力されたセキュリティ コード、名前、またはキーワードに基づいてセキュリティ情報を検索でき、ワイルドカードまたはあいまい検索をサポートします。同じコードが異なる qt_code に対応する場合、たとえば、株式 000001qt_code: 000001.SZ で平安銀行を表し、インデックス 000001 は SSE 総合指数を表し、qt_code: 000001.SZqteasy はすべてのセキュリティ情報をリストします。

# 通过完整的qt_code获取信息
>>> qt.get_basic_info('000001.SZ')

出力は次のとおりです。

found 1 matches, matched codes are {'E': {'000001.SZ': '平安银行'}, 'count': 1}
More information for asset type E:
------------------------------------------
ts_code       000001.SZ
name               平安银行
area                 深圳
industry             银行
fullname     平安银行股份有限公司
list_status           L
list_date    1991-04-03
-------------------------------------------

以下の図にさらに多くの出力が表示されます。

ここに画像の説明を挿入

上の例では、システムは株式タイプと指数タイプの証券のみを検出しました。ファンドや先物などのさらに多くの証券情報も検索する必要がある場合は、同じ方法でさらに基本的なデータ テーブルをダウンロードできます。

  • fund_basic: 基本的なファンドデータ

  • future_basic: 基本的な先物データ

株式や有価証券に関する基本情報を検索することに加えて、qt.filter_stock() 関数を使用して株式をスクリーニングすることもできます。

>>> qt.filter_stocks(date='20240212', industry='银行', area='上海')

出力は次のとおりです。

           name area industry market  list_date exchange
qt_code                                                 
600000.SH  浦发银行   上海       银行     主板 1999-11-10      SSE
601229.SH  上海银行   上海       银行     主板 2016-11-16      SSE
601328.SH  交通银行   上海       银行     主板 2007-05-15      SSE
601825.SH  沪农商行   上海       银行     主板 2021-08-19      SSE

上海上場株式データのダウンロード

財務データの中で最も重要なデータは間違いなく価格と出来高のデータです。次に、過去の価格データをダウンロードします。

qteasy のすべての履歴データは、ローソク足 (K ライン) データの形式でデータ テーブルに保存されます。現在サポートされているローソク足データには次のものが含まれます。

  • 分足ローソク足チャート - 1分/5分/15分/30分/60分ローソク足チャート

  • 日次ローソク足チャート

  • 週間ローソク足チャート

  • 月次ローソク足チャート

qt.refill_data_source() 関数を使用して株式データをダウンロードすることもできます。最も一般的に使用される毎日の株式ローソク足 (K ライン) データは、stock_daily テーブルに保存されます。ただし、データ量が大きいため、ダウンロードする際はデータ範囲を制限することをお勧めします。 start_date/end_date パラメータを使用して開始日と終了日を指定し、履歴データをバッチでダウンロードします。そうしないと、ダウンロード プロセスに非常に時間がかかります。

>>> qt.refill_data_source(tables='stock_daily', start_date='20230101', end_date='20231231')

上記のコードは、2023 年全体のすべての上場株式の日次ローソク足 (K ライン) データをダウンロードします。同様に、以下のコードを使用して、一般的に使用される指数 (SSE 複合指数と CSI 300 指数) の日次ローソク足 (K ライン) データをダウンロードできます。

>>> qt.refill_data_source(tables='index_daily', symbols='000001, 000300', start_date='20231231', end_date='20240208')

ローカルストレージから株価データを取得する

株価データをローカルに保存すると、いつでも抽出して使用できます。

qt.get_history_data() 関数を使用して、株価と出来高のデータを取得できます。この関数はqteasyの汎用インターフェースであり、さまざまな種類のデータを取得するために使用できます。関数の引数にデータ型 (データ型 ID を介して)、株価表示、およびその他のパラメーターを指定することにより、対応するデータを取得できます。ダウンロードしたローソク足 (K ライン) 価格を取得したい場合は、データ タイプを "open, high, low, close, vol" に設定して、始値、高値、安値、終値、および取引量を取得します。

>>> qt.get_history_data(
...         'open, high, low, close, vol',  # 数据类型,分别为开盘价、最高价、最低价、收盘价、成交量
...         shares='000001.SZ',   # 股票代码:平安银行
...         start='20230101',   # 数据开始日期
...         end='20230301',  # 数据结束日期
... )

結果は次のとおりです。

{'000001.SZ':
              open   high    low  close         vol
 2023-01-04  13.71  14.42  13.63  14.32  2189682.53
 2023-01-05  14.40  14.74  14.37  14.48  1665425.18
 2023-01-06  14.50  14.72  14.48  14.62  1195744.71
 2023-01-09  14.75  14.88  14.52  14.80  1057659.11
 2023-01-10  14.76  14.89  14.39  14.44  1269423.39
 2023-01-11  14.45  14.78  14.39  14.67   830566.12
 2023-01-12  14.77  14.77  14.53  14.67   625694.84
 2023-01-13  14.67  14.95  14.55  14.95   949085.83
 2023-01-16  14.95  15.28  14.85  15.08  1560039.89
 2023-01-17  15.13  15.18  14.77  14.97   935834.54
 2023-01-18  14.95  15.18  14.91  15.11   718434.03
 2023-01-19  15.13  15.25  14.87  15.09   641875.20
 2023-01-20  15.16  15.24  15.00  15.13   608590.08
 2023-01-30  15.60  15.74  14.89  15.15  1374317.50
 2023-01-31  15.24  15.51  14.96  14.99  1030497.84
 2023-02-01  15.03  15.08  14.51  14.70  1653421.48}

上記の関数の出力は辞書です。そのキーは、shares パラメーターで指定されたすべての銘柄のティッカーであり、その値は、指定された期間の各銘柄の履歴データを含む DataFrame です。ここでは、データ タイプをローソク足 (K ライン) 価格と出来高のデータとして指定しました。もちろん、他のデータ型を指定することもできます。それらのデータがすでにローカルにダウンロードされている限り、直接読み取ることができます。

たとえば、データ型 htypes='pe, pb, total_mv' を指定すると、株価収益率、株価純資産倍率、時価総額などの 3 つの財務指標を取得できます。一部のインジケーターに欠損値がある場合は、欠損値を埋めるための fill メソッドを定義できます。データをリサンプリングして、日次データを週次または時間ごとのデータに変換することもできます。

get_history_data 関数のパラメーターの詳細については、qteasy ドキュメント を参照してください。

ローソク足チャートを生成する

出来高と価格のデータを使用する場合、より便利で読みやすい方法は、データをローソク足チャートとして表示することです。

qteasy は、プロフェッショナルなローソク足チャートを表示するための qt.candle() 関数を提供します。データがローカルにダウンロードされていれば、すぐにローソク足チャートを表示できます。

>>> qt.candle('600004.SH', start='20230101', end='20230301')

ここに画像の説明を挿入

調整係数データをローカル マシンにダウンロードした後、調整された価格を表示できます。

>>> qt.refill_data_source(tables='adj', start_date='20230101', end_date='20230601')
>>> qt.candle('600004.SH', start='20230101', end='20230301', adj='b')

ここに画像の説明を挿入

qt.candle() 関数は、開始日、終了日、ローソク足 (K ライン) 頻度、およびさまざまな範囲と頻度のローソク足チャートを表示するための調整方法の受け渡しをサポートしています。また、移動平均の期間とさまざまな MACD パラメーターを渡して、さまざまな移動平均を表示することもサポートされています。さらに、qt.candle() は株名によるローソク足チャートの表示をサポートします。入力が株名である場合、自動的にあいまい検索が実行され、ワイルドカードもサポートされます。

以下は、株式、ファンド、指数などのさまざまな資産クラスを示すローソク足チャートの例です。異なるデータ周波数。異なる移動平均設定。さまざまなチャートの種類。等々。以下の例でローソク足チャートを表示するには、対応するデータをダウンロードする必要があります。

>>> import qteasy as qt
>>> df = qt.candle('159601', start='20210420', freq='d')
>>> df = qt.candle('000001.SH', start = '20211221', asset_type='IDX', plot_type='c')
>>> df = qt.candle('000300.SH', start = '20220331', asset_type='IDX', mav=[], plot_type='c')
>>> df = qt.candle('000300.SH', start = '20221021', asset_type='IDX', mav=[], plot_type='c', 
>>>                freq='30min')
>>> df = qt.candle('601728', freq='30min', adj='b', plot_type='c')
>>> df = qt.candle('沪镍主力', start = '20211130', mav=[5, 12, 36])
>>> df = qt.candle('510300', start='20200101', asset_type='FD', adj='b', mav=[])
>>> df = qt.candle('格力电器', start='20220101', asset_type='E', adj='f', mav=[5, 10, 20, 30])
>>> df = qt.candle('513100', asset_type='FD', adj='f', mav=[])
>>> df = qt.candle('110025', asset_type='FD', adj='f', mav=[9, 28])
>>> df = qt.candle('001104', asset_type='FD', adj='f', mav=[12, 26])

png

png

png

png

png

png

png

png

png

png

png

2.3. データ型 DataType を調べる

前述したように、qteasy のすべてのデータ型は、直接使用できる一種の履歴データを表す DataType オブジェクトとしてカプセル化されます。それぞれの DataType には一意の ID があります。この ID を使用すると、データを抽出し、取引戦略でそのデータ タイプを参照し、qteasy で必要なタスクを実行できます。

qteasy のデータ型をより深く理解するには、qt.find_history_data() 関数を使用して必要なデータ型をクエリします。 qteasy で定義されたデータタイプは、データの頻度と資産タイプに関連付けられています。つまり、異なる資産の終値は異なるデータ型であり、異なる頻度での終値も異なるデータ型です。

qt.find_history_data() 関数は、入力に基づいて関連するデータ型を検索し、その ID、データテーブル、説明、その他の関連情報を表示できます。たとえば、‘close’ (終値) を検索すると、関連するすべてのデータ タイプが見つかります。

>>> qt.find_history_data('close')

次の出力が得られます。

matched following history data, 
use "qt.get_history_data()" to load these historical data by its data_id:
------------------------------------------------------------------------
          freq asset           table            desc
data_id                                             
close        d     E     stock_daily     股票日K线 - 收盘价
close        w     E    stock_weekly     股票周K线 - 收盘价
close        m     E   stock_monthly     股票月K线 - 收盘价
close     1min     E      stock_1min   股票60秒K线 - 收盘价
  ...      ...   ...           ...             ...
close        h    FD     fund_hourly    基金小时K线 - 收盘价
close        d   Any        top_list  融资融券交易明细 - 收盘价
========================================================================

別の例として、株価収益率 (pe) を検索すると、次の結果が得られます。

>>> qt.find_history_data('pe')

次の出力が得られます。

matched following history data, 
use "qt.get_history_data()" to load these historical data by its data_id:
------------------------------------------------------------------------
           freq asset             table                            desc
data_id                                                                
initial_pe    d     E         new_share                  新股上市信息 - 发行市盈率
pe            d   IDX   index_indicator                    指数技术指标 - 市盈率
pe            d     E   stock_indicator  股票技术指标 - 市盈率(总市值/净利润, 亏损的PE为空)
pe_2          d     E  stock_indicator2                  股票技术指标 - 动态市盈率
========================================================================

対応するデータを見つけたら、それがどのデータ テーブルに属しているかを確認し、そのテーブルをローカル データ ソース (refill_data_source(tables, ...)) にダウンロードするだけで、これらのデータ (qt.get_history_data(htype, shares, ...)) を使用できるようになります。

DataType オブジェクトの簡単な紹介

上に示したように、qteasy のデータ型は DataType オブジェクトの形式で存在します。各データ型には一意の ID があります。この ID を使用すると、データを抽出し、取引戦略でデータ タイプを参照し、qteasy で必要な作業を完了できます。

DataType は、データ ソースから抽出できる履歴データの種類を表します。たとえば、株式の日次ローソク足 (K ライン) の終値は、一種の履歴データです。株式の週次ローソク足の終値も、別の種類の履歴データです。そして、株式の月次ローソク足の終値もまた別の種類の履歴データです。これらはすべて終値ですが、頻度が異なるため、異なるデータ型としてカプセル化されます。

DataType クラスは、統合されたデータ取得 API と属性をカプセル化し、qteasy での履歴データの使用を大幅に容易にします。特定の種類の履歴データが必要な場合は、その ID を使用して get_history_data を呼び出して直接取得するだけです。

また、取引戦略で特定の種類のデータを使用する必要がある場合は、戦略定義プロセス中にそのデータの ID を登録するだけで済みます。そうすれば、データの保存方法、ダウンロード方法、クリーニング方法などの詳細を気にすることなく、戦略で直接使用できます。

2.4. 定期的にデータをローカル ストレージにダウンロードする

ローカル データ ソースを最新の状態に保つために、qt.refill_data_source() 関数を使用してデータをローカルに定期的にダウンロードできます。ファイル refill_data.py を作成し、その中に次のコードを書き込みます。

import qteasy as qt

if __name__ == '__main__':
    # 解析命令行参数,--tabls参数表示数据表类型,--start_date和--end_date表示下载数据的起始日期和结束日期
    import argparse
    parser = argparse.ArgumentParser(description='refill data source')
    parser.add_argument('--tables', type=str, default='stock_daily', help='data table type')
    parser.add_argument('--start_date', type=str, default='20230101', help='start date')
    parser.add_argument('--end_date', type=str, default='20231231', help='end date')
    parser.add_argument('--parallel', type=bool, default=True, help='parallel download')
    parser.add_argument('--merge_type', type=str, default='update', help='merge type')
    args = parser.parse_args()
    tables = args.tables
    start_date = args.start_date
    end_date = args.end_date
    parallel = args.parallel
    merge_type = args.merge_type
    
    if tables == 'events':
        # 下载低频data和event数据,下载周期较长以cover所有的季度月度周度数据 (每周下载或每月下载)
        tables = 'stock_weekly, stock_monthly, index_weekly, index_monthly, '
        tables += 'income, balance, cashflow, financial, forecast, express, comp, report, events'
    elif tables == 'basics':
        # 下载基础数据,下载周期较长以cover所有的季度月度周度数据 (每周下载或每月下载)
        tables = 'basics'
    elif tables == 'daily':
        # 下载日频数据,下载周期较短以减少下载负载 (每天或每周下载)
        tables = 'adj, stock_daily, fund_daily, future_daily, options_daily, stock_indicator, stock_indicator2, index_indicator, shibor, libor, hibor, index_daily'
    elif tables == 'stock_mins':
        tables = 'adj, stock_1min, stock_5min, stock_15min, stock_30min, stock_hourly'
    elif tables == 'index_mins':
        tables = 'adj, index_1min, index_5min, index_15min, index_30min, index_hourly'
    elif tables == 'fund_mins':
        tables = 'adj, fund_1min, fund_5min, fund_15min, fund_30min, fund_hourly'
    else:
        tables == tables
    
    qt.refill_data_source(tables=tables, 
                          start_date=start_date, 
                          end_date=end_date, 
                          parallel= parallel, 
                          merge_type=merge_type)

上記のスクリプト ファイルは、最も基本的なデータ ダウンロード機能を提供します。必要に応じて、tables および start_date/end_date パラメータ、および parallel および merge_type パラメータを変更して、さまざまなデータ型およびさまざまな日付範囲をダウンロードできます。スクリプト ファイルを自分で改良して、より多くの機能を実装することもできます。

2023 年通年の stock_daily データをダウンロードするには、コマンド ラインで次のコマンドを実行するだけです。

(bash): python -m refill_data --tables stock_daily --start_date 20230101 --end_date 20231231

2.5. レビューとまとめ

この時点で、qteasy がデータを管理する方法とデータをダウンロードする方法について予備的に理解しました。基本データといくつかの価格と量のデータをダウンロードしました。データの抽出方法とローソク足チャートの表示方法を学びました。最後に、データをクエリする方法も学びました。特定の種類のデータが必要な場合、そのデータを検索する方法、ダウンロードする方法、呼び出す方法がわかります。

次のチュートリアルでは、qteasy について理解を深めていきます。取引戦略を作成する方法と、それらを実行してバックテストする方法を学びます。

qteasy の詳細については、qteasy ドキュメント を参照してください。