Я вычисляю 2 скользящие средние по цене акций и нахожу, что они пересеклись. Когда они пересекаются, я хочу показать на графике маркер поверх него.
Чтобы найти кроссоверы, я использую этот код:
idxs = np.argwhere(np.diff(df_status)).flatten()
, где df_status - список с -1, 0 и 1 от двух скользящих средних. Idxs дает мне позицию индекса из df_status, где произошло пересечение.
Проблема в том, что пересечение находится между двумя датами, как показано на рисунке ниже:
Как я могу переместить маркер по центру на пересечении, чем в дату, когда он был обнаружен?
Код для воспроизведения:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
data = [
["2019-12-16", 4.39, 4.02, 5.11],
["2019-12-17", 4.42, 4.08, 5.09],
["2019-12-18", 4.2, 4.11, 5.06],
["2019-12-19", 4.57, 4.18, 5.04],
["2019-12-20", 4.85, 4.27, 5.03],
["2019-12-23", 4.95, 4.36, 5.01],
["2019-12-26", 5.8, 4.54, 5.01],
["2019-12-27", 6.0, 4.74, 5.01],
["2019-12-30", 5.9, 4.92, 5.0],
["2020-01-02", 6.02, 5.11, 5.00]
]
columns = ["day", "price", "SMA_10", "SMA_100"]
df = pd.DataFrame(data, columns=columns)
df['status_SMA_10_SMA_100'] = np.sign(df['SMA_10'] - df['SMA_100'])
idxs = np.argwhere(np.diff(df['status_SMA_10_SMA_100'])).flatten() # get crossovers
fig = plt.figure(figsize=[15, 8])
ax = fig.gca()
plt.grid(True)
plt.plot(df['day'], df['price'])
plt.plot(df['day'], df['SMA_10'])
plt.plot(df['day'], df['SMA_100'])
for marker in idxs:
ax.plot(df['day'][marker], df['SMA_100'][marker], marker='o', markersize=35, alpha=.5)
ax.plot(df['day'][marker + 1], df['SMA_100'][marker], marker='o', markersize=35, alpha=.5)
plt.show()
В этом коде пересечение с индексом 8, но на графике происходит пересечение между индексами 8 и 9. Как я могу расположить маркер между двумя отметками X?