一、BLP模型介绍

BLP模型是以Berry、Levinsohn和Pakes三位学者的姓氏命名的经济学模型。该模型主要应用于市场行为分析、竞争政策制定等领域。BLP模型的基本思想是,消费者是有理的,他们会根据价格、质量等因素来决定是否购买商品。针对不同的消费者和商品组合,构建了一个大规模离散选择模型(demand side),再根据厂商的生产成本,构建了一个大规模离散选择模型(supply side),通过求解这两个模型,可以得到市场的均衡价格和数量。

二、BLP模型构建

1、市场需求模型(demand side)

    import numpy as np
    import pandas as pd
    import scipy.stats
    from scipy.optimize import minimize
    from scipy.sparse import diags
    from scipy.linalg import inv
    from scipy.sparse.linalg import inv as sparse_inv

    class BLPModel:
        def __init__(self):
            self.product_df = None
            self.alpha = None
            self.beta = None
            self.xi = None
            self.rho = None
            self.S = None
            self.d = None
            self.Z = None
            self.price = None
            self.market_share = None
        
        def utility(self, beta, xi, product_df):
            return np.dot(product_df, beta) + xi
        
        def market_share(self, alpha, p, xi, rho, demand_df):
            delta = self.utility(self.beta, xi, self.product_df)
            non_diag_element = -scipy.stats.norm.ppf(demand_df['market_share'])
            diag_element = np.multiply(rho ** (demand_df['market_id'] - 1), demand_df['market_size'])
            Omega = diags([diag_element], [0], shape = (len(self.product_df), len(self.product_df))).toarray()
            S = np.dot(np.dot(scipy.linalg.sqrtm(Omega), self.S), scipy.linalg.sqrtm(Omega))
            v = alpha + np.dot(self.Z, self.delta) + non_diag_element
            D = np.dot(np.dot(self.Z, S), self.Z.T)
            return scipy.linalg.inv(np.identity(len(demand_df)) - np.dot(np.dot(D, Z), S))

        def loglikelihood(self, alpha, beta, xi, rho, demand_df):
            p = self.price
            market_share = self.market_share(alpha, p, xi, rho, demand_df)
            pass
        
        def fit(self, product_df, demand_df, alpha0, beta0, xi0, rho0):
            self.product_df = product_df
            self.alpha = alpha0
            self.beta = beta0
            self.xi = xi0
            self.rho = rho0
            self.S = np.cov(product_df.T)
            self.d = np.zeros(len(product_df))
            self.Z = np.ones((len(demand_df), len(alpha0) + len(product_df)))

            minimize_fun = lambda x: -self.loglikelihood(x[0], x[1:len(self.beta) + 1], x[len(self.beta) + 1:len(self.beta) + 1 + len(self.xi)], x[-1], demand_df)
            
            x0 = np.concatenate([self.alpha, self.beta, self.xi, np.array([self.rho])])
            minimize_result = minimize(minimize_fun, x0)
            self.alpha = minimize_result.x[0]
            self.beta = minimize_result.x[1:len(self.beta) + 1]
            self.xi = minimize_result.x[len(self.beta) + 1:len(self.beta) + 1 + len(self.xi)]
            self.rho = minimize_result.x[-1]
        
        def predict(self, price):
            pass

2、市场供给模型(supply side)

    class Producer:
        def __init__(self, product_list, cost_list):
            self.product_list = product_list
            self.cost_list = cost_list
        
        def profit(self, price_list):
            revenue_list = np.multiply(price_list, self.product_list)
            cost_list = np.multiply(self.cost_list, self.product_list)
            profit_list = np.subtract(revenue_list, cost_list)
            return np.sum(profit_list)
        
        def marginal_cost(self, price_list):
            revenue_list = np.multiply(price_list, self.product_list)
            return np.add(revenue_list, (-1 * self.cost_list))

三、BLP模型应用举例

1、以汽车市场为例

假设市场上有N家汽车制造商,每家制造商都会生产M种车型。我们假设市场上的所有汽车都是同质的,但它们的品质存在差异。假设市场上有K个属性(价格、油耗、安全性、舒适度等等),而每辆汽车的这些属性都是不同的。在这个基础上,我们构建市场需求模型和市场供给模型,以求解市场均衡价格和数量。

2、以电视机市场为例

类似地,我们可以将BLP模型应用于电视机市场。假设市场上有N家电视机制造商,每家制造商都会生产M种型号电视机。市场需求模型和市场供给模型的构建方式和汽车市场相似,只不过属性不同。假设市场上有K个属性(尺寸、分辨率、价格等等),而每个型号电视机的这些属性都是不同的。