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