import pylunar
import pandas as pd
import matplotlib.pyplot as plt
df = intraday_df.resample('D').agg({'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last'})
df = df.dropna()
Теперь в df содержатся дневки IMOEX.
*** Вычисляем процентное изменение цены за один день
df['pct'] = df['Close'].pct_change().shift(-1)
*** Изменение цены за один день
df['diff'] = df['Close'].diff().shift(-1)
Делаем стобец для хранения лунных дней
df['age'] = 0.0
mi = pylunar.MoonInfo((55,45,7),(37,36,56))
Здесь цифры (55,45,7),(37,36,56) — широта и долгота г.Москвы
Вычисляем «возраст» лунного цикла на 15 ч 40 мин UTC (т.е по московскому времени 18:40 — это время закрытия основной сессии).
for i in range(len(df)):
mi.update((df.index[i].year, df.index[i].month, df.index[i].day, 15, 40,0))
df.at[df.index[i], 'age'] = mi.age()
Здесь в цикле в столбец «age» вычисляем для каждой даты число лунного дня.
Для простоты создаем еще столбец «round_age», где храним округленные числа лунных дней.
df['round_age'] = df['age'].round()
А теперь разбиваем данные на две выборки, одна выборка df_1 с 2012 до 01.01.2024 для вычисления, вторая df_2 для проверки на данных 2024 года.
from datetime import datetime
finish_date = datetime(2024, 1, 1)
df_1 = df[df.index < finish_date]
df_2 = df[df.index > finish_date]
Смотрим распределение средних процентных доходностей по лунным дням.
td=df.groupby(['round_age'])['pct'].mean()
td.plot(kind = 'bar')
Была похожая статья у меня, но потом удалил:
https://smart-lab.ru/blog/739004.php
нашел конфигурационный файл. Там была и вот такая система, в общем то как у вас, только я не по закрытию дня, естественно, а в интрадее:
открытие от 23.24 до 23.44
закрытие от 25.97
Это неправильно.
Возьмите например 2010-2012 гг
Я вон цикл по золоту экстраполировал:
smart-lab.ru/mobile/topic/1073082/
Могу выложить, я не знал, что здесь тоже есть программисты.