Playground 15:dynamic pricingの実験室
計量経済学II(ブラウザ上でRが動きます)
- このページのRコードは、あなたのブラウザの中で動いている(WebAssembly + webR)。インストールは一切不要。
- 初回だけ、ページ読み込みに30秒〜1分かかる(R本体とパッケージのダウンロード)。2回目以降はキャッシュで速くなる。
- 各セルのコードは自由に書き換えて「Run Code」で実行できる。何をどう壊しても誰にも迷惑はかからない。おかしくなったらページを再読み込みすれば元に戻る。
- このページのセルは第13回のbackward inductionを回すので、1回の実行に数秒かかることがある。慌てず待とう。
- 元ネタは講義ノート(
lecture15.html)。ここでは「数値をいじって挙動を体感する」ことに集中する。
実験1:最適価格の地図 — backward inductionが1枚の絵になる
航空券1路線を考える。状態は「残り日数 \(t\)」と「残り座席 \(c\)」。毎期、確率 lambda_bar で客が1人現れ、来た客は提示価格 \(p\) に対してlogitで買うかどうかを決める。両者を掛けた1期あたりの購買確率が \(\lambda(p)\) だ。企業が解くのは、第13回で学んだ形のBellman方程式1本である。
\[ V(t, c) = \max_p \{ \lambda(p) [ p + V(t-1, c-1) ] + (1 - \lambda(p)) V(t-1, c) \} \]
1期のevent treeは2枝だけだ。売れる枝は確率 \(\lambda(p)\)、今期収入 \(p\)、次期状態 \((t-1,c-1)\)。売れない枝は確率 \(1-\lambda(p)\)、今期収入0、次期状態 \((t-1,c)\)。「確率×(今期収入+継続価値)」を2枝について足したものが上の式である。
今売る機会費用(bid price)は
\[ b(t,c)=V(t-1,c)-V(t-1,c-1) \]
である。同時点差 \(V(t,c)-V(t,c-1)\) は期首に追加1席を持つ価値で、販売FOCへ直接入るbid priceとは時間添字が違う。来た客の購買確率を \(s(p)\) とすると、連続価格の内部解は \(p^*(t,c)=b(t,c)+1/[\alpha\{1-s(p^*(t,c))\}]\)。「静学最適価格+bid price」という単純な足し算ではなく、bid priceを限界費用の位置へ入れた新しい固定点だ。
境界条件は「席が尽きたら以後の収益ゼロ、期限が来たらゼロ」。これを \(t\) の小さい方から順に埋めていくと、すべての状態での最適価格 \(p^*(t,c)\) が1枚の地図になる。図では横軸を右へ行くほど残り日数が長く、縦軸を上へ行くほど残り座席が多い。したがって、右下(時間はたっぷり・席はわずか)ほど高く、左上(締切間近・席が余っている)ほど安くなるはずだ。bid priceがほぼ0の領域では、動学FOCはこの仕様の静学FOCに近づく。
C_capacity <- 40(容量を倍増)にすると、地図の色はどう変わるか。予想してから実行しよう。希少性が消えた領域では地図はほぼ一色になる。lambda_bar <- 0.5(需要が弱い路線)にすると、高価格の領域はどこまで後退するか。0.95との地図の違いを見比べよう。- 出力の数字を使い、同じ「ラスト1席」でも残り30日と残り1日で価格がどう違うかを比較しよう。固定された古い数値を覚えるのでなく、今のパラメータで再計算された差を「その席を今売らずに取っておく価値(機会費用)」で説明してみよう。
実験2:動的価格 vs 最適固定価格 — 優位はどこから来るか
動的価格の最適固定価格に対するリフトは、需要と在庫の設定次第で変わる。Gallego and van Ryzinのベンチマークは、一定の条件と大規模極限で固定価格型ヒューリスティックが動的最適へ近づくことを示すが、すべての市場で同じリフトになるという定理ではない。ここでは、シーズンごとに需要の水準(到着率)がブレる世界を作る。企業は動的・固定のどちらの方式でも平均の到着率しか知らずに価格を設計する。条件は同じで、違いはただ1つ、動的価格だけが売れ行き(残り在庫)を見て走りながら軌道修正できることだ。同じ乱数の客の列を両方式にぶつけて、シーズン収入の分布を比べる。
sigma_demand <- 1(需要が大荒れの世界)にすると、リフトと2つのヒストグラムの形はどう変わるか。C_capacity <- 10(在庫がタイトな路線)にするとリフトはどうなるか。逆にC_capacity <- 30(在庫だぶだぶ)なら。「需要の変動性」と「在庫の逼迫度」がRM導入の判断軸だ、という講義の主張を自分の目で確かめよう。- 問い:
sigma_demand <- 0(需要が完全に安定した世界)にすると、動的価格の優位はどれくらい残るか。ゼロにはならないはずだが、それはなぜか。到着と購買という「コイン投げ」のゆらぎが残っていることに注意して考えよう。
実験3:需要推定の誤差が収入を蝕む
コースの締めくくり。第2回から積み上げてきた需要推定の「誤差」は、消えてなくなるのではなく、価格政策を通じて収入ロスという金額に変換される。ここでは切片 \(\theta_0\) を真値に固定し、価格感応度 \(\alpha\) だけを \((1+e)\) 倍に見誤る一変数感度分析を行う。その値で価格政策を作り、政策を真のモデルの上で走らせたときの期待収入を厳密に計算する。誤差 \(e\) がゼロならロスもゼロ。曲線がどれだけ深く、そして左右にどれだけ非対称かを読もう。実際の推定では \(\theta_0\) と \(\alpha\) の双方が動くため、講義ノートのモンテカルロでは同時推定誤差を評価している。
C_capacity <- 10(在庫がタイトな路線)にすると、ロス曲線は深くなるか浅くなるか。予想してから実行しよう。err_max <- 0.6に広げる、あるいはalpha_true <- 0.09(もともと価格に敏感な市場)にすると、曲線の形はどう変わるか。- 問い:弾力性を20%見誤ると、収入は何%失われるか。出力から読み取ろう。高めに見誤って安売りするのと、低めに見誤って強気の価格をつけるのとで、痛さは同じだろうか。推定の精度は、そのままカネに直結する。これがこのコースの最後のメッセージだ。
次に読むもの
- 講義ノート本体:
lecture15.html(revenue management・surge pricing・推定→最適化パイプラインの完全版) - coding課題:
assignment15.qmd(予約データの生成→backward induction→推定誤差が収益ロスへ変換される過程を、自分の手で一周する)