Código Explicação: Com base na média - Python método de otimização algoritmo de variância de negociação

O texto completo 6852 palavras, quando é esperado aprendizagem para crescer 14 minutos

Figura fonte: pixabay

Este artigo visa mostrar como gerar estratégias de negociação métodos de otimização e teoria moderna de carteira (MPT) por Markowitz (Markowitz) carteira.

Em primeiro lugar, a média - variância otimização introdução método e dicas, e como aplicá-la a estratégias de negociação. Como descrito acima, o quadro será tirolesa usados-los de volta teste.

estabelecer

Este artigo usa os seguintes bancos de dados:

tirolesa 1.3.0

matplotlib 3.0.0

json 2.0.9

0.5.0 empírico

numpy 1.14.6

pandas 0.22.0

pyfolio 0.9.2

Média - variância método de otimização do antecessor

Em 1952, Harry Markowitz publicou "Teoria da Carteira (Portfolio Selection)", que apresenta a teoria agora conhecida como Teoria de Portfólio Moderna (referido como MPT) investimento. Os principais pontos são:

retorno da carteira é a média ponderada de cada carteira constituem parte, mas também influenciada pela volatilidade dos correlação de activos entre a

Os investidores não devem ser avaliados separadamente a eficiência dos ativos, mas deve entender como elas irão afetar a eficácia da carteira

diversidade (sobre a implantação de uma série de ativos para ativos totais, ao invés de focar em um ou um punhado de ativos) pode reduzir significativamente a volatilidade da carteira

Este artigo não em profundidade suposições MPT, mas o ponto é que todos os investidores têm um objetivo comum, que é, ao mesmo tempo, tentar risco evitar e alcançar o máximo retorno sobre o investimento, eles podem ser de taxa (ilimitado) fundos de empréstimo livre de risco, e sem considerar os custos de transação.

Nesta base, a média - análise de variância é encontrar um plano de alocação de ativos ideal, é melhor pesar os riscos e benefícios esperados (como a variância dos rendimentos). E média - um dos principais conceitos relacionados à análise de variância é fronteira eficiente (Efficient Frontier), que é um conjunto de melhores ofertas eficiente da carteira o maior retorno esperado da carteira de investimentos para o desenvolvimento do nível de risco, ou de uma forma diferente para construir sobre ela para o o retorno esperado sobre a carteira fornece o menor nível de risco.

Eficiente Visualization Frontier - Figura Fonte: Wikipedia

É representado por uma fórmula matemática é a seguinte:

Onde w é o vetor de peso, é o vetor de retornos de ativos, é o retorno da carteira matriz de covariância, alvo _p esperado. Dois dos factores limitativos são:

proibir peso não-negativa de venda a descoberto 0

pesos devem somar até 1, proibir o uso de alavancagem

Para resolver este problema e obter a fronteira eficiente (fronteira eficiente), você pode definir um intervalo de possível retorno esperado da carteira, e, em seguida, minimizar a variância do peso para cada valor encontrado. Felizmente, existe um banco de dados pode simplificar muito o processo.

Com PyPortfolioOpt, apenas algumas linhas de código pode resolver todo o problema de otimização. Esse artigo vai criar um tal carteira: quer para maximizar a proporção esperada Sharpe (índice de Sharpe, o retorno de excesso carteira por unidade de risco), ou para minimizar a volatilidade global. Ambas as carteiras são dependentes da fronteira eficiente.

O exemplo a seguir breve irá mostrar-lhe como usar pypfopt. Primeiro, yahoofinancials baixar o preço das ações histórico.

risky_assets =

yahoo_financials = YahooFinancials (risky_assets)

json_results = yahoo_financials.get_historical_price_data ( '2019/01/01', '2019/09/30', 'diária')

prices_list =

para o ativo em risky_assets:

x = pd.DataFrame (json_results ) >

x.set_index ( 'FORMATTED_DATE', inplace = true)

x = x.adjclose

x.rename (activo)

prices_list.append (x)

prices_df = pd.concat (prices_list, eixo = 1)

prices_df.columns = risky_assets

prices_df.head ()

pypfopt pode facilmente calcular os retornos esperados e matriz de covariância do preço, sem conversão prévia em receita.

# Calcule o retorno esperado e amostra amtrix covariância

avg_returns = expected_returns.mean_historical_return (prices_df)

cov_mat = risk_models.sample_cov (prices_df)

Obtido executando o seguinte código para fazer o certo para maximizar o índice de Sharpe de peso:

# Get pesos maximizar a relação Sharpe

ef = EfficientFrontier (avg_returns, cov_mat)

pesos = ef.max_sharpe ()

cleaned_weights = ef.clean_weights ()

cleaned_weights

Pegue os seguintes pesos:

{ 'FB': 0,03787, 'MSFT': 0,83889, 'TSLA': 0,0, 'Twtr': 0,12324}

Conveniência, usar clean_weights (), porque é muito pequeno corte de peso a zero, e os pesos restantes são arredondadas.

tática

Este artigo irá definir as seguintes condições:

o capital dos investidores é de R $ 50.000

período de investimento de 2016-2017

Os investidores só podem investir nos seguintes ações: Tesla, Microsoft, Facebook, Twitter

Assumindo que há custos de transação

Não venda a descoberto (os investidores só podem vender seus ativos existentes)

quando se realiza a otimização, os investidores consideram os últimos 252 dias de negociação para calcular o lucro históricos e matriz de covariância

A primeira transação para determinar o último dia de dezembro, mas ordens executadas em janeiro de 2016, a primeiro dia de negociação

Standard 1 / n estratégia

Primeiro, crie um simples estratégias de benchmark: ** 1 / n portfólio **. A idéia é muito simples. O primeiro dia de testes será de 1 / n% do capital total atribuído a cada um dos itens n retirados em conta activos. Para simplificar, sem qualquer reequilíbrio.

Muitas vezes isso acontece na prática é que a carteira de uma vez a cada X dias reequilíbrio, a parte traseira distribuição de 1 / n. Por quê? Imagine segurando uma carteira de ativos que consistem em dois X e Y, e no início do período de investimento, o rácio de distribuição é de 50-50. Mais de um mês, um aumento acentuado no preço de X, Y e o preço caiu. Por isso, os activos x 65% do valor da carteira, enquanto Y apenas 35%. Então você pode querer re-equilibrar até 50-50 com a venda de alguns dos X, comprar mais de Y.

%% tirolesa --start 2015/12/312017/12/31 --end --capital-base de 50000,0 benchmark.pkl -o

# Imports

de zipline.api importação order_percent, símbolos

de comissão de importação zipline.finance

importar numpy como np

pandas importação como Pd

def inicializar (contexto):

context.set_commission (commission.PerShare (custo = 0,0, min_trade_cost = 0))

context.assets = símbolos ( 'TSLA', 'MSFT', 'FB', 'Twtr')

context.n_assets = len (context.assets)

context.has_position = False

def handle_data (contexto, dados):

se não context.has_position:

para o ativo em context.assets:

order_percent (activo, 1 / context.n_assets)

context.has_position = True

de Axes3D importação mpl_toolkits.mplot3d

A figura a seguir mostra os retornos cumulativos da estratégia.

Salvar alguns dos resultados de comparação com outras estratégias.

benchmark_perf = qf.get_performance_summary (retornos)

rácio de Sharpe (Índice de Sharpe) Carteira de maximização - reequilíbrio uma vez a cada 30 dias

Nesta estratégia, os investidores escolher o portfólio de investimento certo é esperado para maximizar o índice de Sharpe do peso. Carteira de reequilíbrio uma vez a cada 30 dias.

Por número de dia de negociação atual (em context.time armazenadas) usando a aritmética modular (como em Python%) para determinar se o desenvolvimento da data da data de rebalanceamento. Quando solicitado por 30 a 0, ele será re-equilibrado.

%% tirolesa --start 2015/12/312017/12/31 --end --capital-base de 50000,0 -o max_sharpe_30_days.pkl

# Imports

de zipline.api símbolos de importação, registro, order_target_percent

de comissão de importação zipline.finance

importar numpy como np

pandas importação como Pd

de pypfopt.efficient_frontier EfficientFrontier importação

de risk_models importação pypfopt

de expected_returns importação pypfopt

def inicializar (contexto):

context.set_commission (commission.PerShare (custo = 0,0, min_trade_cost = 0))

context.assets = símbolos ( 'TSLA', 'MSFT', 'FB', 'Twtr')

context.n_assets = len (context.assets)

context.window = 252

context.rebalance_period = 30

context.time = 0

def handle_data (contexto, dados):

cleaned_weights =

se context.time == 0 ou (context.time% context.rebalance_period == 0):

# preços Extrato

preços = data.history (context.assets, campos = 'preço',

bar_count = context.window + 1, frequência = '1d')

# Calcule o retorno esperado e amostra amtrix covariância

avg_returns = expected_returns.mean_historical_return (preços)

cov_mat = risk_models.sample_cov (preços)

# Get pesos maximizar a relação Sharpe

ef = EfficientFrontier (avg_returns, cov_mat)

pesos = ef.max_sharpe ()

cleaned_weights = ef.clean_weights ()

# Enviar pedidos

para o ativo em context.assets:

order_target_percent (activos, cleaned_weights )

ficha (pesos = cleaned_weights)

context.time + 1 =

Finalmente, os resultados serão todas as políticas examinadas. No entanto, as observadas mudanças de distribuição de peso ao longo do tempo vai ser muito interessante.

FIG apresentar algum discernimento:

Twitter é quase nenhum investimento nesta estratégia.

às vezes pular meses completos, como janeiro 2016 e abril de 2016. Isso ocorre porque cada período de reequilíbrio de 30 dias de negociação, enquanto uma média de 21 dias por mês.

Maximizando a relação de Sharpe da carteira - rebalanceamento mensal

Esta estratégia é muito semelhante à estratégia anterior, ainda é esperado para selecionar o portfólio certo para maximizar o índice de Sharpe do peso. A diferença é que o programa de reequilíbrio. Em primeiro lugar, definir método reequilíbrio para calcular o peso ideal e executar o comando correspondente. Em seguida, schedule_function ser arranjado. Depois de um mês no cenário atual e, em seguida, o equilíbrio do mercado está fechado (time_rules.market_close) o último dia de negociação (date_rules.month_end).

%% tirolesa --start 2015/12/312017/12/31 --end --capital-base de 50000,0 -o max_sharpe_monthly.pkl

# Imports

de importação zipline.api (símbolos, ficha, order_target_percent,

schedule_function, date_rules, time_rules)

de comissão de importação zipline.finance

importar numpy como np

pandas importação como Pd

de pypfopt.efficient_frontier EfficientFrontier importação

de risk_models importação pypfopt

de expected_returns importação pypfopt

def inicializar (contexto):

context.set_commission (commission.PerShare (custo = 0,0, min_trade_cost = 0))

context.assets = símbolos ( 'TSLA', 'MSFT', 'FB', 'Twtr')

context.n_assets = len (context.assets)

context.window = 252

schedule_function (reequilíbrio,

date_rules.month_end (),

time_rules.market_close ())

def reequilibrar (contexto, dados):

cleaned_weights =

# preços Extrato

preços = data.history (context.assets, campos = 'preço',

bar_count = context.window + 1, frequência = '1d')

# Calcule o retorno esperado e amostra amtrix covariância

avg_returns = expected_returns.mean_historical_return (preços)

cov_mat = risk_models.sample_cov (preços)

# Get pesos maximizar a relação Sharpe

ef = EfficientFrontier (avg_returns, cov_mat)

pesos = ef.max_sharpe ()

cleaned_weights = ef.clean_weights ()

# Enviar pedidos

para o ativo em context.assets:

order_target_percent (activos, cleaned_weights )

ficha (pesos = cleaned_weights)

tempo de observação pesado e a relação entre o direito de:

Quando o reequilíbrio mensal, de fato todos os meses têm renda. Neste caso, em meados de 2017 para Twitter também fez alguns pequenos investimentos.

Minimizar as flutuações na carteira - rebalanceamento mensal

Desta vez, os investidores selecionar os pesos da carteira, minimizando oscilações. Graças PyPortfolioOpt, ao qual pesos = ef.min_volatility () e o fragmento de código anterior de pesos = ef.max_sharpe () como simples.

As estratégias de volatilidade mínimo situa-produzidas é definitivamente o período mais estável de tempo, porque não há muito reequilíbrio entre dois períodos consecutivos. Ao calcular o custo da transação, que é, naturalmente, muito importante.

benefícios comparar

Em comparação abaixo, você pode ver, quando back-testados, para minimizar flutuações na estratégia de ganhos para obter o melhor, enquanto o menor carteira de volatilidade. Beneficia do que a estratégia para maximizar o índice de Sharpe é muito melhor.

Outra observação também é muito interessante: Todas as políticas personalizadas desempenho criadas usando métodos de otimização são melhores do que simples combinação de n 1 e distribuição / combinação de buy and hold.

epílogo

Este artigo mostra como a tirolesa e pypfopt juntos, para que, com base na média - foram back-testadas estratégias de negociação método de otimização de variância. Este artigo discute somente o índice de Sharpe para maximizar ou minimizar a volatilidade global da carteira, no entanto, deve haver mais possibilidades.

direção futuro possível:

programa de otimização, considere as alterações máximas potenciais na distribuição. No caso de comissão zero, este não é um problema. No entanto, na presença de custos de transação, se a cada X dias reequilíbrio completamente, o melhor é evitar gastos excessivos.

permitir a venda a descoberto

Use função objetivo personalizado em problemas de otimização - o uso de diferentes métricas de avaliação para otimizar

É importante lembrar que nos últimos executa estratégia bem e não pode garantir que a mesma situação vai acontecer no futuro.

GitHub: https: //github.com/erykml/medium_articles/blob/master/Quantitative Finanças / technical_analysis_strategies.ipynb

polegares Mensagem atenção

Juntos, compartilhar o aprendizado e desenvolvimento de AI seco

Para reimpressão, por favor deixe uma mensagem bastidores, em conformidade com as normas reimpressão

motorista do sexo masculino usar saltos altos verificado, hesitou para responder por causa da curiosidade, amigos, foco explicando
Anterior
Buffett começou a dizer-lhe o caminho: rote "quatro dígitos" 10,20,50,60, ler todo o mercado de ações para ganhar dinheiro veterano
Próximo