Избранное трейдера Роман Давыдов
Привет всем. Чтобы не изобретать велосипеды #софты для просмотра структуры портфеля#.
Скачиваем 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 <- NULL
for(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()И вот результат прогнозирования: