auction-winners-curse-haircut について
オークションの勝者の呪いによる割引を見積もる意思決定支援スキルです。価値の種類、情報を持つ入札者数、シグナルのばらつきから評価額を調整し、分類と入力検証を明示します。
主な機能
- 01共通価値・私的価値・混合価値の分類
- 02上限付き評価額割引の計算
- 03私的価値の評価額を維持
- 04入力検証と根拠の出力
活用シーン
- 01共通価値オークションの評価額調整
- 02入札者固有の価値を持つ対象の処理
- 03混合価値のオークション機会の比較
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ lyndonkl/ claude --skill auction-winners-curse-haircutインストール後、Claude Code で/auction-winners-curse-haircutを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
resources/methodology.mdtemplate.mdresources/evaluators/rubric_auction_winners_curse_haircut.json詳細
オークションの勝者の呪いによる評価額の割引
目次
例
シナリオ:入札者は対象の価値をraw_valuation = $30と見積もっています。情報を持つ入札者6名が競合しています。入札者間の見積もりには中程度のばらつきがあります(signal_dispersion = 100中の40)。対象はよく知られたコモディティです(全員が同様にモデル化しています)。
入力:
raw_valuation:30value_type:common_valuen_informed_bidders:6signal_dispersion:40
割引率の計算:
haircut_pct = min(35, 10 + log(6) x 5 + 40 x 0.2)
= min(35, 10 + 1.792 x 5 + 8)
= min(35, 10 + 8.96 + 8)
= min(35, 26.96)
= 26.96 (clamped below 35 ceiling)
出力:
adjusted_valuation= 30 x (1 - 0.2696) = $21.91haircut_pct= 26.96classification_rationale:「6名の情報を持つ入札者がおり、シグナルのばらつきが中程度の共通価値の対象です。落札は過大評価を示す重要な証拠です。Kagel-Levinの実験範囲(15~30%)を適用します。」applied:true
対比 -- 私的価値の場合:同じraw_valuation = $30でも、value_type = private_value(対象はこの入札者にとって特有の価値があります)とします。割引率 = 0。調整後の評価額 = $30。適用 = false。理由:「情報の非対称性による割引はありません。他の入札者が対象を同様に評価していないため、落札は不利な情報にはなりません。」
ワークフロー
このチェックリストをコピーして、進捗を記録してください。
Winner's-Curse Haircut Progress:
- [ ] Step 1: Classify value_type (common / private / mixed)
- [ ] Step 2: Validate inputs (range checks, N >= 1)
- [ ] Step 3: Short-circuit for private-value
- [ ] Step 4: Compute haircut_pct via formula
- [ ] Step 5: Apply haircut to raw_valuation
- [ ] Step 6: Emit structured output with rationale
ステップ1:value_typeを分類する
分類は判断を要するため、必ず明示してください。呼び出し元が値を渡す必要があります。このスキルはresources/template.mdの決定木に基づいて選択を検証します。
-
common_value-- 情報が共有され、基礎となる数量が同じであるため、対象の価値はすべての入札者にとって同程度です(例:ウェーバーの指名クローザー、注目選手のメジャー昇格、公開買い付けの上場株式、流動性の高いコモディティ) -
private_value-- 適合性、相乗効果、または個人的な好みによって、この入札者にとっての対象の価値が他の入札者より明らかに高い(または低い)場合です(例:すでに保有しているリリーフ投手のセットアッパー、打線に合うプラトーン要員、すでに所有している物件の隣の家) -
mixed-- 対象に共通価値の部分と、私的価値による上乗せ分があります(例:シーズン終盤のFAABで好調な打者を獲得する場合。全員が基本予測に同意している一方、入札者固有のカテゴリーニーズが上乗せされます)
ステップ2:入力を検証する
-
raw_valuationが有限の非負数である -
value_typeが許可された3つの文字列のいずれかである -
n_informed_biddersが1以上の整数である(50など極端な場合は上限でクランプする) -
signal_dispersionが[0, 100]の範囲内である
ステップ3:私的価値の場合は早期終了する
value_type == "private_value"の場合は、数式の適用を完全にスキップします。
haircut_pct = 0adjusted_valuation = raw_valuationapplied = false
この早期終了が正しいベイズ的な理由については、resources/methodology.mdを参照してください。
ステップ4:割引率を計算する
common_valueの対象の場合:
haircut_pct = min(35, 10 + log(N) x 5 + signal_dispersion x 0.2)
min(35, ...)の上限により、Nとばらつきが極端に大きい場合でも、割引率は最大35%に制限されます。これは、Kagel-Levinの経験的な推定値が30%を超えることはまれであるためです。35%は外側の上限です。
mixedの対象の場合は、次のように補間します。
mix_common_weight = 0.6 (default; caller may override)
mix_private_weight = 1 - mix_common_weight
haircut_pct = mix_common_weight x (common_value_haircut) + mix_private_weight x 0
数式の考え方については、resources/methodology.mdを参照してください(log-Nは競合相手が増えるほど深刻化する逆選択を捉え、線形のdispersion項は入札者の見積もりの分散を捉えます)。
ステップ5:割引を適用する
adjusted_valuation = raw_valuation x (1 - haircut_pct / 100)
ステップ6:構造化された出力を返す
次を返します。
{
"adjusted_valuation": <number>,
"haircut_pct": <number in [0, 35]>,
"classification_rationale": "<one-sentence justification>",
"applied": <bool>
}
resources/evaluators/rubric_auction_winners_curse_haircut.jsonを使用して検証してください。最低基準:平均スコアが3.5以上であること。
よくあるパターン
パターン 1:共通価値が高い対象に多くの入札者が集まる場合
- 例:ファンタジー FAAB でのトップ 100 見込み選手の昇格(N=6-8)、注目度の高いイベントに関する予測市場の契約、多数の投資銀行が担当する M&A 対象企業
- 一般的な入力値:N は [5, 10]、signal_dispersion は [30, 60]
- 一般的なヘアカット:22-32%
- 理由:逆選択が強く働きます。落札できたということは、ほぼ確実に、類似した推定を行った多数の入札者の中で自分の評価が最も高かったことを意味します。
- 注意点:ファーストプライス入札での価格引き下げと二重に計上しないでください。これらは独立した補正です(価格引き下げについては
auction-first-price-shadingを参照してください)。
パターン 2:私的価値の補完要素(ハンドカフ)
- 例:自分のクローザーの控えリリーフ投手、すでに所有している土地に隣接する土地、自分のコレクションにだけ合うパズルのピース
- 一般的な入力値:N = 1-2、value_type =
private_value - 一般的なヘアカット:0%(処理を短絡)
- 理由:逆選択はありません。ほかの人は実際にその対象を低く評価しているため、落札できたからといって自分の評価が高すぎたことを示すわけではありません。
- 注意点:私的価値があるという主張が実態に即しているか確認してください。ほかに 3 人の入札者も補完的な用途を持っているなら、共通価値に近いものです。
パターン 3:シーズン終盤の混合型ストリーミング獲得
- 例:誰もが予測に同意する好調な打者だが、自分が必要とする特定のカテゴリーに合致する場合。共通の CPC 基準値がある広告オークションのキーワードだが、入札者ごとにコンバージョン率の上昇幅が異なる場合
- 一般的な入力値:N は [3, 5]、signal_dispersion は [20, 40]、value_type =
mixed、mix_common_weight は 0.5-0.7 程度 - 一般的なヘアカット:10-18%
- 理由:一部は逆選択で、一部は私的価値です。
- 注意点:共通価値と私的価値の割合を明示的に推定して記録してください。明確に二分できる場合に、デフォルトで mixed を選ばないでください。
パターン 4:参加者の少ないオークションでの共通価値(N が小さい場合)
- 例:小規模なオークションプール(N = 2)でのニッチな共通価値対象
- 一般的な入力値:N = 2、分散は任意
- 一般的なヘアカット:14-18%
- 理由:入札者が 2 人しかいなくても、共通価値の勝者の呪いは働きます。落札できたということは、情報を持つもう一方の推定を上回ったことを意味します。ただし、逆選択の深刻度は log(N) に応じて高まるため、大規模な場合より影響は小さくなります。
- 注意点:N が小さいというだけでヘアカットを 0 にしないでください。私的価値とするには、価値のばらつきに関する別個の根拠が必要です。
ガードレール
-
分類は明示的でなければなりません。 他の入力から
value_typeを暗黙に推測しないでください。呼び出し元が値を渡し、このスキルが検証します。分類がない、または曖昧な場合は、デフォルト値を使うのではなく、エラーとして扱います。 -
プライベートバリューの場合は、常に処理を短絡します。 呼び出し元がプライベートバリューと指定した場合、N が大きくてもヘアカットはゼロです。これは適切な動作です。他者が対象を本当に低く評価しているのであれば、他者の入札額には、あなた自身の見積もりに関する逆選択の情報が含まれていないためです。
-
このヘアカットを、他の勝者の呪い補正と重ねて適用しないでください。 すでにベイズ的な入札額シェーディング(例:auction-first-price-shading の N 入札者向けシェード)を適用している下流システムは、別の現象(期待余剰を得るための戦略的な入札額シェーディング)を補正しています。両方を適用してください。ただし、どちらも二重に適用しないでください。
-
35%を上限とします。 Kagel-Levin の実証範囲は15〜30%です。35%の上限は、N が非常に大きく分散も大きい場合に余裕を持たせつつ、式によって不合理な割引(例:80%)が生じるのを防ぎます。
-
N >= 1 とします。 N = 1 は入札者が1人だけであることを意味します。
log(1) = 0なので、式の結果はhaircut_pct = 10 + signal_dispersion x 0.2となります。真の買い手独占(競合する情報を持つ入札者がいない場合)では、逆選択のメカニズムは競合相手なしには存在しないため、呼び出し元は代わりにprivate_valueを渡してください。 -
シグナルの分散は測定値ではなく代理指標です。 実際には直接観測できることはほとんどありません。類似するオークションの過去の入札額のばらつき、公開予測システム間の不一致、または公開情報の非対称性の度合いから推定してください。推定根拠を記録してください。
-
混合バリューには明示的な重みが必要です。 0.6を暗黙のデフォルト値として使わないでください。呼び出し元は、共通価値とプライベートバリューの比率、およびその根拠を示してください。それができない場合は、
mixedではなく、保守的にcommon_value、または積極的にprivate_valueと分類してください。 -
ドメインに依存しない契約です。 このスキルは FAAB、ファンタジーベースボール、または特定のオークション環境について把握していません。呼び出し元はドメイン固有の入力を汎用の4フィールド契約に変換し、このスキルは呼び出し元が解釈する汎用出力を返します。
クイックリファレンス
基本式:
if value_type == "private_value":
haircut_pct = 0
applied = false
elif value_type == "common_value":
haircut_pct = min(35, 10 + log(N) x 5 + signal_dispersion x 0.2)
applied = true
elif value_type == "mixed":
common_haircut = min(35, 10 + log(N) x 5 + signal_dispersion x 0.2)
haircut_pct = mix_common_weight x common_haircut # default 0.6
applied = true
adjusted_valuation = raw_valuation x (1 - haircut_pct / 100)
ヘアカットの参照値(common_value、概算):
| N | 分散=0 | 分散=25 | 分散=50 | 分散=100 |
|---|---|---|---|---|
| 1 | 10.0% | 15.0% | 20.0% | 30.0% |
| 2 | 13.5% | 18.5% | 23.5% | 33.5% |
| 4 | 16.9% | 21.9% | 26.9% | 35.0%(上限) |
| 6 | 19.0% | 24.0% | 29.0% | 35.0%(上限) |
| 8 | 20.4% | 25.4% | 30.4% | 35.0%(上限) |
| 12 | 22.4% | 27.4% | 32.4% | 35.0%(上限) |
入力契約:
| フィールド | 型 | 範囲 | 必須 |
|---|---|---|---|
raw_valuation | 数値 | >= 0 | はい |
value_type | 文字列 | common_value / private_value / mixed | はい |
n_informed_bidders | int | >= 1 | はい |
signal_dispersion | 数値 | [0, 100] | はい |
mix_common_weight | 数値 | [0, 1] | mixed の場合のみ(デフォルトは0.6) |
出力契約:
| フィールド | 型 | 範囲 |
|---|---|---|
adjusted_valuation | 数値 | [0, raw_valuation] |
haircut_pct | 数値 | [0, 40] |
classification_rationale | 文字列 | 1文 |
applied | bool | プライベートバリューの場合に限り false |
主なリソース:
- resources/template.md:分類判断ツリー(共通価値とプライベートバリューと混合価値)、具体例(クローザー=共通価値、ハンドカフ=プライベートバリュー、シーズン終盤の好調な打者=混合価値)、入出力テンプレート
- resources/methodology.md:Kagel & Levin の実験的エビデンス、ベイズ事後分布の正式な導出、log-N と分散の直感的な説明、ファンタジーFAABの例を使った価値タイプの分類ヒューリスティクス、プライベートバリューのヘアカットがゼロとなる理由
- resources/evaluators/rubric_auction_winners_curse_haircut.json:8項目の品質評価基準