← 研究一覧に戻る

画面操作の研究

Clef for Stock Trading

AIに注文画面の操作を教え、小さくして動かす

記録:2026年10月15日(モデル評価は10月13〜14日)

Clefに注文画面の操作を学習させ、軽量化しました。模擬画面で、指示した注文条件を入力するまでを確かめました。

用語集

Clef / Jev-Omni
画面を見て、次の操作を選ぶAI。
追加学習(ファインチューニング・LoRA)
操作例でAIを学び直させること。LoRAは、調整用の重みを加えて学習する方法。
軽量化(量子化・NVFP4)
計算に使う数値を短い形式で表し、AIの容量を減らすこと。NVFP4は4ビットの形式。
DSH(DeepSeek Harness)
文章の指示を受けて画面を操作するアプリ。
Qwen
Alibabaが開発するOSSのAIモデル群。この構成では指示を受け持ち、Clefが画面上の操作候補を判定する。
UTM
検証用のmacOSを動かす仮想環境。
画面情報(DOM / AX)
入力欄やボタンの役割、位置、現在値。DOMはWebページ、AXはOSから読む。
バックテスト
過去のデータで売買の手順を試し、成績を確かめること。
BF16 / FP8
計算に使う数値の形式。BF16は16ビット、FP8は8ビット。
MLP / attention
AIの計算部分。MLPは情報を変換し、attentionは情報どうしの関係を扱う。
OCO
二つの注文条件を組み合わせ、一方が成立すると他方を取り消す注文。
IFD / IFDOCO
IFDは最初の注文の成立後に次の注文を出す方法。IFDOCOは、その次の注文にOCOを使う方法。
SOR
複数の市場の価格を比べ、注文先を自動で選ぶ仕組み。

用語の参照: Qwen · LoRA · NVFP4 · 注文方法 · IFDOCO · SOR

画面を見て、次の操作を選ぶ

注文条件と画面の情報をAIに渡します。Clefが操作候補を判定し、操作用のアプリが入力します。そのつど画面を読み直し、入力値を確かめます。入力後は、パスワードを入れる前に人へ引き継ぎます。

操作の流れ
  1. 01注文条件を伝える文章で指示
  2. 02画面を読む文字・位置・画像
  3. 03操作を選ぶClefが候補を判定
  4. 04入力値を確かめる画面を読み直す
学習の設定

学習にはブラウザー画面の記録を使いました。文章を扱う部分にLoRAを適用し、画像を読む部分と操作を判定する部分は固定しました。ClefとJev-Omniは、それぞれ学習・軽量化しました。

学習データの例

ML Foundryへ移設した「注文フォーム学習データ v3」の学習用データから5件を抜粋しました。注文条件・現在の画面・操作候補と、学習用の教師ラベルを並べています。

すべて架空の注文条件と模擬画面を使った合成データです。 掲載画像は証券会社名を白く塗りつぶしています。データセット名は掲載用の別名です。 order-forms-v3 / train

01 数量を入力する
入力に使う模擬画面:数量を入力する
入力に使う模擬画面 · 画面画像を拡大して見る ↗

AIへの入力

注文条件(要約)
架空銘柄1000を現物買い。100株、指値1,200.50円、当日中。SOR・ポイントは使わない。
画面の状態
銘柄別の通常注文画面。銘柄と市場は設定済みで、数量欄は未入力。

操作候補

  • option_00数量に「100」を入力する
  • option_01数量に「200」を入力する
  • option_02人へ引き継ぐ
  • option_03入力を保留する

教師ラベル · option_00

数量に「100」を入力する

{
  "kind": "SET",
  "field": "input_quantity",
  "value": "100",
  "tab": "normal"
}

出典レコード: sbi-train-normal_limit-57afea5d1dee-step-04

02 OCOの価格条件を入力する
入力に使う模擬画面:OCOの価格条件を入力する
入力に使う模擬画面 · 画面画像を拡大して見る ↗

AIへの入力

注文条件(要約)
架空銘柄1030を100株現物買い。指値1,200円、1,220円以上なら1,230円の指値へ。いずれも当日中。
画面の状態
OCOタブで数量100と注文1の指値1,200円を入力済み。訂正条件の価格欄は未入力。

操作候補

  • option_00数量に「100」を入力する
  • option_01人へ引き継ぐ
  • option_02OCOの訂正条件価格に「1220」を入力する
  • option_03入力を保留する
  • option_04OCOの訂正条件価格に「1」を入力する

教師ラベル · option_02

OCOの訂正条件価格に「1220」を入力する

{
  "kind": "SET",
  "field": "oco2_input_trigger_price",
  "value": "1220",
  "tab": "oco"
}

出典レコード: sbi-train-oco-9707d3b94b9d-step-08

03 IFDの売却価格を入力する
入力に使う模擬画面:IFDの売却価格を入力する
入力に使う模擬画面 · 画面画像を拡大して見る ↗

AIへの入力

注文条件(要約)
架空銘柄1040を100株、1,200円で買い、その注文が成立したら1,250円で売る。いずれも当日中。
画面の状態
IFDタブで最初の注文価格1,200円などを入力済み。次の売り注文の価格欄は未入力。

操作候補

  • option_00人へ引き継ぐ
  • option_01数量に「100」を入力する
  • option_02IFDの売却価格に「1」を入力する
  • option_03IFDの売却価格に「1250」を入力する
  • option_04入力を保留する

教師ラベル · option_03

IFDの売却価格に「1250」を入力する

{
  "kind": "SET",
  "field": "done_input_price",
  "value": "1250",
  "tab": "ifd"
}

出典レコード: sbi-train-ifd-7b0094b34c69-step-12

04 入力を終えて人へ引き継ぐ
入力に使う模擬画面:入力を終えて人へ引き継ぐ
入力に使う模擬画面 · 画面画像を拡大して見る ↗

AIへの入力

注文条件(要約)
架空銘柄1050を100株、1,200円で買う。成立後は1,250円で売るか、1,150円以下なら1,140円の指値で売る。いずれも当日中。
画面の状態
IFDOCOの入力項目がそろった状態。パスワード入力や注文確定へ進む前に、人へ引き継ぐ。

操作候補

  • option_00入力を保留する
  • option_01数量に「100」を入力する
  • option_02人へ引き継ぐ

教師ラベル · option_02

人へ引き継ぐ

{
  "kind": "HANDOFF",
  "field": null,
  "value": null,
  "tab": "ifdoco"
}

出典レコード: sbi-train-ifdoco-1d6aa9d327b7-step-16

05 数量がなければ入力を保留する
入力に使う模擬画面:数量がなければ入力を保留する
入力に使う模擬画面 · 画面画像を拡大して見る ↗

AIへの入力

注文条件(要約)
架空銘柄1000を指値1,200.50円で現物買い。当日中。株数の指定がない。
画面の状態
通常注文の初期画面。条件に数量が含まれていないため、入力を始めない。

操作候補

  • option_00入力を保留する
  • option_01銘柄コードに「9999」を入力する
  • option_02人へ引き継ぐ

教師ラベル · option_00

入力を保留する

{
  "kind": "NO_ACTION",
  "field": null,
  "value": null,
  "tab": "normal"
}

出典レコード: sbi-train-normal_limit-fba79fff7f57-step-00

5件の元レコードをJSONで見る ↗

学習と軽量化の結果

現在の構成では、Webページの情報(DOM)と画像を入力に使います。正解を含む操作候補を用意した模擬画面で、337回の判断と30件の注文条件を評価しました。条件が有効なものは24件、不備があるものは6件です。

注文は指値、成行、逆指値、OCO、IFD、IFDOCOの6種類です。一つずつの判断と、操作を続けて入力を終える試験を分けて集計しました。

Clefの状態正解と一致した判断全項目一致・人への引き継ぎ
追加学習前(BF16)定量スコアなし定量スコアなし
1回目の学習後(BF16)322/337(95.5%)16/24(66.7%)
2回目の学習後(BF16)337/337(100%)24/24(100%)
軽量化後(NVFP4)337/337(100%)24/24(100%)

1回目は保存レコードの画面情報と画像、2回目と軽量化後はブラウザーDOMと画像で評価しています。学習と入力形式の両方を変えた比較です。追加学習前の定量スコアはありません。当時はDSHのセッションログで、途中停止など、うまく動かない挙動を確認していました。

軽量化後の構成では、不備のある6件は入力を保留しました。全30件の操作記録がそろい、停止位置を越える試行・実行はともに0件でした。

軽量化前後のモデル容量

構成重みの容量元の容量に対する比率
2回目の学習後(BF16)54.97 GB100%
軽量化後(NVFP4・混合精度)23.16 GB42.1%

重みの容量を31.81 GB、57.9%削減しました。元の約42%の容量で、上記の模擬画面試験では判断337/337、全項目一致・人への引き継ぎ24/24を維持しました。

保存済みのテンソル情報から集計した容量です。モデル本体と最終判定ヘッドを含み、1 GB=10億バイトで表しています。

軽量化したClefの準備後、1件ずつ送った336回の問い合わせでは、待ち時間の中央値は0.978秒でした。95%は約1.227秒以内に返りました。

詳しい設定

2回目の学習では、同じ操作例から「画面情報と画像」「画像中心」の2種類の入力を作り、学習の重みを50:50にしました。

軽量化後はMLPにNVFP4、attentionにFP8、画像の読取りと最終判定にBF16を使いました。配信方法で候補番号が異なるため、選んだ操作の内容で比べました。

指示どおりに入力する

DSHに注文条件を文章で渡し、模擬画面に入力させました。次の2例では、入力後に画面を別に読み取り、各項目が指示と一致することを確かめました。

入力した内容

通常注文

指示した条件

架空銘柄0001を東証で現物買い。200株、指値1234.5円、当日中、条件なし。SOR・ポイントを使わない。

別の読み取りで入力値を確認

銘柄・取引
0001 / 東証 / 現物買い
数量
200株
指値
1234.5円
有効期間・条件
当日中 / 条件なし
SOR・ポイント
使わない

OCO注文

指示した条件

架空銘柄0004を現物売り。500株、指値3580円、3320円以下で3310円へ訂正。当日中、SORを使わない。

別の読み取りで入力値を確認

銘柄・取引
0004 / 現物売り
数量
500株
注文1の指値
3580円
訂正の条件
3320円以下
訂正後の指値
3310円
有効期間・SOR
当日中 / SORを使わない

この操作確認は30回の判断、29回の入力でした。Clefへの画像付き問い合わせは59回でした。

操作の設定

依頼はQwen Flash Nextのlow設定、画面の判定はClef NVFP4が担当しました。ブラウザーとアプリの両方の操作経路で、同じBraveを使いました。

映像は、10月15日に収録した別の実行です。数量200が入力済みの時点から、指値価格・当日中・ポイント不使用の設定を映しています。価格条件欄は「選択」のままです。

操作映像

ユーザー収録・35.8秒・無音・等速。画面と操作記録を上下に並べた抜粋です。

MP4を直接開く

もう一つのモデルでの結果

Jev-Omni(BF16)に入力する文へ画面の用語説明を加えると、判断の一致は270/337から322/337に、入力完了と人への引き継ぎは2/24から18/24に増えました。別の18件の条件確認では、10/18から9/18でした。

軽量化は、改善前のモデルで別に比べました。337回の判断のうち、BF16は257回、NVFP4は250回が正解でした。変換したモデルは、保存後に読み直して動作を確認しました。

検証の範囲

検証にはUTM上のmacOSを使っています。画面の役割・位置・現在値を画像と照らし合わせ、確認できた対象を操作します。

ブラウザー5件とアプリ5件を交互に操作する試験は、検証中です。

操作環境について

DSHとUTMを組み合わせた構成からCua Spacesも試し、画面情報の扱いや判断モデルとの接続を手元で調整しやすいUTMへ戻しました。

画面情報の取得に失敗したときもClefに診断を求めます。入力の許可は別に判定し、対象を確認できたときに操作を進めます。

評価データ

Clefの判断と注文入力の評価を保存したデータです。