バックテストと戦略の評価
qteasy すべての取引戦略は、バックテストと操作のために qteast.Operator (トレーダー) オブジェクトを通じて実装されます。 Operator オブジェクトは戦略コンテナーであり、トレーダーは複数の異なる取引戦略を、異なる操作タイミングや頻度、または異なる目的を持っている場合でも、同時に管理できます。たとえば、ある戦略は銘柄の選択に使用され、別の戦略は市場のタイミングに使用され、別の戦略はリスク管理に使用されます。ユーザーは、Operator オブジェクト内の戦略を柔軟に追加または変更できます。
戦略をOperatorに引き渡した後、取引する資産クラス、資産プールのサイズ、各戦略の動作タイミングと頻度が設定されている限り、Operatorオブジェクトは適切なタイミングで対応する取引戦略を開始し、戦略シグナルを生成し、すべての戦略シグナルを混合(blend)して取引シグナルに解決します。
Operator オブジェクトの詳細については、qteasy のドキュメントを参照してください。
qteasy は、取引戦略を作成する 2 つの方法を提供します。
組み込みの取引戦略の組み合わせを使用する
qteasyは、ユーザーが手動で作成せずに使用できる、さまざまな組み込みの取引戦略を提供します。組み込み戦略の名前を参照することで (すべての組み込み戦略に関する詳細なドキュメントを参照)、ユーザーは戦略を迅速に確立したり、複数の単純な戦略を組み合わせてより複雑な複合戦略を作成したりできます。
~戦略を創る戦略授業を通して~
ユーザーの戦略が非常に複雑な場合、
qteasy.Strategyクラスを通じて戦略をカスタマイズできます。
取引戦略の作成、履歴データを使用した取引戦略の取引結果のバックテスト、および取引結果の評価は、qteasy の中核機能の 1 つです。 qteasyは、トレーダーオブジェクト(Operator)を通じて一連の取引戦略を要約し、qt.run()関数を使用して設定された履歴期間内の取引戦略の動作をシミュレートし、取引シグナルの生成、履歴価格を使用した取引のシミュレーション、取引結果の生成、評価指標の計算、およびチャートとして視覚的な形式で出力します。
ここでは、一般的なファンド タイミング投資戦略の例を示し、次の内容を示します。
単純な DMA タイミング投資戦略を作成し、この戦略を使用してトレーダー オブジェクトを作成し、戦略を変更および追加する方法を示します。
qt.configure()で関連する環境変数を設定し、過去 10 年間の CSI 300 インデックスの履歴データを使用して戦略のパフォーマンスをバックテストします。過去 10 年間の CSI 300 インデックスの履歴データを使用して戦略パラメーターを最適化し、最終的に最適化後の結果を実証します
まず、qteasy モジュールをインポートします。チャートをオンラインで印刷するには、matplotlib inline を使用してチャートの印刷モードをオンライン印刷に設定します。
戦略と Operator オブジェクトを作成する
qteasy のすべての取引戦略は、取引戦略 (Strategy) オブジェクトとして定義されます。各取引オブジェクトには、次の 3 つの側面を含む一連の取引ルールが含まれています。
戦略実行ルールには、戦略の実行頻度、使用される履歴データの種類、履歴データ ウィンドウの長さが含まれており、戦略の動作方法と履歴データの使用方法を定義します。
シグナル生成ルール 取引シグナルを生成するためのルール、つまり、取引戦略の核となる、関連する履歴データに基づいてどのような取引シグナルを生成するかというルール
取引シグナルのタイプ さまざまなタイプの取引シグナルにより、シミュレーション取引モジュールが取引シグナルを処理する方法が決まります。
qteasy では、取引戦略はトレーダー オブジェクト (Operator) によって実行されます。同時に実行できるのは 1 つの Operator オブジェクトのみですが、同じトレーダーは 1 つ以上の取引戦略を同時に実行できます。これらの取引戦略は同じポートフォリオで取引でき、ユーザーは特定の「混合」方法を定義して、複数の単純な取引戦略を複雑な取引戦略に組み合わせることができます。
戦略オブジェクトの作成
Strategy オブジェクトの作成は、qt.built_in モジュールを使用するのが最も簡単で、Operator オブジェクトの作成時に作成することもできます。
import qteasy as qt
# 通过qt内置策略模块创建一个DMA则时策略
stg = qt.built_in.DMA()
# 通过stg.info()可以查看策略的主要信息:
stg.info()
Strategy_type: RuleIterator
Strategy name: DMA
Description: Quick DMA strategy, determine long/short position according to differences of moving average prices with simple timing strategy
Strategy Parameter: (12, 26, 9)
Strategy Properties Property Value
-------------------------------------------------
Param. count 3
Param. types ['int', 'int', 'int']
Param. range [(10, 250), (10, 250), (5, 250)]
Run parameters d @ close
Data types ['close']
Data parameters 270 d
出力からこの取引戦略の基本情報を確認できます。名前と説明に加えて、次の重要な情報が含まれます。
戦略パラメータ。ストラテジ パラメータは、ストラテジの動作中に必要な外部パラメータです。異なる戦略ルールに応じて、戦略で使用されるパラメータも異なります。これらのパラメータは戦略の動作に影響し、さまざまなパラメータは戦略の出力に影響します。例えば、デュアル移動平均戦略では、長期移動平均の計算期間と短期移動平均の計算期間が 2 つの戦略パラメータになります。
パラメータのタイプ/範囲: さまざまな戦略パラメータは、戦略の最終結果に大きな影響を与える可能性があります。パラメータの値の範囲とタイプを設定した後、qteasy はさまざまな方法でパラメータ空間内で最適なパラメータを検索し、戦略のパフォーマンスを最適化できます。
戦略データの頻度 / サンプル頻度。戦略の実行頻度と必要なデータの頻度 (週に 1 回、月に 1 回、または 1 分に 1 回など)。一般に、データの頻度は実行頻度に関連します。
データ タイプ: 戦略を実行するために必要な履歴データ タイプ。 DMA 戦略の場合、必要なのは終値のみです。
すべての組み込み戦略を表示したい場合は、qt.built_ins() 関数を使用できます。関数パラメータを指定しない場合、すべての組み込み戦略のリストが表示されます。パラメーターを指定すると、指定された組み込み戦略に関する詳細情報が表示されます。例えば:
qt.built_ins('dma')
結果:
DMA择时策略
策略参数:
s, int, 短均线周期
l, int, 长均线周期
d, int, DMA周期
信号类型:
PS型:百分比买卖交易信号
信号规则:
在下面情况下产生买入信号:
1, DMA在AMA上方时,多头区间,即DMA线自下而上穿越AMA线后,输出为1
2, DMA在AMA下方时,空头区间,即DMA线自上而下穿越AMA线后,输出为0
3, DMA与股价发生背离时的交叉信号,可信度较高
策略属性缺省值:
默认参数:(12, 26, 9)
数据类型:close 收盘价,单数据输入
采样频率:天
窗口长度:270
参数范围:[(10, 250), (10, 250), (8, 250)]
策略不支持参考数据,不支持交易数据
その他の組み込み戦略関数には次のものがあります。
qt.built_ins(stg_id=None)
stg_id=None の場合は、すべての組み込み戦略のリストを表示します。それ以外の場合は、指定された組み込み戦略に関する詳細情報を表示します。
qt.built_in_list(stg_id=None)
stg_id=None の場合は、すべての組み込み戦略のリストを返します。それ以外の場合は、指定された組み込み戦略に関する詳細情報を返します。
qt.built_in_strategies(stg_id=None)
stg_id=None の場合は、すべての組み込み戦略のリストを返します。それ以外の場合は、指定された組み込み戦略に関する詳細情報を返します。
qt.get_built_in_strategy(stg_id)
指定された組み込み戦略 ID に従って、組み込み戦略オブジェクトを返します。
Operator オブジェクトを作成する
Operator オブジェクトの作成は、qt.Operator() を使用して行うことができます。 Operator オブジェクトを作成した後、すべての取引戦略はトレーダー オブジェクトによって実行されます。トレーダー オブジェクトを作成するときに、取引シグナルの処理方法と取引の実行方法を指定できます。
qt.Operator(strategies=None, signal_type=None, op_type=None)
strategies: トレーダー オブジェクト内の取引戦略は、1 つ以上の取引戦略、または取引戦略のリストです。取引戦略が指定されていない場合は、空のトレーダー オブジェクトが作成され、後で取引戦略を追加または削除できます。取引戦略が追加されると、トレーダー オブジェクトは各取引戦略に一意の ID を割り当てます。この ID は、この取引戦略を参照するために使用できます。同時に、トレーダーオブジェクトは、戦略の動作頻度とタイミングに従って、各取引戦略に動作タイミングを自動的に割り当てます。操作タイミングが到来した場合にのみ、トレーダー オブジェクトはこの取引戦略を実行し、取引シグナルを生成します。signal_type: 取引シグナルのタイプは、'pt'、'ps'、または'vs'で、デフォルトは'pt'で、それぞれ目標保有率シグナル、パーセンテージ取引シグナル、数量取引シグナルを表します。さまざまなタイプの取引シグナルにより、トレーダー オブジェクトが取引シグナルを処理する方法と、トレーダー オブジェクトが複数の取引戦略の取引シグナルを単一の取引シグナルに混合する方法が決まります。op_type: トレーダー オブジェクトの動作モードは'batch'または'realtime'で、デフォルトは'batch'で、それぞれバッチ動作モードとリアルタイム動作モードを表します。バッチ操作モードでは、トレーダー オブジェクトはバックテストまたは最適化モードで事前に取引シグナルを生成し、バッチでシミュレートされた取引を実行します。これにより、より高速になります。リアルタイム操作モードでは、トレーダー オブジェクトは取引シグナルを生成し、すぐに取引をシミュレートします。シミュレートされた取引結果を生成した後、実際の取引操作モードまたは特別なバックテストモードに適した次の取引シグナルを生成します。
qteasy の場合、取引戦略の取引シグナルと株式/ファンドの取引注文は 2 つの異なる概念です。
すべての取引戦略は取引シグナルを生成する履歴データに基づいており、トレーダー オブジェクトは取引シグナルに基づいて取引注文を生成し、トレーダーの取引行動をシミュレートし、最終的に取引結果を生成します。
3種類の戦略シグナル
qteasy では、取引シグナルは浮動小数点数であり、同じ取引シグナルでも異なる意味を表すことができ、トレーダー オブジェクトによって異なる取引注文として解釈されます。取引シグナルの意味は、トレーダー オブジェクトのシグナル タイプによって決まります。シグナル タイプは、'pt'、'ps'、または 'vs' で、それぞれ目標保有率シグナル、パーセンテージ取引シグナル、数量取引シグナルを表します。
取引シグナルには次の 3 種類があります。
PT: この取引シグナルは目標保有比率を表します。これは、保有株式の価値が総資産に占める割合を意味します。たとえば、現在の総資産が 100 万元の場合、0.2 は、特定の株式やファンドの時価が 100 万元の 20%、つまり 20 万元になるように保有量をコントロールすることを意味します。この場合、売買される株数は現在の保有株数に応じて決まります。現在の保有株数が0株であれば、20万元分の株を購入します。現在保有している株式の価値が30万元であれば、10万元分を売却します。
PS: この取引シグナルは売買比率を直接表します。この場合、売買される株数は現在の保有株数とは関係なく、総資産にのみ関係します。総資産が100万元であれば、0.2というのは20万元分の株を買うことになります。
VS: この場合、取引シグナルは売買数量を直接表します。この場合、売買する株数は総資産や保有株数とは無関係です。 2000 は 2000 株の株式を購入することを意味します。
さらに、トレーダーが運用する口座の種類(株式口座や先物口座など)によって生成される取引注文が異なる場合、生成される取引注文も異なります。具体的な説明を次の表に示します。
| 账户类型 | 信号类型 | 交易信号 | 信号含义 | 信号举例 | 交易订单举例 |
|---|---|---|---|---|---|
| 股票账户 | PT | sig > 0 | 持有该资产,并使持有资产的市值为总资产的sig倍 | 0.5 | 根据当前持有的资产比例确定交易订单,如果已经满仓持有,则卖掉50%仓位,如果持仓为0,则买入至50%仓位 |
| sig = 0 | 清空全部持有的资产,持有资产为0 | 0 | 根据当前持有的资产比例确定交易订单,如果持仓则卖掉全部持仓,如果没有持仓则不交易 | ||
| sig < 0 | 无意义 | N/A | N/A | ||
| PS | sig > 0 | 买入该资产,买入的金额占总资产的比例为sig | 0.5 | 总资产为100,000,则此时花费50,000元金额买入资产(含手续费) | |
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | sig < 0 | 卖出该资产,卖出的部分占当前持有数量的比例为sig | -0.5 | 假设当前持有1000股,则此时应卖出500股 |
| VS | sig > 0 | 买入该资产,买入的数量为sig | 500 | 买入500股 | |
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | sig < 0 | 卖出该资产,卖出的数量为abs(sig) | -500 | 卖出500股 |
| 期货账户 (未实现) | PT | sig > 0 | 平掉所有空仓,开多仓,并使持有合约价值为总资产的sig倍 | 1.5 | 假设总资产为100,000,开多仓持有总价150,000的合约 *当保证金比例<1时,持仓比例可以大于100% |
| sig = 0 | 平掉全部持有的仓位,持有头寸为0 | 0 | 平掉所有持有的多仓和空仓 | ||
| sig < 0 | 平掉所有多仓,开空仓,并使持有合约价值为总资产的sig倍 | -1.5 | 总资产为100,000,则开空仓持有总价150,000的合约 * 如果保证金比例<1时,持空仓比例可以大于100% |
||
| PS | sig > 0 | 如果持有空仓:平部分空仓,平空仓的数量占总持有的比例为sig | 0.5 | 如果总持仓为1,000手,则此时平仓500手 * 此时sig必须小于等于1 |
|
| 如果持有多仓:开多仓,开仓的合约价值占总资产的比例为sig | 1.5 | 如果总资产为100,000,则开多仓持有总价150,000元的合约 * 如果保证金比例<1时,sig可以大于1 |
|||
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | ||
| sig < 0 | 如果持有多仓:平部分多仓,平仓的数量占总持有的比例为sig | 0.5 | 如果总持仓为1,000手,则此时平仓500手 * 此时sig必须小于等于1 |
||
| 如果持有空仓:开空仓,开仓的合约价值占总资产的比例为sig | 1.5 | 如果总资产为100,000,则开空仓持有总价150,000元的合约 * 如果保证金比例<1时,sig可以大于1 |
|||
| VS | sig > 0 | 平空仓或开多仓,开平仓的数量为sig。如果持有空头数量超过sig则忽略剩余部分 | 1500 | 如果持有1500手以上空头仓位,则平仓1500手,如果当前没有持仓,则开多仓持有1500手合约 | |
| sig = 0 | 不进行任何操作 | 0 | 不进行任何操作 | sig < 0 | 平多仓或开空仓,开平仓的数量为sig。如果持有多头数量超过sig则忽略剩余部分 | -500 | 如果持有1500手以上多头仓位,则平仓1500手,如果当前没有持仓,则开空仓持有1500手合约 |
取引シグナルのブレンド
同じ Operator オブジェクトは同時に 1 種類のシグナルしか生成できませんが、Operator オブジェクトは無限数の異なる取引戦略に対応できるため、同じタイプの取引戦略のセットを無限数生成することもできます。取引バックテスト中の計算オーバーヘッドを節約し、コンピューティング リソースを占有する競合または重複した取引シグナルを回避し、取引シグナルの柔軟性を高めるには、テストのためにバックテスト プログラムに送信される前に、すべての取引シグナルをセットに混合する必要があります。
ただし、Operator オブジェクトでは、異なる戦略によって生成された取引シグナルが異なる取引価格で実行される可能性があります。たとえば、一部の戦略は始値取引シグナルを生成しますが、他の戦略は終値取引戦略を生成します。この場合、異なる取引価格シグナルを混合すべきではありません。しかしそれ以外は、取引価格が同じである限り、すべてのシグナルが混在するはずです。
取引シグナルのブレンドとは、単純な論理演算や加算/減算演算から複雑なカスタム関数まで、取引シグナルのさまざまな演算または関数を意味します。 ndarray 関数に適用できる限り、最終出力の取引シグナルが意味のあるものである限り、理論的には取引シグナルを混合するために使用できます。
信号ブレンディングは、「アトミック関数」または「演算子」と呼ばれる、一連の事前定義された操作および関数に基づいています。ユーザーは、これらの「演算子」を使用して、Operator オブジェクトによって生成された取引シグナルを操作し、形状と意味のある数値を維持しながら、複数の取引シグナルのセットを固有の取引シグナルのセットに変換します。
信号はブレンディング式 blender (例: s0 and (s1 + s2) * avg(s3, s4)) によってブレンドされます。
blender 式は次の関数をサポートします。
要素 |
例 |
説明 |
|---|---|---|
戦略インデックス |
|
s で始まり数字で終わる文字列。数字は |
数字 |
|
任意の有効な数値、式演算に参加する数値 |
オペレーター |
|
|
論理演算子 |
|
|
機能 |
|
サポートされている機能は次の表に示されています |
かっこ |
|
複合操作 |
ブレンド式のその他の例については、qteasy チュートリアル 04 - 組み込みストラテジーの使用 を参照してください。
op = qt.Operator()
OPERATOR INFO:
=========================
Information of the Module
=========================
Total 0 operation strategies, requiring 0 types of historical data:
0 types of back test price types:
[]
Operator オブジェクトは戦略コンテナであり、任意の数の取引戦略を Operator オブジェクトに追加できます。同時に、取引戦略のブレンディング方法(ブレンダー)、取引信号処理方法、取引操作方法をOperatorオブジェクトで管理することができます。
通常のOperatorの属性とメソッドは次のとおりです。
Operatorオブジェクトの基本情報を取得
op.info()
Operatorオブジェクトの重要な情報を出力します
op.strategies
Operator オブジェクト内のすべての取引戦略のリストを取得します
op.strategy_ids
Operator オブジェクト内のすべての取引戦略の ID を取得します
op.strategy_count
Operator オブジェクト内の取引戦略の数を取得します
op.signal_type
Operator オブジェクトのシグナルタイプ。取引シグナルの意味と処理方法を表します。
「pt」: 目標保有比率シグナル、このモードでは、トレーダーはポートフォリオ内の各構成銘柄の保有比率に焦点を当てます。適時売買を行うことで、各構成銘柄の保有比率を目標値に維持する。
「ps」: 取引シグナルの割合、このモードでは、トレーダーは一定の間隔で生成される取引シグナルの割合に焦点を当て、取引シグナルに従って株式を比例的に売買します。
「vs」: 数量取引シグナル、このモードでは、トレーダーは一定の間隔で生成される取引シグナルに焦点を当て、取引シグナルに従って特定の数の株を売買します。
op.op_type
Operator オブジェクトの実行モード:
'batch': バッチ操作モード。バックテストまたは最適化モードでは、事前に取引リストを生成し、バッチでシミュレートされた取引を実行します。これにより高速化されます。
「リアルタイム」: リアルタイム操作モード。取引シグナルを生成し、すぐに取引をシミュレートします。シミュレートされた取引結果を生成した後、リアルタイム操作モードまたは特別なバックテスト モードに適した次の取引シグナルを生成します。
取引戦略を取得する
op.get_stg(stg_id)
戦略 ID によって戦略オブジェクトを取得します。次のメソッドは同じ効果があり、番号シーケンスによる戦略を取得するために使用できます。
stg = op.get_stg(stg_id)
stg = op[stg_id]
stg = op[stg_idx]
取引戦略の追加または変更
op.add_strategy(stg, **kwargs)
Operatorにストラテジを追加し、同時にストラテジパラメータを設定します
op.add_strategies(strategies)
一連のストラテジをバッチでOperatorに追加します。ストラテジパラメータを同時に設定することはできません
op.remove_strategy(id_or_pos=None)
Operator から戦略を削除します
op.clear_strategies()
Operator のすべての取引戦略を削除します
戦略パラメータまたはOperatorパラメータを設定します
op.set_parameter(stg_id, pars=None, opt_tag=None, par_range=None, par_types=None, data_freq=None, run_freq=None, window_length=None, data_types=None, strategy_run_timing=None, **kwargs)
取引戦略 ID を指定して、この取引戦略の戦略パラメーターまたはその他の属性を設定します。
op.set_blender(price_type=None, blender=None)
取引戦略のブレンド方法を設定します。 Operatorに複数の取引戦略がある場合、各取引戦略は個別に実行されて複数の取引シグナルセットを生成し、ユーザー定義の取引ルールに従って一連の取引シグナルを出力します。
次のコードを使用して、新しく作成した DMA 戦略を Operator に追加し、必要な戦略パラメータを設定できます。
すべてのパラメータ設定は operator.set_parameter メソッドを使用して行うことができ、複数のパラメータを同時に渡すことができます。ストラテジーの opt_tag を設定することで、ストラテジーが最適化に参加するかどうかを制御でき、par_range パラメーターはストラテジーの最適化に必要なパラメーター空間を定義します。現時点では、CSI 300 指数の過去 15 年間における最適な DMA タイミング パラメーターがわからないため、いくつかのランダムなパラメーターを入力してバックテストを実施し、その結果がどのようになるかを確認できます。
op.clear_strategies()
op.add_strategy(stg, pars=(26, 35, 189), opt_tag=1)
print(f'Operator strategies: {op.strategies}')
print(f'Strategy IDs are: {op.strategy_ids}')
op.info(verbose=True)
Operator strategies: [RULE-ITER(DMA)]
Strategy IDs are: ['custom']
OPERATOR INFO:
=========================
Information of the Module
=========================
Total 1 operation strategies, requiring 1 types of historical data:
close
1 types of back test price types:
['close']
for backtest histoty price type - close:
[RULE-ITER(DMA)]:
no blender
Parameters of GeneralStg Strategies:
Strategy_type: RuleIterator
Strategy name: DMA
Description: Quick DMA strategy, determine long/short position according to differences of moving average prices with simple timing strategy
Strategy Parameter: (26, 35, 189)
Strategy Properties Property Value
---------------------------------------
Parameter count 3
Parameter types ['int', 'int', 'int']
Parameter range [(10, 250), (10, 250), (10, 250)]
Data frequency d
Sample frequency d
Window length 270
Data types ['close']
=========================
qteasy のバックテストパラメータを設定する
バックテストは、Operator オブジェクトが作成され、戦略が追加された後に開始できます。
qteasy は、バックテストの特定のプロセスを制御するための豊富な環境パラメーターを提供します。すべての環境パラメーター変数の値は、qt.Configuration() を通じて表示し、qt.Configure() を通じて設定できます。
qt.configuration()
qteasy 実行環境変数を確認してください
qt.configure()
qteasy 実行環境変数を設定します
バックテストに関連する環境変数パラメータには次のものがあります。
バックテスト対象銘柄・指数
バックテストの開始期間と終了期間
バックテストの初期投資額
バックテストの取引手数料と取引ルール
取引成績を評価するためのベンチマーク指標
上記のバックテスト取引パラメーターはすべて、qt.configure() を通じて設定できます。
qt.configure(
mode=1, # 设置运行模式为:1-回测模式
benchmark_asset = '000300.SH', # 设置交易评价基准(类型由系统根据代码自动推断)
asset_pool = '000300.SH', # 设置交易资产组合
asset_type = 'IDX', # 交易资产组合的资产类型
trade_batch_size = 0.01, # 设置允许最小交易批量(最小0.01)
invest_start = '20100105', # 设置交易开始日期
invest_end = '20201231', # 设置交易终止日期
invest_cash_amounts = [1000000], # 设置初始交易投资金额为十万元
visual=True # 输出可视化交易结果图表
)
qteasy を起動し、Operator を実行します
qt.run(operator, **config)
Operator の実行を開始します。動作モードに応じて、qteasy は異なる動作モードに入り、異なる結果を出力します。
モード 0 リアルタイム モード: 最新 (リアルタイム) データを読み取り、最新の取引シグナルを生成します。このモードでは、qteasy を定期的に実行し、最新のデータを定期的に読み取り、リアルタイムの取引シグナルを定期的に生成するように設定できます。
モード 1 バックテスト モード: 一定期間にわたる履歴データを読み取り、そのデータを使用して取引シグナルを生成し、取引をシミュレートしてシミュレートされた取引の結果を出力します。
モード 2 最適化モード: 一定期間にわたる履歴データを読み取り、同じ一連の取引戦略を繰り返し実行しますが、異なるパラメーターの組み合わせを使用して、この期間中に最もパフォーマンスの高い戦略パラメーターを検索します。
Operator は、qteasy.run(operator, **config) を実行することで開始できます。**config はテスト環境パラメーターです。 qt.run() のパラメータとして渡された環境変数は、この実行でのみ有効ですが、qt.configure() で設定された環境変数は、次回変更されるまで有効のままです。
最終的なバックテスト資産は 190,000 元、年率リターンはわずか 4.83%、シャープ レシオはわずか 0.0783、同期間のリターンは CSI 300 指数よりも低い
qt.run(op)
システムは自動的に履歴データを読み取り、バックテストを実施し、結果評価を完了し、qteasy の実行後にバックテスト レポートを印刷します。
バックテスト レポートには次の情報が含まれます。
バックテストにかかった合計時間
バックテスト間隔の開始日と終了日、期間、その他の情報
取引統計: 買い数、売り数、フルポジション比率、空ポジション比率、総取引コストなど。
リターン情報: 初期投資額、最終資産額、総収益率、年率収益率、ベンチマーク総収益率、ベンチマーク年率収益率、収益率の尖度と歪度
ポートフォリオ評価の指標:アルファ、ベータ、シャープレシオ、インフォメーションレシオ、ボラティリティ、最大ドローダウン
====================================
| |
| BACK TESTING RESULT |
| |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 1s 164.2ms
time consumption for operation back looping: 6s 720.2ms
investment starts on 2010-01-05 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 11.0 years.
-------------operation summary:------------
Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 53 53 106 54.0% 0.0% 46.0%
Total operation fee: ¥ 20,382.34
total investment amount: ¥1,000,000.00
final value: ¥1,052,696.57
Total return: 5.27%
Avg Yearly return: 0.47%
Skewness: -0.76
Kurtosis: 11.44
Benchmark return: 46.22%
Benchmark Yearly return: 3.52%
------strategy loop_results indicators------
alpha: -0.047
Beta: 1.000
Sharp ratio: -0.077
Info ratio: -0.018
250 day volatility: 0.156
Max drawdown: 46.12%
peak / valley: 2010-11-08 / 2014-06-19
recovered on: 2015-04-17
===========END OF REPORT=============
バックテスト レポートを除き、バックテスト プロセス全体の詳細情報を示す視覚的なチャートも印刷されます。
この情報チャートには次の情報が表示されます。
バックテスト履歴全体の収益率曲線 (保有期間、売買ポイント、ベンチマーク収益率曲線、最大ドローダウン期間を表示)
対数スケールの返品率曲線とベンチマーク
日次還元率推移グラフ
ローリングシャープレシオとアルファレート推移グラフ(ポートフォリオ収益性評価)
ルーリングボラティリティとベータレートの変化チャート(ポートフォリオリスク評価)
ドローダウン分析チャート(サブマリンチャート)
月次および年次返品率のヒートマップと棒グラフ
月次返品率統計頻度ヒストグラム

qteasy のシミュレートされた取引プロセスでは、次のような多数のパラメーターを設定できます。
投資された資金の合計額、日付、または複数回のバッチで投資するように設定された資金。
売買にかかる取引手数料には、手数料率、最低手数料、固定手数料、スリッページが含まれます。売買でさまざまなレートを個別に設定可能
売買取引の納期、つまりT+N納品システム
売買取引の最小バッチサイズ(端株が許可されるかどうか、または取引に整数株または数百株が必要かどうかなど)
最終的に印刷されるバックテスト結果は、上記のすべての取引パラメータを考慮した後の最終結果であるため、総取引コストを確認できます。取引パラメータの詳細設定については、詳細ドキュメントを参照してください。
さらに、qteasy は戦略のパフォーマンスに関するいくつかの指標も提供します。アルファとベータはそれぞれ 0.067 と 1.002、シャープ レシオは 0.041 です。最大ドローダウンは 2009 年 8 月 3 日から 2014 年 7 月 10 日までに発生し、ドローダウンは 35.0% でしたが、ドローダウンが反転したのは 2014 年 12 月 16 日でした。
上記のバックテスト結果では、パラメーター visual=False を設定しました。 visual=True を設定すると、視覚的なバックテスト結果をグラフの形式で取得し、視覚的な情報を提供できます。
投資戦略の資本曲線
ベンチマーク データ (CSI 300 インデックス) の履歴曲線
売買ポイント(参考データでは赤と緑の矢印で表示)
保有期間(緑は保有)
投資戦略評価指標(アルファ、シャープなど)
ドローダウン分析 (5 つの最大ドローダウンを表示)
返品率ヒートマップ、山積みチャート等
qteasy は、次のような豊富な戦略バックテスト オプションを提供します。
バックテストの開始日と終了日
投資戦略の評価指標
バックテスト中にマイナスのポジションが許可される場合 (先物取引の空売り動作をシミュレートするために使用されるか、特別な先物取引シミュレーション アルゴリズムを使用できます)
その他のオプションについては、詳細なドキュメントを参照してください。
単一タイミング戦略の最適化
明らかに、最適化されていないパラメーターでは理想的なバックテスト結果を達成できないため、最適化を実行する必要があります。
コンテキスト オブジェクトのさまざまなパラメータを設定することで、最適化方法を設定し、最適化プロセスを制御できます。 次のパラメータの意味は次のとおりです。
最適化方法は 1 に設定され、モンテカルロ最適化を使用します。これは、より大きなパラメーター空間に対して優れた最適化機能を備えています。
出力結果の数量は 30 に設定されます
最適化プロセスの反復数は 1000 です
並列パラメータが True に設定されている場合、時間を節約するためにマルチコア プロセッサのすべてのコアが並列計算に使用されます。
次に、perfs_dma および pars_dma 変数を使用して最適化結果を保存し、最適化を開始します。最適化プロセス中は進行状況バーが表示され、完了後に最適化結果が表示されます。
pars_dma = qt.run(op,
mode=2,
opti_method=1,
opti_sample_count=1000,
opti_start='20101231',
opti_end='20201231',
opti_cash_dates='20101231',
test_start='20101231',
test_end='20201231',
test_cash_dates='20101231',
parallel=True)
print(f'optimization completed, 50 parameters found, they are\n'
f'{pars_dma}')
[########################################]1000/1000-100.0% best performance: 340613.629
Optimization completed, total time consumption: 38"247
[########################################]30/30-100.0% best performance: 340613.629
====================================
| |
| OPTIMIZATION RESULT |
| |
====================================
qteasy running mode: 2 - Strategy Parameter Optimization
investment starts on 2010-12-31 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 10.0 years.
total investment amount: ¥ 100,000.00
Reference index type is 000300.SH at IDX
Total Benchmark rtn: 66.59%
Average Yearly Benchmark rtn rate: 5.23%
statistical analysis of optimal strategy messages indicators:
total return: 161.24% ± 29.73%
annual return: 10.01% ± 1.18%
alpha: 0.048 ± 0.014
Beta: 1.001 ± 0.001
Sharp ratio: 0.625 ± 0.089
Info ratio: 0.013 ± 0.004
250 day volatility: 0.151 ± 0.006
other messages indicators are listed in below table
Strategy items Sell-outs Buy-ins ttl-fee FV ROI Benchmark rtn MDD
0 (147, 157, 57) 25.0 25.0 1,213.16 231,710.13 131.7% 66.6% 38.1%
1 (88, 108, 127) 16.0 15.0 1,009.93 233,554.10 133.6% 66.6% 44.3%
2 (105, 160, 29) 21.0 20.0 1,344.78 232,247.09 132.2% 66.6% 26.4%
3 (149, 194, 24) 19.0 19.0 1,062.61 233,932.11 133.9% 66.6% 33.4%
4 (105, 185, 25) 18.0 17.0 1,094.07 236,171.54 136.2% 66.6% 40.6%
5 (86, 147, 107) 11.0 10.0 668.08 234,827.39 134.8% 66.6% 39.7%
6 (88, 157, 101) 11.0 10.0 715.01 236,851.09 136.9% 66.6% 31.6%
7 (144, 181, 57) 19.0 19.0 1,093.20 240,445.16 140.4% 66.6% 33.8%
8 (94, 165, 78) 12.0 11.0 724.66 240,825.90 140.8% 66.6% 38.1%
9 (68, 113, 142) 13.0 12.0 819.42 244,805.70 144.8% 66.6% 42.5%
10 (80, 64, 57) 30.0 30.0 1,767.04 245,084.54 145.1% 66.6% 28.8%
11 (101, 124, 65) 23.0 22.0 1,726.89 245,504.45 145.5% 66.6% 30.7%
12 (150, 189, 33) 20.0 20.0 1,142.62 246,185.41 146.2% 66.6% 34.3%
13 (119, 200, 30) 12.0 11.0 705.66 248,111.42 148.1% 66.6% 24.1%
14 (52, 111, 136) 14.0 13.0 810.29 254,764.49 154.8% 66.6% 40.5%
15 (55, 151, 87) 14.0 13.0 896.37 248,370.33 148.4% 66.6% 38.2%
16 (98, 129, 45) 22.0 21.0 1,480.50 252,764.13 152.8% 66.6% 37.1%
17 (101, 59, 50) 27.0 26.0 1,505.08 255,487.88 155.5% 66.6% 28.8%
18 (179, 240, 25) 19.0 19.0 1,149.62 259,380.09 159.4% 66.6% 33.8%
19 (82, 127, 144) 12.0 11.0 810.46 268,321.59 168.3% 66.6% 37.4%
20 (44, 135, 117) 13.0 12.0 741.60 268,837.16 168.8% 66.6% 42.6%
21 (103, 127, 57) 22.0 21.0 1,628.33 269,776.04 169.8% 66.6% 30.3%
22 (128, 152, 92) 15.0 15.0 883.81 272,170.16 172.2% 66.6% 32.6%
23 (91, 198, 13) 17.0 16.0 1,209.55 277,214.25 177.2% 66.6% 43.3%
24 (102, 110, 129) 26.0 25.0 2,056.58 311,876.36 211.9% 66.6% 33.4%
25 (129, 204, 16) 14.0 14.0 840.49 279,142.60 179.1% 66.6% 32.6%
26 (90, 185, 45) 11.0 10.0 735.84 279,320.37 179.3% 66.6% 40.6%
27 (104, 111, 107) 30.0 29.0 2,207.23 317,371.14 217.4% 66.6% 41.0%
28 (101, 150, 24) 23.0 22.0 2,012.97 331,442.65 231.4% 66.6% 26.4%
29 (104, 142, 87) 15.0 14.0 1,044.25 340,613.63 240.6% 66.6% 23.5%
===========END OF REPORT=============
[########################################]30/30-100.0% best performance: 340613.629
====================================
| |
| OPTIMIZATION RESULT |
| |
====================================
qteasy running mode: 2 - Strategy Parameter Optimization
investment starts on 2010-12-31 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 10.0 years.
total investment amount: ¥ 100,000.00
Reference index type is 000300.SH at IDX
Total Benchmark rtn: 66.59%
Average Yearly Benchmark rtn rate: 5.23%
statistical analysis of optimal strategy messages indicators:
total return: 161.24% ± 29.73%
annual return: 10.01% ± 1.18%
alpha: 0.048 ± 0.014
Beta: 1.001 ± 0.001
Sharp ratio: 0.625 ± 0.089
Info ratio: 0.013 ± 0.004
250 day volatility: 0.151 ± 0.006
other messages indicators are listed in below table
Strategy items Sell-outs Buy-ins ttl-fee FV ROI Benchmark rtn MDD
0 (105, 160, 29) 21.0 20.0 1,344.78 232,247.09 132.2% 66.6% 26.4%
1 (88, 108, 127) 16.0 15.0 1,009.93 233,554.10 133.6% 66.6% 44.3%
2 (147, 157, 57) 25.0 25.0 1,213.16 231,710.13 131.7% 66.6% 38.1%
3 (105, 185, 25) 18.0 17.0 1,094.07 236,171.54 136.2% 66.6% 40.6%
4 (88, 157, 101) 11.0 10.0 715.01 236,851.09 136.9% 66.6% 31.6%
5 (149, 194, 24) 19.0 19.0 1,062.61 233,932.11 133.9% 66.6% 33.4%
6 (144, 181, 57) 19.0 19.0 1,093.20 240,445.16 140.4% 66.6% 33.8%
7 (86, 147, 107) 11.0 10.0 668.08 234,827.39 134.8% 66.6% 39.7%
8 (68, 113, 142) 13.0 12.0 819.42 244,805.70 144.8% 66.6% 42.5%
9 (94, 165, 78) 12.0 11.0 724.66 240,825.90 140.8% 66.6% 38.1%
10 (150, 189, 33) 20.0 20.0 1,142.62 246,185.41 146.2% 66.6% 34.3%
11 (101, 124, 65) 23.0 22.0 1,726.89 245,504.45 145.5% 66.6% 30.7%
12 (80, 64, 57) 30.0 30.0 1,767.04 245,084.54 145.1% 66.6% 28.8%
13 (119, 200, 30) 12.0 11.0 705.66 248,111.42 148.1% 66.6% 24.1%
14 (55, 151, 87) 14.0 13.0 896.37 248,370.33 148.4% 66.6% 38.2%
15 (98, 129, 45) 22.0 21.0 1,480.50 252,764.13 152.8% 66.6% 37.1%
16 (52, 111, 136) 14.0 13.0 810.29 254,764.49 154.8% 66.6% 40.5%
17 (101, 59, 50) 27.0 26.0 1,505.08 255,487.88 155.5% 66.6% 28.8%
18 (179, 240, 25) 19.0 19.0 1,149.62 259,380.09 159.4% 66.6% 33.8%
19 (82, 127, 144) 12.0 11.0 810.46 268,321.59 168.3% 66.6% 37.4%
20 (44, 135, 117) 13.0 12.0 741.60 268,837.16 168.8% 66.6% 42.6%
21 (103, 127, 57) 22.0 21.0 1,628.33 269,776.04 169.8% 66.6% 30.3%
22 (128, 152, 92) 15.0 15.0 883.81 272,170.16 172.2% 66.6% 32.6%
23 (91, 198, 13) 17.0 16.0 1,209.55 277,214.25 177.2% 66.6% 43.3%
24 (129, 204, 16) 14.0 14.0 840.49 279,142.60 179.1% 66.6% 32.6%
25 (90, 185, 45) 11.0 10.0 735.84 279,320.37 179.3% 66.6% 40.6%
26 (104, 111, 107) 30.0 29.0 2,207.23 317,371.14 217.4% 66.6% 41.0%
27 (102, 110, 129) 26.0 25.0 2,056.58 311,876.36 211.9% 66.6% 33.4%
28 (101, 150, 24) 23.0 22.0 2,012.97 331,442.65 231.4% 66.6% 26.4%
29 (104, 142, 87) 15.0 14.0 1,044.25 340,613.63 240.6% 66.6% 23.5%
===========END OF REPORT=============

optimization completed, 50 parameters found, they are
[(147, 157, 57), (105, 160, 29), (88, 108, 127), (149, 194, 24), (86, 147, 107), (105, 185, 25), (88, 157, 101), (144, 181, 57), (94, 165, 78), (68, 113, 142), (80, 64, 57), (101, 124, 65), (150, 189, 33), (119, 200, 30), (55, 151, 87), (98, 129, 45), (52, 111, 136), (101, 59, 50), (179, 240, 25), (82, 127, 144), (44, 135, 117), (103, 127, 57), (128, 152, 92), (91, 198, 13), (129, 204, 16), (90, 185, 45), (102, 110, 129), (104, 111, 107), (101, 150, 24), (104, 142, 87)]
最適化後、30 組の最良のパラメーターが確認でき、最悪のパラメーターでも最終資産が 60,000 元を超える可能性があります。それらから最適なパラメーターを手動で選択し、別のバックテストを実行できます。
最終値は前回のバックテストの 19,000 から 124,000 に急上昇し、年率リターンは 18.9% となり、シャープ レシオも 0.833 に上昇したことがわかります。
op.set_parameter('dma', pars=(104, 142, 87))
qt.run(op,
mode=1, visual=True)
出力されるバックテスト結果は次のとおりです。
====================================
| |
| BACK TESTING RESULT |
| |
====================================
qteasy running mode: 1 - History back testing
time consumption for operate signal creation: 55.7ms
time consumption for operation back looping: 885.7ms
investment starts on 2010-12-31 00:00:00
ends on 2020-12-31 00:00:00
Total looped periods: 10.0 years.
-------------operation summary:------------
Sell Cnt Buy Cnt Total Long pct Short pct Empty pct
000300.SH 15 14 29 52.6% 0.0% 47.4%
Total operation fee: ¥ 1,044.25
total investment amount: ¥ 100,000.00
final value: ¥ 340,613.63
Total return: 240.61%
Avg Yearly return: 13.03%
Skewness: -0.78
Kurtosis: 13.36
Benchmark return: 66.59%
Benchmark Yearly return: 5.23%
------strategy loop_results indicators------
alpha: 0.087
Beta: 1.001
Sharp ratio: 0.751
Info ratio: 0.020
250 day volatility: 0.140
Max drawdown: 23.53%
peak / valley: 2015-12-31 / 2016-01-28
recovered on: 2017-08-28
===========END OF REPORT=============

カスタム戦略を作成する
qteasy では、組み込み戦略の使用だけでなく、カスタム戦略の作成も可能です。以下は、単純なローテーション取引戦略を定義する簡単な例です。