运算符重载,网上很多例子。
最近在学期权定价,期权有一堆风险指标,Greeks。
想用OOP实现,简化代码。但涉及到类加减运算。
直观上,线性组合,Greeks的各分项就应该对应相加。
废话不多说,直接上代码。
class Greeks:
def __init__(self):
"""
TODO 比较各项希腊值跟实务中用到的希腊值的区别
:param delta: 标准delta
:param gamma: 标准gamma
:param vega: 需要/100,才是标的波动率变动1个百分点,期权价值的变动。如vega=1,是标的波动率增加1个百分点,期权变贵0.01块钱
:param theta:
:param rho:
"""
self.delta = 0
self.gamma = 0
self.vega = 0
self.theta = 0
self.rho = 0
def __add__(self, other):
"""
:param other: 只能是greeks
:return:
"""
self.delta += other.delta
self.gamma += other.gamma
self.vega += other.vega
self.theta += other.theta
self.rho += other.rho
return self
def __sub__(self, other):
"""
:param other:
:return:
"""
self.delta -= other.delta
self.gamma -= other.gamma
self.vega -= other.vega
self.theta -= other.theta
self.rho -= other.rho
return self
def __mul__(self, other):
"""
:param other: 只能是标量
:return:
"""
self.delta *= other
self.gamma *= other
self.vega *= other
self.theta *= other
self.rho *= other
return self
def __truediv__(self, other):
"""
:param other: 只能是标量
:return:
"""
self.delta /= other
self.gamma /= other
self.vega /= other
self.theta /= other
self.rho /= other
return self
def __str__(self):
s = """
delta: {delta}
gamma: {gamma}
vega: {vega}
theta: {theta}
rho: {rho}
""".format(
delta=self.delta,
gamma=self.gamma,
vega=self.vega,
theta=self.theta,
rho=self.rho
)
return s
if __name__ == '__main__':
delta = 0.5
gamma = 0.1
vega = 0.3
theta = 0.5
rho = 0.2
greeks_1 = Greeks()
greeks_1.delta = delta
greeks_1.gamma = gamma
greeks_1.vega = vega
greeks_1.theta = theta
greeks_1.rho = rho
greeks_2 = Greeks()
greeks_2.delta = delta
greeks_2.gamma = gamma
greeks_2.vega = vega
greeks_2.theta = theta
greeks_2.rho = rho
greeks_3 = Greeks()
greeks_3.delta = delta
greeks_3.gamma = gamma
greeks_3.vega = vega
greeks_3.theta = theta
greeks_3.rho = rho
print(greeks_1 - greeks_2 - greeks_3)
输出结果如下。
delta: -0.5
gamma: -0.1
vega: -0.3
theta: -0.5
rho: -0.2