
问题形式化
- 状态变量:库存 q(t)
- 控制变量:卖出速度 v(t)=−dtdq
- 价格动态: dSt=μdt+σdWt−ηv(t)dt(含永久冲击)
- 目标:最大化期望收益: v(t)maxE[∫0T(St−ηq(t))v(t)dt]
2. 无漂移情况(μ=0 )
- HJB 方程解出:v∗(t)=Tq0=常数
- 直观:无趋势时,拖延无收益,冲击成本最小化 → 匀速。
3. 有漂移情况(μ=0 )
- 最优速度:
v∗(t)=Tq0+2ημ(T−2t)
- 解读:
- 若 μ>0 (上涨趋势):
- 早期 v∗<Tq0 (慢卖,搭顺风车);
- 后期 v∗>Tq0 (加速清仓);
- 若 μ<0 (下跌趋势):
- 全程加速卖出,越早越好。
- 若 μ>0 (上涨趋势):
from future import print_function
import numpy as np
import matplotlib.pyplot as plt
DisplayPlots = True
NIter = 100000
s0 = 20.
q0 = 10000
T = 1.
nt = 1000
delta_t = T/nt
sigma = s0 * 0.05
beta = 1e-6
mu0 = 4 * q0 * beta
nq = 5
np.random.seed(10)
q = np.zeros((nt+1,nq))
for t in range(nt+1):
q[t,0] = q0 * (1. – t/nt)
q[t,1] = np.maximum(q0 * (1. – 5. * t / nt ),0.)
q[t,2] = q0 * (1. – 0.5 * t / nt)
q[t,3] = np.maximum((T – t/nt) * (q0/T – (mu0 / (4 * beta)) * t/nt),0.)
q[t,4] = (T – t/nt) * (q0/T + (mu0 / (4 * beta)) * t/nt)
q[-1,2] = 0
q_labels = [‘linear ‘,’fast linear ‘,’slow linear ‘,’fast quadratic’,’slow quadratic’]
if DisplayPlots:
plt.figure()
plt.plot((1./nt)*np.arange(0.,nt+1),q)
plt.legend(q_labels)
plt.xlabel(‘time’)
plt.ylabel(‘# shares’)
plt.title(‘inventory q(t)’)
plt.show()
for mu in [0, mu0, -mu0]:
print(“\nCASE mu=%1.2f ===================================================================”%(mu))
Pnl = np.zeros((NIter,nq))
for q_ind in range(nq):
Lambda = np.zeros(nt+1)
Lambda[1:] = -(q[1:,q_ind] – q[:-1,q_ind]) / delta_t
for n in range(NIter):
eps = np.random.normal(0, 1, nt + 1)
# mid price
s = s0 + mu * delta_t * np.array(range(0,nt+1)) + sigma * np.sqrt(delta_t) * np.cumsum(eps)
s[0] = s0
p = s – beta * Lambda # best bid price
x = np.cumsum(Lambda * p * delta_t)
Pnl[n,q_ind] = x[-1] + q[-1,q_ind] * s[-1] – (x[0] + q[0,q_ind] * s[0])
AvPnl = np.zeros(nq)
print(“Average Pnl”)
print(“———————————————————-“)
for q_ind in range(nq):
AvPnl[q_ind] = np.mean(Pnl[:,q_ind])
print(“%s\t\t\t%1.2f \t\t\t%1.1f”
%(q_labels[q_ind],AvPnl[q_ind],1e4 * AvPnl[q_ind] / (s0 * q0)))
print(“=============================================================================”)