Нет ничего плохого в вашем коде! Однако существует проблема с разрешением:
Параметр where
позволяет выбрать, какие индексы массива price
следует включить. Теперь, когда ваш ценовой массив увеличивается с шагом 1, первое значение, которое нужно включить, равно price[3]
, что равно 21. Таким образом, fill_between
начинается с 21, как вы наблюдаете на своем графике.
Чтобы решить эту проблему вам нужно увеличить разрешение ваших данных . В вашем случае лучше всего сделать ставку go с предложением @ Johan C и просто увеличить разрешение вашей переменной price
, явно указав step
в numpy arange
, например
price = np.arange(display_range1, display_range2, 0.01)
Если по какой-то причине увеличение разрешения price
не является вариантом, вы всегда можете увеличить разрешение вашей Прибыль / Убыток значения через интерполяцию. Это может быть сложно, особенно если ваша get_graph_value
функция не тривиальна. К счастью, приведенный здесь пример довольно прост для решения, поскольку значения линейно растут, и мы можем достичь более высокого разрешения без аппроксимации значений с помощью линейной интерполяции. Numpy здесь вы предоставили np.interp
, который позволяет вычислять кусочно-линейную интерполяцию.
Вот как вы можете использовать np.interp
для решения вашей проблемы разрешения:
# ...
# nothing changes up to here:
def get_graph_value():
graph_values = []
for i in price:
graph_values.append(long_call(i, strike, premium, contracts))
# simply returning a numpy array here, makes things easier
return np.array(graph_values)
def interpolated_values(values):
"""Do a piecewise linear interpolation between the elements of an array
"""
# creating a 'high resolution' version of the price
xvals = np.linspace(np.min(price), np.max(price), 1000)
# now create 'high resolution' (interpolated) version of values
yinterp = np.interp(xvals, price, values)
# return both
return xvals, yinterp
fig, ax = plt.subplots()
# ... simply replace the first fill_between call by these 2 lines:
xvals, yinterp = interpolated_values(get_graph_value())
ax.fill_between(xvals, yinterp, where = xvals>=break_even, color='#3cb371')
В итоге вы получите: