ファブリックのプログラミング言語

AmiScript

データ、ロジック、ワークフロー、プレゼンテーションを、同じランタイムの中で1つの一貫したモデルとして扱えます。

ファブリックにおける役割

データ、ロジック、プレゼンテーションを貫く1つの言語

AmiScriptは、アプリケーション・ファブリックのネイティブなプログラミング言語です。データの照会、ビジネスルールの実装、アプリケーション向けの結果の整形に、それぞれ別の言語を使うのではなく、開発者はこれらを同じランタイムの中で記述できます。

この言語は、Java、Python、SQL、文字列テンプレートのなじみのある概念を組み合わせ、金融システム向けの関数とデータ型を加えています。ガバナンスされたデータの照会、リアルタイムイベントの処理、業務固有の計算、書式付き出力の生成、アプリケーション動作の呼び出しが可能です。

言語がファブリック全体で動作するため、レイヤー間を移動する際にロジックを書き直す必要はありません。計算をデータモデルで定義し、ワークフローで再利用し、そのままユーザーインターフェースやレポートに表示できます。同じロジックを、承認されたインターフェースを通じて外部アプリケーションやAIエージェントから呼び出すこともできます。

機能

実際の使い方

Python風の構文で構造化データを定義

AmiScriptは、マップ、リスト、ネストされた構造の定義にPythonに着想を得た構文を採用しています。マーケットデータのスナップショット、プライスラダー、リスクバケット、設定オブジェクトをスクリプト内で直接表現でき、冗長なクラス定義や外部スキーマは不要です。

これらの構造は言語の第一級の要素であるため、変換なしで計算、ビジュアルコンポーネント、永続化レイヤーに直接渡せます。同じ構造で、プライシングロジックへの入力、テーブルへの表示、チャートの描画が可能です。

Map pricingSummary = {
  "ZXZZT": {
    "Open":   489.10,
    "prices": [492.10, 492.10]
  }
};

再利用可能なビジネスロジックを関数としてカプセル化

関数は強い型付けを持ち、オーバーロードが可能で、一度定義すればスクリプト、クエリ、モデル、ビジュアルで再利用できます。想定元本、エクスポージャー、マージン、PnLといった概念は、リスク、トレーディング、レポーティング、コンプライアンスのどのワークフローでも同一に計算されなければなりません。名前付き関数として一元化することで、チーム間でロジックが重複したり微妙に食い違ったりするのを防げます。

言語はプラットフォームのガバナンスされたランタイム内で実行されるため、これらの関数も可観測かつ監査可能であり、システムの他の部分と同じ統制の対象になります。

double NOTIONAL_VALUE(
  Number quantity,
  Number price,
  Number fx
) {
  quantity * price * fx
};

SQLライクな実行でデータにアクセス

AmiScriptはAMI SQLと緊密に統合されており、リアルタイムおよび履歴のデータソースに、直接かつガバナンスされた形でアクセスできます。パラメーター化クエリは、なじみのあるSQL構文で名前付きデータソースに対して実行され、プラットフォームのエンタイトルメント、監査、リネージの枠組みから外れることはありません。

この例では、現在のユーザーコンテキストからテーブルを動的に作成しています。プレースホルダーは実行時に解決されるため、識別子をハードコードすることなく、同じスクリプトが異なるユーザーやセッションに対応します。

create table mycopy AS use DS="ACCOUNT_DATA" execute
  Select * from Accounts
  where Account=="${USERACCOUNT}";

表示用に結果を計算・整形

先に定義したビジネス関数を集計クエリの中で再利用し、組み込みのテンプレート機能で計算結果を書式付きメッセージに埋め込んでいます。計算値は、テーブル、チャート、ツールチップ、ダッシュボード、レポートに直接組み込めます。

整形ロジックは計算と同じ場所にあります。そのため、ユーザーが目にする内容は、別のUIレイヤーで後処理されたものではなく、ガバナンスされた追跡可能なロジックから導かれます。

double totalNotional =
  select sum(NOTIONAL_VALUE(
    qty, px, fxrate))
  from mycopy;

Session.alert(
  "Total value for account ${USERACCOUNT}
   is ${totalNotional}"
);

ライブラリ別に整理された1,500以上の関数

組み込みライブラリは、データアクセス、集計、時系列分析、金融計算、書式設定、エンタイトルメント、セッション制御、システム連携を扱う分野別モジュールで構成されており、一般的なプリミティブを再実装する必要はありません。各項目からリファレンスドキュメントにリンクしています。

ライブラリ例金融での用途
三角関数acos(value)価格系列における季節性のモデリングと波形分析
バイナリbitShiftLeft(n, shiftAmount)ユーザーやデスクごとのビットマスク形式のエンタイトルメントフラグのエンコードとデコード
色彩clrGetAlpha(color)PnLの大きさやエクスポージャー水準に応じたリスクヒートマップの配色スケールの生成
日付と時刻datePart(unixEpochMillis, part, timezone)決済日の計算と、タイムゾーンをまたぐ取引時間のフィルタリング
エンコーディングdecodeDouble64(value)低レイテンシのティックフィードやFIXプロトコルフィードに含まれるバイナリ価格フィールドのデコード
数学exp(x)連続複利、ディスカウントファクター、イールドカーブの構築
パースjsonExtract(json, xpath)プライシングAPIのレスポンスやリファレンスデータのペイロードからのフィールド抽出
運用logWarn(message)コンプライアンス上重要なワークフローの各段階としきい値超過を監査証跡として記録
データパースparseXlsx(data, firstLineIsHeader)トレードブロッター、ファンドのNAVレポート、静的データファイルのExcelからの取り込み
差分percentChange(old, nuw)日次リターン、日中の価格変動、ベンチマークとの乖離の計算
書式設定quote(text)銘柄識別子、通貨、動的SQLクエリ文字列の書式設定
乱数randGaussian()VaRやストレステストのためのモンテカルロシナリオ生成
丸めroundNearest(value, bucketSize)価格を最小ティックサイズに、数量を売買単位に合わせる処理
暗号signDataMac(data, key, algorithm)送信する注文メッセージへの署名と、取引所APIリクエストの認証
文字列操作strAfter(text, toFind, origIfNotFound)銘柄コードの解析と、複合識別子からのISINやティッカーの抽出
時間計測timestampNano()執行品質分析のためのナノ秒精度のレイテンシ計測
アドレス管理urlDecode(url)マーケットデータやリファレンスデータのAPIへのRESTコールの構築とデコード
平均avgGauss(value, variance)加重平均価格、VWAP、ノイズを平滑化したポジション集計
グリークスbeta(value1, value2)ベンチマークに対するポートフォリオのベータ、ファクター感応度、ヘッジ比率の計算
連結catUniqueLimit(value, delim, limit)取引や注文バケットごとに、重複のないカウンターパーティや執行市場のリストを集約
統計percentileDisc(value, percent)ポジション全体に対する、所定の信頼水準でのバリュー・アット・リスク
クラスタリングkmeansCluster(nClusters, seed, values)リスクプロファイル、セクターエクスポージャー、顧客行動によるポートフォリオのセグメント化
リサンプリングresample(x, y, xq, linearOrSpline)チャート表示やバックテストのため、ティックデータを均一なOHLCバーに正規化

言語に組み込まれたAI

AmiScriptからAIを呼び出す

モデルの呼び出しは、関数の呼び出しです。 session.promptAiは、データを生成したコールバック、タイマー、トリガーの内部から、指示とライブデータの一部を組織で設定されたプロバイダーに渡し、回答を文字列として返します。行の分類、フィルタリングした結果セットの要約、構造化フィールドの抽出を、それらを生成したロジックから離れることなく行えます。

これは会話ではなく、単発のブロッキング型の補完です。指示は1つ、回答も1つで、ツールもエージェントループもありません。認証情報がスクリプトに現れることはありません。プロバイダーとそのキーは、デプロイメント自体の設定からサーバー側で解決されます。すべての呼び出しはチャットボットのアクティビティとともに監査ログに記録されるため、スクリプトから使うAIも同じ統制の下に置かれ、同じ場所で確認できます。

AIが無効になっている場合やプロバイダーに接続できない場合、呼び出しはスクリプトを失敗させずにnullを返します。そのため、AIが利用できるかどうかにかかわらず、アプリケーションは動作し続けます。

// 'alerts' is a table or result available in this scope
Map options = {"system": "You are a trading-risk analyst. Be concise.", "max_tokens": 500};
List data = [alerts];
String summary = session.promptAi("anthropic", "claude-opus-4-8", options, data,
    "Summarize the top risks in the attached alert rows in three bullet points.");

if (summary != null) {
  session.log(summary);
}

活用の場

既存のIDEで開発

開発者は、別の環境ではなく、チームが使うソースコード、リポジトリ、テストツール、レビュープロセスと並べて、普段の作業環境でAmiScriptを記述できます。

  • エディターで:VS Code拡張機能が、プラットフォーム自身のパーサーに基づく補完、診断、ステップ実行デバッグを提供
  • AIコーディングツールで:3forge Pluginが、Claude Code、Codex、GitHub CopilotにAmiScriptの記述、レビュー、デバッグのためのスキルとエージェントを提供
  • 稼働中のデプロイメントに基づく:MCPサーバーを通じて、どちらも実際にデプロイされているスキーマ、プロシージャ、ランタイムオブジェクトを参照
  • ガバナンスされた単一のインターフェース:変更を手で書いてもアシスタントが提案しても同じツールと権限が適用され、すべての呼び出しが認証・監査される

3forge Pluginを見る

Visual Studio Codeで開いたAmiScript。スクリプトのシンタックスハイライトと、サイドバーの3forge拡張機能
Visual Studio CodeでのAmiScript。

続きを読む

AmiScriptはファブリックの内部で動き、Pythonは外部からアクセスします。

リサーチ、自動化、本番サービスのためのプログラマブルなインターフェース。