Избранное трейдера Роман Давыдов


Привет всем. Чтобы не изобретать велосипеды #софты для просмотра структуры портфеля#.
Скачиваем R, RStduio. В RStudio устанавливаем библиотеки: rusquant, PerformanceAnalytics, PerformanceAnalytics.
Добавляем следующий код в RStudio.
Подключаем библиотеки:
library(rusquant) library(PerformanceAnalytics) library(PortfolioAnalytics)
tickers <- c("FXGD","IRAO")
weights <- c(.5,.5)
start_data <- "2014-01-01"
PortPrices <- NULLfor(curr in tickers) {
PortPrices <- cbind(PortPrices, getSymbols(curr, src = 'Finam', auto.assign = FALSE)[,4])
}benchmark <- getSymbols("MICEX", src = "Finam", auto.assign = FALSE)[,4]
benchmarkRet <- na.omit(ROC(benchmark))Тоже самое для портфеля акций, плюс считаем портфель и включаем ребалансировку каждый месяц.PortReturn <- na.omit(ROC(PortPrices)) PortRet <- Return.portfolio(PortReturn, weights = weights, rebalance_on = "month")
PortCum <- cumsum(PortRet) Micex <- cumsum(benchmarkRet)
Приветствую! Напишу о том, как найти облигации, какие выбрать, как анализировать и купить.
Последний пост про рост инфляции заставил многих задуматься о том, как защитить деньги от обесценения, приумножить их в долгосрочном периоде и в то же время не влезать в переоцененные акции.
Многие просили написать про облигации. Я полностью согласен с тем, что облигации в текущих условиях оптимальный вариант инвестирования свободных денег. Поэтому по этим просьбам решил написать об этом инструменте.
Облигации играют важную роль в портфеле. У меня в портфелях они составляют 45% активов. В первую очередь, это ликвидный запас денег на случай снижения рынка акций. Во-вторых, это инструмент с понятной и стабильной доходностью в отличие от акций. Многие помнят, что я увеличиваю инвестиции в акции, когда рынок падает, поэтому в такие периоды облигационный резерв выступает источником покупки акций.
Проще говоря, когда рынок растет, я увеличиваю резерв из облигаций и покупаю акции на минимум. Когда рынок падает, я увеличиваю покупки акций и сокращаю облигационный резерв.
Для анализа будем использовать данные 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()В результате получили:
Если вы используете стратегии в трейдингвью, например чтобы быстро накидать прототип идеи из какого нибудь источника и посмотреть её, то у вас наверняка также появлялся вопрос поиска приемлемых параметров и проверка как они влияют на стратегию. Делать это вручную крайне трудозатратно. Простейшая стратегия двух скользящих средних может давать 400 и более вариантов параметров. А любое увеличение кол-ва параметров и диапазона их значений приводит к необходимости перебора значений растущих в геометрической прогрессии. Например стратегия из 5 параметров по 15 значений дает 15 ^ 5 = 759 375 вариантов. Подобрать их руками, когда один вариант вычисляется пару секунд не реально.
А можно ли автоматизировать этот процесс? Ниже описание решения через расширение для браузера на основе Chrome.

В прошлый раз я публиковал статью, в которой говорил об ассистенте для


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()И вот результат прогнозирования: