--- id: wiki-2026-0508-dynamic-pricing title: Dynamic Pricing category: 10_Wiki/Topics status: verified canonical_id: self aliases: [동적 가격 책정, 변동 가격제, Surge Pricing] duplicate_of: none source_trust_level: A confidence_score: 0.9 verification_status: applied tags: [economics, pricing, monetization, ml] raw_sources: [] last_reinforced: 2026-05-10 github_commit: pending tech_stack: language: Python framework: scikit-learn / XGBoost --- # Dynamic Pricing ## 매 한 줄 > **"매 가격은 매 순간 다르다"**. 매 수요·재고·시간·세그먼트 signal 의 기반에서 매 price 가 매 real-time 의 조정. 매 Uber surge, 매 airline yield management, 매 2026 게임 IAP A/B price 의 mainstream. ## 매 핵심 ### 매 입력 signal - **수요 (Demand)**: 매 search volume, 매 conversion rate, 매 cart-add rate. - **공급 (Supply / Inventory)**: 매 남은 stock, 매 server capacity. - **시간 (Time)**: 매 hour-of-day, 매 day-of-week, 매 holiday. - **사용자 segment**: 매 LTV tier, 매 churn risk, 매 region 의 PPP. - **경쟁사 price**: 매 web scraping 의 competitor catalog. ### 매 알고리즘 family - **Rule-based**: 매 if (inventory < 20%) then price *= 1.3. - **Elasticity model**: 매 demand curve 의 fit → 매 revenue-maximizing point 의 추출. - **Bandit / RL**: 매 contextual bandit 의 사용 — 매 explore vs exploit. - **Deep learning**: 매 transformer 의 시퀀스 → 매 next-period price prediction. ### 매 응용 1. Airline / hotel yield management (매 origin domain). 2. Ride-sharing surge (Uber, Lyft). 3. E-commerce flash sale + personalized coupon. 4. Game IAP regional pricing + LTV tier offer. ## 💻 패턴 ### Elasticity 추정 (log-log regression) ```python import numpy as np import statsmodels.api as sm # price, qty observed across past promotions log_p = np.log(prices) log_q = np.log(quantities) X = sm.add_constant(log_p) model = sm.OLS(log_q, X).fit() elasticity = model.params[1] # 매 typical -1.2 ~ -2.5 print(f"Price elasticity: {elasticity:.2f}") ``` ### Revenue-maximizing price (constant elasticity) ```python def optimal_price(cost, elasticity): """매 monopoly markup formula: P* = c * e/(e+1) for e<-1""" if elasticity >= -1: raise ValueError("Inelastic demand — revenue unbounded") return cost * elasticity / (elasticity + 1) print(optimal_price(cost=2.0, elasticity=-1.5)) # → 6.0 ``` ### Contextual bandit (LinUCB) ```python import numpy as np class LinUCB: def __init__(self, n_arms, n_features, alpha=1.0): self.alpha = alpha self.A = [np.eye(n_features) for _ in range(n_arms)] self.b = [np.zeros(n_features) for _ in range(n_arms)] def select(self, context): ucb = [] for a in range(len(self.A)): A_inv = np.linalg.inv(self.A[a]) theta = A_inv @ self.b[a] mu = context @ theta sigma = self.alpha * np.sqrt(context @ A_inv @ context) ucb.append(mu + sigma) return int(np.argmax(ucb)) def update(self, arm, context, reward): self.A[arm] += np.outer(context, context) self.b[arm] += reward * context ``` ### XGBoost demand forecaster ```python import xgboost as xgb import pandas as pd features = ["price", "hour", "dow", "is_holiday", "competitor_price", "inventory", "user_ltv_tier", "region_ppp"] dtrain = xgb.DMatrix(df[features], label=df["units_sold"]) params = {"objective": "reg:squarederror", "max_depth": 6, "eta": 0.1} model = xgb.train(params, dtrain, num_boost_round=300) def expected_revenue(price, ctx): ctx2 = {**ctx, "price": price} qty = model.predict(xgb.DMatrix(pd.DataFrame([ctx2])))[0] return price * qty ``` ### Personalized price (LTV tier) ```python def personalized_price(base_price, user): tier = user["ltv_tier"] # "whale", "dolphin", "minnow" region_factor = REGION_PPP[user["country"]] # 매 0.4 ~ 1.2 tier_factor = {"whale": 1.0, "dolphin": 0.85, "minnow": 0.6}[tier] return round(base_price * region_factor * tier_factor, 2) ``` ### Surge guardrails ```python def safe_surge(base, raw_multiplier): # 매 PR backlash 의 prevent capped = min(raw_multiplier, 3.0) floored = max(capped, 0.7) return base * floored ``` ### A/B price test (Bayesian) ```python import numpy as np from scipy.stats import beta def bayesian_ab(buyers_a, visitors_a, buyers_b, visitors_b, n_sim=100_000): a = beta(1 + buyers_a, 1 + visitors_a - buyers_a).rvs(n_sim) b = beta(1 + buyers_b, 1 + visitors_b - buyers_b).rvs(n_sim) return float(np.mean(b > a)) # 매 P(B > A) ``` ## 매 결정 기준 | 상황 | Approach | |---|---| | 매 stable demand, 매 cost-plus | Rule-based + manual ladder | | 매 elastic, 매 abundant data | Elasticity model + grid search | | 매 cold start, 매 many SKUs | Contextual bandit | | 매 high-stakes (regulated) | Constrained optimization + audit log | **기본값**: 매 elasticity model 의 시작, 매 enough data 의 수집 후 contextual bandit 의 graduate. ## 🔗 Graph - 부모: [[게임 수익화 모델]] - 변형: [[Surge Pricing]] - 응용: [[IAP_In_App_Purchase]] · [[Live-ops]] ## 🤖 LLM 활용 **언제**: 매 elasticity 추정 의 EDA, 매 price ladder design, 매 A/B test 의 statistical analysis. **언제 X**: 매 production pricing decision 의 single LLM call — 매 hallucination risk 의 too high. ## ❌ 안티패턴 - **Race-to-bottom**: 매 competitor 의 blind matching → margin collapse. - **Surge backlash**: 매 cap 없는 multiplier → user trust 의 손상 (매 Uber NYE 8x 의 사례). - **Personalization 의 leak**: 매 same item 의 different price 의 user-visible → fairness backlash. - **Cold-start naïveté**: 매 new SKU 에 매 zero data 의 RL 의 직접 deploy → wild swing. ## 🧪 검증 / 중복 - Verified (Phillips 2005 *Pricing and Revenue Optimization*; Uber Engineering blog 2023). - 신뢰도 A. ## 🕓 Changelog | 날짜 | 변경 | |---|---| | 2026-05-08 | Phase 1 | | 2026-05-10 | Manual cleanup — full content with elasticity, bandit, A/B patterns |