ページ入力パラメータ · 14 / 29
入力パラメータ
入力パラメータを使うと、戦略コード内の値(たとえばルックバック期間や、保有できるロングポジションの最大数)を、実行モーダルから設定できるつまみに変えられます。新しい数値を試すたびにファイルを編集する必要はありません。同じ params の仕組みは、Run backtest(バックテスト)、Bulk forward(AutoTrading / QuantCloud)、Chart forward test のアルゴパラメータに適用されます。Test については コードの実行 で説明しており、複数回実行のスイープは 最適化 で扱います。通常の Run では params は設定されません。
このページでは、この流れの 2 つの半分を扱います。
- Python ファイルでの
paramsの宣言 - 実行モーダルとの連携により、設定・保存・最適化を行う(あわせて 実行プリセット (.qcs) も参照)
仕組みの概要
- 戦略ファイルで、特別な
paramsオブジェクトをインポートし、その属性を読み取ります(例:params.PERIOD)。 - IDE がコードをスキャンしてそれらの名前を見つけ、実行モーダル(Test、bulk forward、chart forward)に一覧表示します。
- ダイアログで各名前の型と値を入力します(最適化する場合はスイープを定義します)。
- 実行を開始すると、エンジンはスクリプトの実行前に
paramsにその値を設定するため、ファイルがインポートされた時点で値が利用できます。
入力は Run backtest、Bulk forward、Chart forward test の各モーダルで設定されます。通常の Run(
/ws/run)では設定されません。同じファイルを両方の方法で動かしたい場合は、hasattrによるデフォルト値を使ってください。paramsがコールバックから見えるタイミングについては 戦略のライフサイクル を参照してください。
戦略での params の宣言
インポートを 1 つ追加し、各パラメータ名を params の属性として参照します。
from quantcraft.inputs import params
PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14
MAX_OPEN_LONGS = params.MAX_OPEN_LONGS if hasattr(params, "MAX_OPEN_LONGS") else 3
USE_FILTER = params.USE_FILTER if hasattr(params, "USE_FILTER") else True
LABEL = params.LABEL if hasattr(params, "LABEL") else "default"いくつかのルールがあります。
from quantcraft.inputs import paramsの形で書いてください。 検出用の正規表現は、既存のスクリプトが動き続けるよう、古いfrom quantcraft.inputs_module import paramsやfrom ide.inputs_module import paramsも受け付けますが(リファレンス を参照)、新しいコードではquantcraft.inputsを使ってください。from … import paramsの形である必要があります。import quantcraft.inputs as inpは検出されず、Script タブが表示されません。- ランナーは、エントリースクリプトが読み込まれる前にモーダルの値を適用するため、戦略ファイル内の
from quantcraft.inputs import paramsには十分です。 paramsは 1 つの「ライブ」オブジェクトです。 実行のたびにその背後の値が入れ替わるため、常にその実行の入力を示します。以前のフォワード実行中にそれをインポートしたヘルパーモジュールでも同様で、同時に稼働しているフォワード実行ごとにも別々です。入力なしで開始した実行では、paramsは空で、以前の実行の値が見えることはありません。- 各パラメータ名は有効な Python の識別子(
A–Z、a–z、0–9、_。数字で始めない)でなければならず、それ以外はスキップされます。 - IDE が検出できるよう、各入力にはソース内にリテラルの
params.NAMEトークンを含める必要があります。クライアントはparams.<識別子>を正規表現で照合します。getattr(params, "NAME", default)だけで参照された名前は検出されず、Script タブに表示されません。getattr(params, "NAME", default)は実行時には機能します。検出のために、同じ行にリテラルのparams.NAMEを残してください。 params.NAMEはファイルのどこでも使えます。トップレベル、on_init内、on_bar内などです。一意な参照ごとに、ダイアログが尋ねる入力が 1 つ作られます。- モジュール自体にはスキーマがありません。参照した名前がそのままスキーマです。
避けるべき書き方(フォームにパラメータが一覧表示されません):
MA_PERIOD = getattr(params, "MA_PERIOD", 24) # no params.MA_PERIOD token
PERIOD = 14 # no params referenceよく使われる書き方:
def on_init():
global lookback
lookback = int(params.PERIOD)
def on_bar(bar_index, bar, fundamentals=None, symbol=None):
if bar.bars_back < lookback:
return
...ヒント: バーごとに属性参照のコストがかからないよう、値は一度だけローカル/グローバル変数に読み込みましょう。
Test / バックテストモーダルとの連携
エディタのツールバー(Test ボタン)から Test ダイアログを開きます。ファイルが params.NAME の入力を宣言している場合、パラメータ行と Optimize を備えた Script タブが表示されます。IDE はアクティブなファイルの params.NAME 参照をすでにスキャンしているため、使用した各パラメータが行として表示されます。
各行で設定する項目:
| 列 | 入力する内容 |
|---|---|
| Parameter | 名前(読み取り専用 — コードから取得されます)。 |
| Type | int、float、str、bool のいずれか(エイリアスの integer、number、boolean も通信上は受け付けられます)。 |
| Value | 実行に使う値。 |
Type の選択についての注意:
int/integer— 整数(例:14)。桁区切りも使えます(1,000→1000)。float/number— 小数(例:0.5、1e-3)。数値中のカンマは取り除かれます。bool/boolean—true/false、yes/no、y/n、on/off、1/0(大文字小文字は問いません)。それ以外はinvalid boolean: …で実行が停止します。モーダルでは True/False を選べます。str— 自由なテキスト。そのまま保持されます(前後の空白は除去)。
バックテストを開始すると、ダイアログは行をまとめてエンジンに送ります。エンジンは on_init() が実行される前に params に値を設定するため、次のようになります。
from quantcraft.inputs import params
PERIOD = params.PERIOD # <- already filled by the time this line executesパラメータ名に対応する行がダイアログにない場合(ダイアログのエントリを削除した、または、まだ設定していない新しい名前をファイルが参照している場合)、params にはその属性がなく、params.NAME を直接読むと AttributeError が発生します。ダイアログに行を追加して再実行するか、上で示した hasattr + else のデフォルトパターン(検出用の params.NAME トークンも含まれます)を使ってください。
ダイアログの値は実行間で記憶されるため、毎回入力し直す必要はありません。パラメータセット全体の保存と読み込みは、実行プリセット (.qcs) で行えます。
パラメータの最適化
Script タブで Optimize を有効にすると、異なるパラメータの組み合わせで戦略を何度も実行します。Brute force か Genetic を選んでください。
総当たり(Brute force)
各パラメータ行に対し、意味のある場合は Step と Max の列がダイアログに追加されます。
int/float— 離散的なグリッドを定義します: 開始値 → ステップ → 最大値。bool—trueとfalseの両方が試されます。str— 固定のままです(文字列パラメータはグリッドを形成しません)。
エンジンはこれらの離散値のすべての組み合わせを実行し、Test Results ビューで各実行を個別に報告します。
小さなグリッド(少数のパラメータで、各パラメータに数個の値)に便利です。組み合わせはすぐに爆発的に増えるため、探索空間は控えめにしてください。
遺伝的(Genetic)
より大きな探索空間では、Genetic に切り替えると、進化的探索がすべてのセルを試さずに良い組み合わせを見つけます。
- Population size — 各世代で評価されるパラメータの組み合わせの数。
- Generations — 実行する世代数(各世代はバックテストの集団 1 つ分です)。
- Elitism — 上位の個体を変更せずに次の世代へコピーします。
- Crossover rate(
0–1) — 2 つの親が混合した子を生み出す確率。 - Mutation rate(
0–1) — 遺伝子が別の値に変わる確率。 - Fitness metric — 最適化する指標(Sharpe、Sortino、総リターンなど)。
- Random seed (任意) — 集団と演算子の再現性。
どちらのモードでも、出力パネルにライブの進行状況(ヘッダーの進行状況バー)が表示され、長時間の実行を終了できる Stop ボタンがあります。
最適化が終わると、Test Results ビューに、適応度指標で並べ替えられた実行結果が表示され、それぞれを掘り下げて確認できます。
ヒント
-
名前はファイルから検出されます: 行が表示されない場合は、
params.NAMEの参照と、paramsをquantcraft.inputsからインポートしているかを再確認してください(既存のスクリプト向けに、古いquantcraft.inputs_moduleとide.inputs_moduleのパスも照合されます)。 -
名前は UPPER_SNAKE_CASE にしましょう — 慣例として、コード内では定数として読めます。
-
ダイアログでは適切な型を指定して、型変換が期待どおりに動くようにしてください(たとえば
0.5のような値にintを設定しないでください)。 -
ブール値は大文字小文字を区別しません —
True、true、1、yesはすべて真と評価されます。 -
パラメータ探索には、エディタのスクリプトではなく Optimize を使いましょう。総当たりは網羅的で、遺伝的探索はより大きな空間向けです。
-
通常の Run は params を設定しません: Run をクリックしたとき、
paramsは設定されません。同じファイルを Run と Test の両方で動かしたい場合は、(リテラルのparams.NAMEトークンを含めた)hasattrによるデフォルト値を使ってください。from quantcraft.inputs import params PERIOD = params.PERIOD if hasattr(params, "PERIOD") else 14 -
フォワード実行も同じ検出ルールを使います — bulk forward と chart forward のモーダルは、バックテストのダイアログと同じ方法で
params.NAMEをスキャンします。

