Избранное трейдера Laukar
Когда-то давно, в прошлом веке, была очень популярна стратегия инвестирования под названием Dogs of the Dow. Стратегия приносила доход значительно выше доходности индекса и была очень простая. Раз в год надо было выбрать из индекса Dow30 десять компаний с самой высокой дивидендной доходностью в процентах и держать их акции весь следующий год. Смысл выбора акций с самой высокой дивидендной доходностью в том, что она повышается в случае если цена акций снижается. Другими словами, покупаем то, что дешево и надеемся что оно будет расти сильнее чем остальное. В прошлом веке такая стратегия себя оправдывала.
Проведем тест стратегии для акций Dow30 (без ошибки выжившего) за последние 15 лет. Итак, видим что в последние годы стратегия (красная) приносит доходность хуже индекса S&P500 (синий).
00:00 коротко про книгу
01:55 про прогнозы
03:40 защита от инфляции и прогнозирование циклов
06:25 торговый дефицит и как оценивать компании
09:15 ключ к успешному инвестированию
14:15 три фильтра для отбора качественных акций
16:50 долгосрочная доходность рынка акций
18:15 как в воду глядел в 1999 году
19:45 аккуратнее с быстро-растущими секторами
27:45 про показатель EBITDA
29:30 что читать инвестору
32:00 своя база данных
34:00 куда инвестировать при высокой инфляции
40:10 когда облигации лучше акций?
42:40 лайфхак про инфляцию и инвестиции в золото
Для анализа будем использовать данные ETF c базовой валютой USD: FXCN, FXRL, FXIT, FXUS и FXRU. Временной ряд рассмотрим за три года с 2018 по 2020 года. Само исследование проведем в Google Colaboratory.
Как обычно в начале импортируем все необходимые библиотеки для дальнейшей работы.
import pandas as pd import numpy as np import matplotlib.pyplot as plt from google.colab import files import warnings warnings.filterwarnings("ignore")Сначала необходимо получить данные. Есть несколько способов. Мы воспользовались — взяли их с Finam в формате csv. Дальше написал функцию для обработки полученных данных и при помощи concat свел их в один датафрейм.
def changeDF(df): df['date'] = pd.to_datetime(df['<DATE>'].astype(str), dayfirst=True) name =[x for x in globals() if globals()[x] is df][0] df = df.drop(['<DATE>','<TIME>', '<OPEN>', '<HIGH>', '<LOW>'], axis=1) df = df.set_index(['date']) df.columns = [name+'_cl', name + '_vol'] return df fxgd_change = changeDF(fxgd) fxrl_change = changeDF(fxrl) fxit_change = changeDF(fxit) fxus_change = changeDF(fxus) fxru_change = changeDF(fxru) fxcn_change = changeDF(fxcn) etf = pd.concat([fxgd_change, fxrl_change, fxit_change, fxus_change, fxru_change, fxcn_change], axis=1) etf.head()В результате получили:
import sqlite3 as sql from scipy.stats import logistic import math import numpy as np import numpy.random as rnd import matplotlib.pyplot as plt from sklearn.neural_network import MLPRegressor sdata =[] sql1= "select ticker, date, open, high, low, close, vol \ from Hist_1m where ticker_id=1 order by Date;" con=sql.connect('C:/Users/ubase/Documents/StockDB/StockDB21.sqlite') cur=con.cursor() cur.execute(sql1) sdata=cur.fetchall() con.commit() con.close() Ldata = len(sdata) N = 8000 # Количество сделок ld = 5 #Продолжительность сделки NNinterval = 20 # Количество входов NN # Генерация случайных чисел rng = rnd.default_rng() rm=rng.integers(0, Ldata, N ) class Candle: tr = 0 dt = 1 o = 2 h = 3 l = 4 c = 5 v = 6 cl = Candle DataC =[sdata[i][cl.c] for i in range(0,Ldata)] # sigmoid линейность до 0.5 def sigmoidnorm(x, alfa = 0.9, xmin = -1.3, xmax = 1.3): return (xmax - xmin)*((1 / (1 + math.exp(-x*2.0*alfa))) - 1.0) + xmax x = [0.002 * i - 3 for i in range(0,3000)] y = [sigmoidnorm(x[i]) for i in range(len(x))] plt.plot(x,y) plt.grid() plt.show() # формируем сделки. def DealsGenL(rm,ld): #Lm = len(rm) ix = [] x = [] pr = [] for i in range(0,N): if rm[i] + ld < Ldata and rm[i] - NNinterval - 1 > 0: delta = (sdata[rm[i]+ld][cl.c] - sdata[rm[i]][cl.c])/sdata[rm[i]+ld][cl.c]*100 x0 = [sigmoidnorm((sdata[rm[i] - j][cl.c] - sdata[rm[i]][cl.c])/sdata[rm[i]][cl.c]*100) \ for j in range(0, NNinterval)] ix.append(rm[i]) x.append(x0) pr.append(delta) return ix, x, pr Ix, X, Pr = DealsGenL(rm,ld) Ib = 0 Ie = 100 plt.plot(X) plt.legend() plt.grid() plt.show() plt.plot(Pr, label = 'Prof') plt.legend() plt.grid() plt.show() regr = MLPRegressor(hidden_layer_sizes = [30,20,15,10,5], \ max_iter=500, activation = 'tanh') regr.fit(X, Pr) Out = regr.predict(X) plt.plot(Pr, Out, '.') plt.grid() plt.show()И вот результат прогнозирования:
С каждой главы выцарапал наиболее интересные мысли. Поехали.
Введение