Блог им. dgoncharovskiy

Тест "Грааля который долго искали" с Python и Pandas

В статье "Грааль, которые вы так долго искали" даётся алгоритм торговли:
  • если клоуз больше предыдущего клоуза, то покупаем (лонг) на закрытии сессии,
  • если клоуз меньше предыдущего клоуза, то продаем (шорт) на закрытии сессии.
Работаем на месячном таймфрейме.

Сейчас изучаю Python и Pandas и хотелось применить знания на каких-то реальных данных. Вот случай подвернулся. 

Выводы

Тестировал на данных по Газпрому (с 3.03.2010 по 20.05.2020) и Сбербанку пр. (с 21.11.2011 по 20.05.2020).
Отношение текущей стоимости портфеля к общей вложенной сумме: у Газпрома — 1,27, у Сбербанка пр. — 2,08.

Предварительные замечания 

Собрал данные для Сбербанк пр из Yahoo Finance (дневки). 
Написал код Pandas + Python. Это пока всё, чем владею на текущих момент, и то владею так себе. 
Pandas для преобразования таблицы с Yahoo Finance и обрезки ненужных столбцов. Python для прогонки алгоритма. 
Дивиденды учитывались в том случае, если на дату отсечки в портфеле были акции, если акций в портфеле не было, то дивиденды не учитывались. Дивиденды учитывались с учётом налога 13%.
При продаже акций прибыль учитывалась полностью, налог не брался. 

При покупке и продаже сделки совершались полными лотами (100 акций у Сбербанк пр., 10 акций у Газпрома, лотность учитывалось параметром round_up, если в лоте 10 акций, то round_up = -1, если 100, round_up = -2 и т.д.).
Условно взял 1 лот = 100 акций, так как до 06.11.2018 в 1 лоте Сбербанк пр. было 100 акций. После 06.11.2018 не стал дописывать в коде проверку даты, чтобы можно было уменьшить лот, хотя это можно сделать. 

Каждая покупка совершается на 20 000 рублей, если эта первая покупка и если в портфеле уже есть акции (условие «клоуз больше предыдущего клоуза»).
Продажа всех акций из портфеля совершается при условии «клоуз меньше предыдущего клоуза». На счёте учитывается сумма от продажи акций. Например, на счёте было 1 000 акций, их продали по 90 рублей, то на счёте будет 90 000 р. 
Следующая покупка после продажи совершается на деньги, полученные от продажи пакета акций на предыдущей итерации. В нашем примере, от продажи на предыдущем этапе выручили 90 000 р. их отправляем на покупку. 

Так как покупки могут идти только полными лотами, то при покупке образуется остаток денег, который не размещён в акциях. 
Например, при первой покупке акции стоили 80 р. На 20 000 р. купили 2 лота, 200 штук — 200 штук * 80 = 16 000, остаток: 20 000 — 16 000 = 4 000 р. 
Этот остаток в коде называется сдача (sdacha). Эта сдача плюсуется при следующих покупках к сумме. 

Код для расчёта алгоритма Python + Pandas

import numpy as np
import pandas as pd
import datetime as dt

# Загрузка данных из csv
stock = pd.read_csv(«E:\\sberp.csv», index_col='Date', parse_dates=True)
stock.head()

# Сделать индексный столбец с датами обычным столбцом
stock.reset_index(level=0, inplace=True)
# Добавить отдельный столбец Dates с датами, чтобы учитывать дивиденды.
# Не знаю, как работать с датами, если те заданы в индексном столбце, каждый раз как пытался, выдавало ошибку.
stock['Dates'] = stock['Date']
# Вернуть столбец с датами Date в индексную позицию
stock.set_index('Date', inplace=True)

# Нам нужны только данные по закрытию на конец месяца. Оставляем только последний день месяца. 
stock_resample = stock.resample('1m').last()
# Удаляем не нужные столбцы. Остаётся только Close.
stock_resample = stock_resample.drop(['Open', 'High', 'Low', 'Adj Close', 'Volume'], axis=1)

# Преобразуем столбец Dates в формат DateTime
stock_resample['Dates'] = pd.to_datetime(stock_resample['Dates'])

# Добавляем датафрейм с дивидендами
divs = {'Date': ['08.05.2009', '16.04.2010', '15.04.2011', '12.04.2012', '11.04.2013', '17.06.2014', '15.06.2015', '14.06.2016', '14.06.2017', '26.06.2018', '13.06.2019'], 
'Divs': ['0.63','0.45','1.15','2.59','3.2','3.2','0.45','1.97','6.0','12.0','16.0']}

dividend = pd.DataFrame(divs, columns = ['Date', 'Divs'])

# Основной код. 
# Устанавливаем количество акций в начале равным 0
stocks_count_total = 0

begin_sum = 20000 # Сумма на каждую покупку. Взял 20 000, чтобы покупать хотя бы 1 лот (100 акций)
summa = begin_sum # summa — Сумма, образующаяся от продажи всего пакета
sdacha = 0 # Сколько остается после покупки с учётом лотности

total_sum = 0 # Всего вложено
dividendy = 0 # Дивиденды накопительный итог

round_up = -2

# Начинаем со второй строки
i = 1

for i in range(len(stock_resample)-1):
if stock_resample['Close'][i] > stock_resample['Close'][i-1]: # Первый IF
# Если на счёте есть акции, то покупаем акции на сумму begin_sum рублей,
# если цена закрытия текущей недели больше цены закрытия предыдущей недели
# Добавляем все купленные акции к общему количеству акций stocks_count_total
if stocks_count_total > 0: # Второй IF
stocks_count = np.around((begin_sum + sdacha) / stock_resample['Close'][i] — (10**(-round_up)/2), round_up)
sdacha = (begin_sum + sdacha) — stocks_count * stock_resample['Close'][i]
stocks_count_total += stocks_count
total_sum += stocks_count * stock_resample['Close'][i]

print(«Докупка акций в портфель»)
print(f«Дата = {stock_resample['Dates'][i]}»)
print(f«Сумма = {summa}»)
print(f«Кол-во акций = {stocks_count_total}»)
print(f«Сдача = {sdacha}»)
print(f«Итерация = {i}»)
print("=====================")
else: # Второй ELSE к stocks_count_total > 0
# иначе, если на счёте нет акций, может быть две ситуации
# 1) это самая первая покупка, это проверяем через равенство Sum = BeginSum
if summa == begin_sum: # Третий IF
stocks_count = np.around((begin_sum + sdacha) / stock_resample['Close'][i] — (10**(-round_up)/2), round_up)
sdacha = (begin_sum + sdacha) — stocks_count * stock_resample['Close'][i] # вычисляем сдачу от покупки акций, т.к. можно купить только целое число лотов
stocks_count_total += stocks_count
total_sum += stocks_count * stock_resample['Close'][i]

print(«Первая покупка (countStocksTotal = 0 And Sum = BeginSum)»)
print(f«Дата = {stock_resample['Dates'][i]}»)
print(f«Сумма = {summa}»)
print(f«Кол-во акций = {stocks_count_total}»)
print(f«Сдача = {sdacha}»)
print(f«Итерация = {i}»)
print("=====================")
else: # Третий IF
# 2) это первая покупка после продажи, тогда BeginSum и Sum не равны
# и покупаем на сумму Sum, которую получили от продажи акций на предыдущем шаге
stocks_count = np.around(summa / stock_resample['Close'][i] — (10**(-round_up)/2), round_up)
sdacha = summa — stocks_count * stock_resample['Close'][i] # вычисляем сдачу от покупки акций, т.к. можно купить только целое число лотов
stocks_count_total += stocks_count
summa = 0

print(«Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]»)
print(f«Дата = {stock_resample['Dates'][i]}»)
print(f«Сумма = {summa}»)
print(f«Кол-во акций = {stocks_count_total}»)
print(f«Сдача = {sdacha}»)
print(f«Итерация = {i}»)
print("=====================")

# Если цена закрытия текущей недели меньше цены закрытия предыдущей недели, продаём всю позицию
else: # Первый ELSE к stock_resample['Close'][i] > stock_resample['Close'][i-1]
# Проверяем, есть ли акции на счёте, если нет, то пропускаем шаг, если есть, то продаём всё по текущей
# и записываем количество денег от продажи в переменную summa
# Обнуляем количество акций
if stocks_count_total > 0: # Четвертый if
summa = stocks_count_total * stock_resample['Close'][i] + sdacha # здесь общая сумма не будет равна начальной сумме BeginSum

# Добавляем дивиденды, если на дату отсечки были акции в портфеле

# Разбивка для дивидендов
for j in range(0, dividend.Divs.count()):
if ((dividend.Date[j].month == stock_resample.Dates[i].month)
& (dividend.Date[j].year == stock_resample.Dates[i].year)):

summa = summa + stocks_count_total * float(dividend.Divs[j]) * 0.87
dividendy = dividendy + stocks_count_total * float(dividend.Divs[j]) * 0.87
print (f«Пришли дивиденды за {dividend.Date[j].year} год. {dividend.Divs[j]} на акцию. Всего дивидендов {stocks_count_total * float(dividend.Divs[j]) * 0.87}»)

# Обнуляем количество акций после того, как посчитали дивиденды
stocks_count_total = 0
print(«Продажа акций из портфеля»)
print(f«Дата = {stock_resample['Dates'][i]}»)
print(f«Сумма = {summa}»)
print(f«Кол-во акций = {stocks_count_total}»)
print(f«Сдача = {sdacha}»)
print(f«Итерация = {i}»)
print("=====================")

print("=======Итого========")
print(f«Кол-во акций = {stocks_count_total}»)
print(f«Сумма = {summa}»)
print(f«Сдача = {sdacha}»)
print(f«Всего вложено = {total_sum}»)
print(f«Всего дивидендов (с учётом налога) = {dividendy}»)
print(f«Отношение дивидендов к всего вложено (в процентах) = {dividendy * 100 / total_sum}»)
print(f«Отношение итого к всего вложено = {(stock_resample['Close'].iloc[-1] * stocks_count_total) / total_sum}»)




Результат Сбербанк

Тестировал код в Jupiter Notebook. Результат расчёта выводился в него же. 
Результат выводился в том случае, если были сделки, если сделок не было, то не выводилось ничего. 

Первая покупка (countStocksTotal = 0 And Sum = BeginSum)
Дата = 2012-01-31 00:00:00
Сумма = 20000
Кол-во акций = 300.0
Сдача = 200.0
Итерация = 2
=====================
Докупка акций в портфель
Дата = 2012-02-29 00:00:00
Сумма = 20000
Кол-во акций = 500.0
Сдача = 5067.9992
Итерация = 3
=====================
Докупка акций в портфель
Дата = 2012-03-30 00:00:00
Сумма = 20000
Кол-во акций = 800.0
Сдача = 1568.9985999999953
Итерация = 4
=====================
Пришли дивиденды за 2012 год. 2.59 на акцию. Всего дивидендов 1802.64
Продажа акций из портфеля
Дата = 2012-04-27 00:00:00
Сумма = 58155.64099999999
Кол-во акций = 0
Сдача = 1568.9985999999953
Итерация = 5
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2012-06-29 00:00:00
Сумма = 0
Кол-во акций = 900.0
Сдача = 1887.6409999999887
Итерация = 7
=====================
Докупка акций в портфель
Дата = 2012-07-31 00:00:00
Сумма = 0
Кол-во акций = 1200.0
Сдача = 2873.640699999989
Итерация = 8
=====================
Докупка акций в портфель
Дата = 2012-08-31 00:00:00
Сумма = 0
Кол-во акций = 1500.0
Сдача = 2383.6397999999863
Итерация = 9
=====================
Продажа акций из портфеля
Дата = 2012-09-28 00:00:00
Сумма = 101758.63979999999
Кол-во акций = 0
Сдача = 2383.6397999999863
Итерация = 10
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2012-12-28 00:00:00
Сумма = 0
Кол-во акций = 1500.0
Сдача = 808.6352999999799
Итерация = 13
=====================
Докупка акций в портфель
Дата = 2013-01-31 00:00:00
Сумма = 0
Кол-во акций = 1700.0
Сдача = 5186.635099999981
Итерация = 14
=====================
Продажа акций из портфеля
Дата = 2013-02-28 00:00:00
Сумма = 131564.62829999998
Кол-во акций = 0
Сдача = 5186.635099999981
Итерация = 15
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2013-03-29 00:00:00
Сумма = 0
Кол-во акций = 1700.0
Сдача = 3860.6231999999873
Итерация = 16
=====================
Пришли дивиденды за 2013 год. 3.2 на акцию. Всего дивидендов 4732.8
Продажа акций из портфеля
Дата = 2013-04-30 00:00:00
Сумма = 131639.41809999998
Кол-во акций = 0
Сдача = 3860.6231999999873
Итерация = 17
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2013-05-31 00:00:00
Сумма = 0
Кол-во акций = 1800.0
Сдача = 959.4216999999771
Итерация = 18
=====================
Продажа акций из портфеля
Дата = 2013-06-28 00:00:00
Сумма = 126887.41989999996
Кол-во акций = 0
Сдача = 959.4216999999771
Итерация = 19
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2013-07-31 00:00:00
Сумма = 0
Кол-во акций = 1700.0
Сдача = 33.414799999969546
Итерация = 20
=====================
Продажа акций из портфеля
Дата = 2013-08-30 00:00:00
Сумма = 119033.41479999997
Кол-во акций = 0
Сдача = 33.414799999969546
Итерация = 21
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2013-09-30 00:00:00
Сумма = 0
Кол-во акций = 1500.0
Сдача = 6413.411799999958
Итерация = 22
=====================
Докупка акций в портфель
Дата = 2013-10-31 00:00:00
Сумма = 0
Кол-во акций = 1800.0
Сдача = 1564.411199999955
Итерация = 23
=====================
Докупка акций в портфель
Дата = 2013-11-29 00:00:00
Сумма = 0
Кол-во акций = 2000.0
Сдача = 4624.411799999954
Итерация = 24
=====================
Продажа акций из портфеля
Дата = 2013-12-30 00:00:00
Сумма = 164684.40979999996
Кол-во акций = 0
Сдача = 4624.411799999954
Итерация = 25
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2014-02-28 00:00:00
Сумма = 0
Кол-во акций = 2100.0
Сдача = 6134.409799999965
Итерация = 27
=====================
Продажа акций из портфеля
Дата = 2014-03-31 00:00:00
Сумма = 147464.41609999997
Кол-во акций = 0
Сдача = 6134.409799999965
Итерация = 28
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2014-05-30 00:00:00
Сумма = 0
Кол-во акций = 2100.0
Сдача = 3299.4118999999773
Итерация = 30
=====================
Докупка акций в портфель
Дата = 2014-06-30 00:00:00
Сумма = 0
Кол-во акций = 2400.0
Сдача = 2599.4118999999773
Итерация = 31
=====================
Продажа акций из портфеля
Дата = 2014-07-31 00:00:00
Сумма = 139759.41669999997
Кол-во акций = 0
Сдача = 2599.4118999999773
Итерация = 32
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2014-09-30 00:00:00
Сумма = 0
Кол-во акций = 2400.0
Сдача = 1159.4166999999725
Итерация = 34
=====================
Продажа акций из портфеля
Дата = 2014-10-31 00:00:00
Сумма = 137719.42149999997
Кол-во акций = 0
Сдача = 1159.4166999999725
Итерация = 35
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-01-30 00:00:00
Сумма = 0
Кол-во акций = 3100.0
Сдача = 1815.4214999999676
Итерация = 38
=====================
Докупка акций в портфель
Дата = 2015-02-27 00:00:00
Сумма = 0
Кол-во акций = 3500.0
Сдача = 335.4210999999668
Итерация = 39
=====================
Продажа акций из портфеля
Дата = 2015-03-31 00:00:00
Сумма = 160040.42459999997
Кол-во акций = 0
Сдача = 335.4210999999668
Итерация = 40
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-04-30 00:00:00
Сумма = 0
Кол-во акций = 3200.0
Сдача = 40.42459999996936
Итерация = 41
=====================
Продажа акций из портфеля
Дата = 2015-05-29 00:00:00
Сумма = 154440.42459999997
Кол-во акций = 0
Сдача = 40.42459999996936
Итерация = 42
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-06-30 00:00:00
Сумма = 0
Кол-во акций = 3100.0
Сдача = 4648.424599999969
Итерация = 43
=====================
Докупка акций в портфель
Дата = 2015-07-31 00:00:00
Сумма = 0
Кол-во акций = 3500.0
Сдача = 4092.42499999997
Итерация = 44
=====================
Докупка акций в портфель
Дата = 2015-08-31 00:00:00
Сумма = 0
Кол-во акций = 3900.0
Сдача = 2356.42499999997
Итерация = 45
=====================
Докупка акций в портфель
Дата = 2015-09-30 00:00:00
Сумма = 0
Кол-во акций = 4200.0
Сдача = 4941.42529999997
Итерация = 46
=====================
Докупка акций в портфель
Дата = 2015-10-30 00:00:00
Сумма = 0
Кол-во акций = 4500.0
Сдача = 4394.425899999969
Итерация = 47
=====================
Докупка акций в портфель
Дата = 2015-11-30 00:00:00
Сумма = 0
Кол-во акций = 4800.0
Сдача = 1534.426799999972
Итерация = 48
=====================
Докупка акций в портфель
Дата = 2015-12-30 00:00:00
Сумма = 0
Кол-во акций = 5000.0
Сдача = 6234.426799999972
Итерация = 49
=====================
Продажа акций из портфеля
Дата = 2016-01-29 00:00:00
Сумма = 348734.42679999996
Кол-во акций = 0
Сдача = 6234.426799999972
Итерация = 50
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2016-02-29 00:00:00
Сумма = 0
Кол-во акций = 4500.0
Сдача = 2684.4177999999374
Итерация = 51
=====================
Докупка акций в портфель
Дата = 2016-03-31 00:00:00
Сумма = 0
Кол-во акций = 4700.0
Сдача = 6866.418599999937
Итерация = 52
=====================
Докупка акций в портфель
Дата = 2016-04-29 00:00:00
Сумма = 0
Кол-во акций = 5000.0
Сдача = 1666.418599999939
Итерация = 53
=====================
Докупка акций в портфель
Дата = 2016-05-31 00:00:00
Сумма = 0
Кол-во акций = 5200.0
Сдача = 3366.418599999939
Итерация = 54
=====================
Пришли дивиденды за 2016 год. 1.97 на акцию. Всего дивидендов 8912.28
Продажа акций из портфеля
Дата = 2016-06-30 00:00:00
Сумма = 480278.69859999995
Кол-во акций = 0
Сдача = 3366.418599999939
Итерация = 55
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2016-07-29 00:00:00
Сумма = 0
Кол-во акций = 4800.0
Сдача = 6038.6841999999015
Итерация = 56
=====================
Докупка акций в портфель
Дата = 2016-08-31 00:00:00
Сумма = 0
Кол-во акций = 5000.0
Сдача = 5644.683999999903
Итерация = 57
=====================
Докупка акций в портфель
Дата = 2016-09-30 00:00:00
Сумма = 0
Кол-во акций = 5200.0
Сдача = 4480.683999999903
Итерация = 58
=====================
Докупка акций в портфель
Дата = 2016-10-31 00:00:00
Сумма = 0
Кол-во акций = 5400.0
Сдача = 2162.6847999999045
Итерация = 59
=====================
Докупка акций в портфель
Дата = 2016-11-30 00:00:00
Сумма = 0
Кол-во акций = 5500.0
Сдача = 10554.684599999904
Итерация = 60
=====================
Докупка акций в портфель
Дата = 2016-12-30 00:00:00
Сумма = 0
Кол-во акций = 5700.0
Сдача = 4604.684599999906
Итерация = 61
=====================
Продажа акций из портфеля
Дата = 2017-01-31 00:00:00
Сумма = 737624.7187999999
Кол-во акций = 0
Сдача = 4604.684599999906
Итерация = 62
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2017-03-31 00:00:00
Сумма = 0
Кол-во акций = 6100.0
Сдача = 744.700499999919
Итерация = 64
=====================
Докупка акций в портфель
Дата = 2017-04-28 00:00:00
Сумма = 0
Кол-во акций = 6200.0
Сдача = 8162.700499999919
Итерация = 65
=====================
Продажа акций из портфеля
Дата = 2017-05-31 00:00:00
Сумма = 781240.7128999999
Кол-во акций = 0
Сдача = 8162.700499999919
Итерация = 66
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2017-07-31 00:00:00
Сумма = 0
Кол-во акций = 5700.0
Сдача = 11797.684399999911
Итерация = 68
=====================
Докупка акций в портфель
Дата = 2017-08-31 00:00:00
Сумма = 0
Кол-во акций = 5900.0
Сдача = 201.68519999991258
Итерация = 69
=====================
Продажа акций из портфеля
Дата = 2017-09-29 00:00:00
Сумма = 918831.6675
Кол-во акций = 0
Сдача = 201.68519999991258
Итерация = 70
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2017-10-31 00:00:00
Сумма = 0
Кол-во акций = 5700.0
Сдача = 15267.644699999946
Итерация = 71
=====================
Докупка акций в портфель
Дата = 2017-11-30 00:00:00
Сумма = 0
Кол-во акций = 5800.0
Сдача = 16814.644799999947
Итерация = 72
=====================
Докупка акций в портфель
Дата = 2017-12-29 00:00:00
Сумма = 0
Кол-во акций = 5900.0
Сдача = 17914.64479999995
Итерация = 73
=====================
Докупка акций в портфель
Дата = 2018-01-31 00:00:00
Сумма = 0
Кол-во акций = 6000.0
Сдача = 16165.644299999953
Итерация = 74
=====================
Докупка акций в портфель
Дата = 2018-02-28 00:00:00
Сумма = 0
Кол-во акций = 6100.0
Сдача = 13465.644299999956
Итерация = 75
=====================
Продажа акций из портфеля
Дата = 2018-03-30 00:00:00
Сумма = 1319719.6382000002
Кол-во акций = 0
Сдача = 13465.644299999956
Итерация = 76
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2018-09-28 00:00:00
Сумма = 0
Кол-во акций = 7700.0
Сдача = 2634.6151000000536
Итерация = 82
=====================
Продажа акций из портфеля
Дата = 2018-10-31 00:00:00
Сумма = 1260044.6382000002
Кол-во акций = 0
Сдача = 2634.6151000000536
Итерация = 83
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2018-11-30 00:00:00
Сумма = 0
Кол-во акций = 7400.0
Сдача = 9444.638200000161
Итерация = 84
=====================
Продажа акций из портфеля
Дата = 2018-12-28 00:00:00
Сумма = 1230962.6900000002
Кол-во акций = 0
Сдача = 9444.638200000161
Итерация = 85
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-01-31 00:00:00
Сумма = 0
Кол-во акций = 6600.0
Сдача = 2636.6834000002127
Итерация = 86
=====================
Продажа акций из портфеля
Дата = 2019-02-28 00:00:00
Сумма = 1191626.6438000002
Кол-во акций = 0
Сдача = 2636.6834000002127
Итерация = 87
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-03-29 00:00:00
Сумма = 0
Кол-во акций = 6200.0
Сдача = 18772.656200000318
Итерация = 88
=====================
Докупка акций в портфель
Дата = 2019-04-30 00:00:00
Сумма = 0
Кол-во акций = 6300.0
Сдача = 18933.65630000032
Итерация = 89
=====================
Докупка акций в портфель
Дата = 2019-05-31 00:00:00
Сумма = 0
Кол-во акций = 6400.0
Сдача = 18382.65680000032
Итерация = 90
=====================
Докупка акций в портфель
Дата = 2019-06-28 00:00:00
Сумма = 0
Кол-во акций = 6500.0
Сдача = 17822.656200000318
Итерация = 91
=====================
Продажа акций из портфеля
Дата = 2019-07-31 00:00:00
Сумма = 1336672.6172000002
Кол-во акций = 0
Сдача = 17822.656200000318
Итерация = 92
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-09-30 00:00:00
Сумма = 0
Кол-во акций = 6600.0
Сдача = 10072.617200000212
Итерация = 94
=====================
Докупка акций в портфель
Дата = 2019-10-31 00:00:00
Сумма = 0
Кол-во акций = 6700.0
Сдача = 8817.616900000216
Итерация = 95
=====================
Продажа акций из портфеля
Дата = 2019-11-29 00:00:00
Сумма = 1432567.6169000003
Кол-во акций = 0
Сдача = 8817.616900000216
Итерация = 96
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-12-30 00:00:00
Сумма = 0
Кол-во акций = 6200.0
Сдача = 17107.59830000042
Итерация = 97
=====================
Продажа акций из портфеля
Дата = 2020-01-31 00:00:00
Сумма = 1425127.6355000006
Кол-во акций = 0
Сдача = 17107.59830000042
Итерация = 98
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2020-04-30 00:00:00
Сумма = 0
Кол-во акций = 8000.0
Сдача = 7527.659500000533
Итерация = 101
=====================
=======Итого========
Кол-во акций = 8000.0
Сумма = 0
Сдача = 7527.659500000533
Всего вложено = 684876.9997000002
Всего дивидендов (с учётом налога) = 15447.720000000001
Отношение дивидендов к всего вложено (в процентах) = 2.2555466173877408
Отношение итого к всего вложено = 2.0778038109373522


Результат Газпром

Взял данные по Газпрому с Yahoo Finance и сделал вычисления для него. 

Первая покупка (countStocksTotal = 0 And Sum = BeginSum)
Дата = 2010-07-30 00:00:00
Сумма = 20000
Кол-во акций = 120.0
Сдача = 473.5998800000016
Итерация = 4
=====================
Продажа акций из портфеля
Дата = 2010-08-31 00:00:00
Сумма = 19498.39904
Кол-во акций = 0
Сдача = 473.5998800000016
Итерация = 5
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2010-09-30 00:00:00
Сумма = 0
Кол-во акций = 120.0
Сдача = 325.99856
Итерация = 6
=====================
Докупка акций в портфель
Дата = 2010-10-29 00:00:00
Сумма = 0
Кол-во акций = 240.0
Сдача = 35.19904000000315
Итерация = 7
=====================
Докупка акций в портфель
Дата = 2010-11-30 00:00:00
Сумма = 0
Кол-во акций = 350.0
Сдача = 852.2991500000026
Итерация = 8
=====================
Докупка акций в портфель
Дата = 2010-12-30 00:00:00
Сумма = 0
Кол-во акций = 450.0
Сдача = 1492.2985500000032
Итерация = 9
=====================
Докупка акций в портфель
Дата = 2011-01-31 00:00:00
Сумма = 0
Кол-во акций = 550.0
Сдача = 1776.2981500000024
Итерация = 10
=====================
Докупка акций в портфель
Дата = 2011-02-28 00:00:00
Сумма = 0
Кол-во акций = 650.0
Сдача = 621.2978500000063
Итерация = 11
=====================
Докупка акций в портфель
Дата = 2011-03-31 00:00:00
Сумма = 0
Кол-во акций = 730.0
Сдача = 2273.297370000004
Итерация = 12
=====================
Докупка акций в портфель
Дата = 2011-04-29 00:00:00
Сумма = 0
Кол-во акций = 820.0
Сдача = 1416.6969200000058
Итерация = 13
=====================
Пришли дивиденды за 2011 год. 3.85 на акцию. Всего дивидендов 2746.59
Продажа акций из портфеля
Дата = 2011-05-31 00:00:00
Сумма = 172058.28692
Кол-во акций = 0
Сдача = 1416.6969200000058
Итерация = 14
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2011-10-31 00:00:00
Сумма = 0
Кол-во акций = 950.0
Сдача = 1580.789770000003
Итерация = 19
=====================
Продажа акций из портфеля
Дата = 2011-11-30 00:00:00
Сумма = 168210.78407
Кол-во акций = 0
Сдача = 1580.789770000003
Итерация = 20
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2012-01-31 00:00:00
Сумма = 0
Кол-во акций = 910.0
Сдача = 952.7813399999868
Итерация = 22
=====================
Докупка акций в портфель
Дата = 2012-02-29 00:00:00
Сумма = 0
Кол-во акций = 1010.0
Сдача = 1593.7817399999876
Итерация = 23
=====================
Продажа акций из портфеля
Дата = 2012-03-30 00:00:00
Сумма = 184151.28173999998
Кол-во акций = 0
Сдача = 1593.7817399999876
Итерация = 24
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2012-06-29 00:00:00
Сумма = 0
Кол-во акций = 1190.0
Сдача = 903.1757899999793
Итерация = 27
=====================
Продажа акций из портфеля
Дата = 2012-07-31 00:00:00
Сумма = 180295.67578999998
Кол-во акций = 0
Сдача = 903.1757899999793
Итерация = 28
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2012-08-31 00:00:00
Сумма = 0
Кол-во акций = 1140.0
Сдача = 859.6826299999957
Итерация = 29
=====================
Докупка акций в портфель
Дата = 2012-09-28 00:00:00
Сумма = 0
Кол-во акций = 1270.0
Сдача = 352.1826299999957
Итерация = 30
=====================
Продажа акций из портфеля
Дата = 2012-10-31 00:00:00
Сумма = 184375.17500999998
Кол-во акций = 0
Сдача = 352.1826299999957
Итерация = 31
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2012-12-28 00:00:00
Сумма = 0
Кол-во акций = 1280.0
Сдача = 439.1788499999966
Итерация = 33
=====================
Продажа акций из портфеля
Дата = 2013-01-31 00:00:00
Сумма = 182314.37372999996
Кол-во акций = 0
Сдача = 439.1788499999966
Итерация = 34
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2013-07-31 00:00:00
Сумма = 0
Кол-во акций = 1410.0
Сдача = 974.27231999996
Итерация = 40
=====================
Докупка акций в портфель
Дата = 2013-08-30 00:00:00
Сумма = 0
Кол-во акций = 1560.0
Сдача = 1189.2732199999627
Итерация = 41
=====================
Докупка акций в портфель
Дата = 2013-09-30 00:00:00
Сумма = 0
Кол-во акций = 1700.0
Сдача = 1044.6733599999643
Итерация = 42
=====================
Докупка акций в портфель
Дата = 2013-10-31 00:00:00
Сумма = 0
Кол-во акций = 1830.0
Сдача = 1482.2738799999643
Итерация = 43
=====================
Продажа акций из портфеля
Дата = 2013-11-29 00:00:00
Сумма = 262916.07571
Кол-во акций = 0
Сдача = 1482.2738799999643
Итерация = 44
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2014-01-31 00:00:00
Сумма = 0
Кол-во акций = 1810.0
Сдача = 375.57027999998536
Итерация = 46
=====================
Продажа акций из портфеля
Дата = 2014-02-28 00:00:00
Сумма = 253775.57027999999
Кол-во акций = 0
Сдача = 375.57027999998536
Итерация = 47
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2014-05-30 00:00:00
Сумма = 0
Кол-во акций = 1790.0
Сдача = 132.5756499999843
Итерация = 50
=====================
Докупка акций в портфель
Дата = 2014-06-30 00:00:00
Сумма = 0
Кол-во акций = 1920.0
Сдача = 767.7747399999826
Итерация = 51
=====================
Пришли дивиденды за 2014 год. 7.2 на акцию. Всего дивидендов 12026.88
Продажа акций из портфеля
Дата = 2014-07-31 00:00:00
Сумма = 266234.65473999997
Кол-во акций = 0
Сдача = 767.7747399999826
Итерация = 52
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2014-09-30 00:00:00
Сумма = 0
Кол-во акций = 1930.0
Сдача = 87.66631999996025
Итерация = 54
=====================
Докупка акций в портфель
Дата = 2014-10-31 00:00:00
Сумма = 0
Кол-во акций = 2070.0
Сдача = 277.66631999996025
Итерация = 55
=====================
Докупка акций в портфель
Дата = 2014-11-28 00:00:00
Сумма = 0
Кол-во акций = 2210.0
Сдача = 277.2661799999587
Итерация = 56
=====================
Продажа акций из портфеля
Дата = 2014-12-30 00:00:00
Сумма = 288262.36176
Кол-во акций = 0
Сдача = 277.2661799999587
Итерация = 57
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-01-30 00:00:00
Сумма = 0
Кол-во акций = 2000.0
Сдача = 622.3477599999751
Итерация = 58
=====================
Докупка акций в портфель
Дата = 2015-02-27 00:00:00
Сумма = 0
Кол-во акций = 2130.0
Сдача = 738.8481499999762
Итерация = 59
=====================
Продажа акций из портфеля
Дата = 2015-03-31 00:00:00
Сумма = 296595.83537
Кол-во акций = 0
Сдача = 738.8481499999762
Итерация = 60
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-04-30 00:00:00
Сумма = 0
Кол-во акций = 1930.0
Сдача = 340.83536999998614
Итерация = 61
=====================
Продажа акций из портфеля
Дата = 2015-05-29 00:00:00
Сумма = 268610.83537
Кол-во акций = 0
Сдача = 340.83536999998614
Итерация = 62
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-06-30 00:00:00
Сумма = 0
Кол-во акций = 1840.0
Сдача = 246.824329999974
Итерация = 63
=====================
Пришли дивиденды за 2015 год. 7.2 на акцию. Всего дивидендов 11525.76
Продажа акций из портфеля
Дата = 2015-07-31 00:00:00
Сумма = 273972.58433
Кол-во акций = 0
Сдача = 246.824329999974
Итерация = 64
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-08-31 00:00:00
Сумма = 0
Кол-во акций = 1840.0
Сдача = 1302.9806499999831
Итерация = 65
=====================
Продажа акций из портфеля
Дата = 2015-09-30 00:00:00
Сумма = 248874.98617
Кол-во акций = 0
Сдача = 1302.9806499999831
Итерация = 66
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2015-10-30 00:00:00
Сумма = 0
Кол-во акций = 1830.0
Сдача = 452.4861699999892
Итерация = 67
=====================
Докупка акций в портфель
Дата = 2015-11-30 00:00:00
Сумма = 0
Кол-во акций = 1970.0
Сдача = 1132.4861699999892
Итерация = 68
=====================
Продажа акций из портфеля
Дата = 2015-12-30 00:00:00
Сумма = 269229.77829
Кол-во акций = 0
Сдача = 1132.4861699999892
Итерация = 69
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2016-01-29 00:00:00
Сумма = 0
Кол-во акций = 1970.0
Сдача = 127.7664699999732
Итерация = 70
=====================
Докупка акций в портфель
Дата = 2016-02-29 00:00:00
Сумма = 0
Кол-во акций = 2110.0
Сдача = 331.7673099999738
Итерация = 71
=====================
Докупка акций в портфель
Дата = 2016-03-31 00:00:00
Сумма = 0
Кол-во акций = 2240.0
Сдача = 1124.2673099999738
Итерация = 72
=====================
Докупка акций в портфель
Дата = 2016-04-29 00:00:00
Сумма = 0
Кол-во акций = 2360.0
Сдача = 907.8671899999754
Итерация = 73
=====================
Продажа акций из портфеля
Дата = 2016-05-31 00:00:00
Сумма = 344287.86718999996
Кол-во акций = 0
Сдача = 907.8671899999754
Итерация = 74
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2016-10-31 00:00:00
Сумма = 0
Кол-во акций = 2470.0
Сдача = 1353.0770699999994
Итерация = 79
=====================
Докупка акций в портфель
Дата = 2016-11-30 00:00:00
Сумма = 0
Кол-во акций = 2610.0
Сдача = 521.0766499999991
Итерация = 80
=====================
Докупка акций в портфель
Дата = 2016-12-30 00:00:00
Сумма = 0
Кол-во акций = 2740.0
Сдача = 429.576259999998
Итерация = 81
=====================
Продажа акций из портфеля
Дата = 2017-01-31 00:00:00
Сумма = 410881.58448
Кол-во акций = 0
Сдача = 429.576259999998
Итерация = 82
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2017-04-28 00:00:00
Сумма = 0
Кол-во акций = 3000.0
Сдача = 631.5844800000195
Итерация = 85
=====================
Продажа акций из портфеля
Дата = 2017-05-31 00:00:00
Сумма = 361471.58148000005
Кол-во акций = 0
Сдача = 631.5844800000195
Итерация = 86
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2017-08-31 00:00:00
Сумма = 0
Кол-во акций = 3060.0
Сдача = 483.37842000008095
Итерация = 89
=====================
Докупка акций в портфель
Дата = 2017-09-29 00:00:00
Сумма = 0
Кол-во акций = 3220.0
Сдача = 931.3789000000834
Итерация = 90
=====================
Докупка акций в портфель
Дата = 2017-10-31 00:00:00
Сумма = 0
Кол-во акций = 3380.0
Сдача = 787.3785800000842
Итерация = 91
=====================
Докупка акций в портфель
Дата = 2017-11-30 00:00:00
Сумма = 0
Кол-во акций = 3530.0
Сдача = 964.8794800000869
Итерация = 92
=====================
Продажа акций из портфеля
Дата = 2017-12-29 00:00:00
Сумма = 461629.87948000006
Кол-во акций = 0
Сдача = 964.8794800000869
Итерация = 93
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2018-01-31 00:00:00
Сумма = 0
Кол-во акций = 3220.0
Сдача = 10.676260000036564
Итерация = 94
=====================
Продажа акций из портфеля
Дата = 2018-02-28 00:00:00
Сумма = 460985.8891400001
Кол-во акций = 0
Сдача = 10.676260000036564
Итерация = 95
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2018-04-30 00:00:00
Сумма = 0
Кол-во акций = 3150.0
Сдача = 1306.4111900001299
Итерация = 97
=====================
Продажа акций из портфеля
Дата = 2018-05-31 00:00:00
Сумма = 458056.41119000013
Кол-во акций = 0
Сдача = 1306.4111900001299
Итерация = 98
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2018-07-31 00:00:00
Сумма = 0
Кол-во акций = 3180.0
Сдача = 804.2334500001743
Итерация = 100
=====================
Докупка акций в портфель
Дата = 2018-08-31 00:00:00
Сумма = 0
Кол-во акций = 3310.0
Сдача = 1310.7338400001754
Итерация = 101
=====================
Докупка акций в портфель
Дата = 2018-09-28 00:00:00
Сумма = 0
Кол-во акций = 3440.0
Сдача = 171.43371000017214
Итерация = 102
=====================
Продажа акций из портфеля
Дата = 2018-10-31 00:00:00
Сумма = 534988.2371500001
Кол-во акций = 0
Сдача = 171.43371000017214
Итерация = 103
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2018-11-30 00:00:00
Сумма = 0
Кол-во акций = 3310.0
Сдача = 1118.3603200000944
Итерация = 104
=====================
Продажа акций из портфеля
Дата = 2018-12-28 00:00:00
Сумма = 507548.3603200001
Кол-во акций = 0
Сдача = 1118.3603200000944
Итерация = 105
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-01-31 00:00:00
Сумма = 0
Кол-во акций = 3110.0
Сдача = 1178.1385500000906
Итерация = 106
=====================
Продажа акций из портфеля
Дата = 2019-02-28 00:00:00
Сумма = 495637.05410000007
Кол-во акций = 0
Сдача = 1178.1385500000906
Итерация = 107
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-04-30 00:00:00
Сумма = 0
Кол-во акций = 3020.0
Сдача = 508.0631600000779
Итерация = 109
=====================
Докупка акций в портфель
Дата = 2019-05-31 00:00:00
Сумма = 0
Кол-во акций = 3110.0
Сдача = 1149.062620000077
Итерация = 110
=====================
Докупка акций в портфель
Дата = 2019-06-28 00:00:00
Сумма = 0
Кол-во акций = 3200.0
Сдача = 194.36244000007719
Итерация = 111
=====================
Докупка акций в портфель
Дата = 2019-07-31 00:00:00
Сумма = 0
Кол-во акций = 3280.0
Сдача = 1242.3629200000796
Итерация = 112
=====================
Продажа акций из портфеля
Дата = 2019-08-30 00:00:00
Сумма = 762694.3432400001
Кол-во акций = 0
Сдача = 1242.3629200000796
Итерация = 113
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2019-10-31 00:00:00
Сумма = 0
Кол-во акций = 2930.0
Сдача = 894.3432400000747
Итерация = 115
=====================
Продажа акций из портфеля
Дата = 2019-11-29 00:00:00
Сумма = 755486.5696100001
Кол-во акций = 0
Сдача = 894.3432400000747
Итерация = 116
=====================
Покупка после продажи [else (countStocksTotal = 0 And Sum = BeginSum)]
Дата = 2020-04-30 00:00:00
Сумма = 0
Кол-во акций = 3970.0
Сдача = 1186.5696100001223
Итерация = 121
=====================
=======Итого========
Кол-во акций = 3970.0
Сумма = 0
Сдача = 1186.5696100001223
Всего вложено = 615733.29947
Всего дивидендов (с учётом налога) = 26299.23
Отношение дивидендов к всего вложено (в процентах) = 4.27120476067112
Отношение итого к всего вложено = 1.2685002102733522


Ссылки на файлы

csv: Сбербанк, Газпром

ipynb  — Файл с кодом, ноутбук Jupyter
★17
13 комментариев
Скоро СЛ на алготрейдинг перейдет.)
avatar
3Qu, алго на машках, чет зачастили
Капиталист, HFT на машках- даешь!
avatar
YuryDok, МАшкам надо памятник на Уолл Стрит ставить. У ММВБ тем более.
avatar
Капиталист,  если разобраться, то все только на МАшках и держится.  Основа всех индикаторов.)
avatar
а нельзя просто эквити показать?
avatar
old schooler, я не трейдер, показывать нечего. Пока интересующийся темой инвестиций. Смотрю отчёты, читаю аналитику, смотрю на графики, когда попадается простой алгоритм, который могу сделать сам, делаю, тестирую. 
Дмитрий Гончаровский, я имел ввиду эквити стратегии
avatar
old schooler, сделал графики. Спасибо, что напомнили об этом. 

Газпром, оценка в деньгах. 


Газпром, количество акций.


Сбербанк пр., оценка в деньгах.


Сбербанк пр., количество акций





Несколько рекомендаций:
1. Код и небольшие файлы с данными удобнее выкладывать на GitHub — он нормально отображает py и ipynb (включая графики)
2. Не рекомендуется использовать в pandas операции с флагом inplace=True — часто это приводит к глюкам
3. Когда вы хотите оставить один столбец, лучше не выкидывать все остальные stock_resample.drop(['Open', 'High', 'Low', 'Adj Close', 'Volume'], axis=1), а оставить нужный  stock_resample['Close']

avatar
Михаил, спасибо большое за Ваши рекомендации. Я пока начинающий. На GitHub зарегистрировался, но пока не разобрался что к чему. 
В тех лекциях, что смотрел, показывали делать именно с inplace=True, теперь буду знать, что так лучше не делать. 
со cдачей непонятно, уже на 2 шаге ошибка?
avatar
Владимир М., объясните подробнее, в чём ошибка. 

теги блога Дмитрий-сан

....все тэги



UPDONW
Новый дизайн