Documentação
Aplicações
Última atualização em 22. 12. 2021 por Mark Fric
Mudança programática dos parâmetros estratégicos
O pedido original:
Existe uma maneira de aplicar os melhores parâmetros sugeridos para a estratégia durante uma Otimização de Caminhada para Frente passada? (Procurando fazer isso no meu fluxo de trabalho para executar um último OOS com os melhores parâmetros aplicados ao último período)
É possível, veja o exemplo abaixo. Ele é feito como um snippet CustomAnalysis que pode funcionar após a otimização do WF estar concluída.
Isto também demonstra como aplicar parâmetros programáticos à estratégia em geral.
Observe que definir parâmetros para a estratégia é bastante complexo, criamos uma classe especial de ajudantes EstratégiaParametersHelper que é usado neste exemplo.
Snippet de análise personalizada CAApplyOptimParams - o exemplo real:
pacote SQ.CustomAnalysis;
import com.strategyquant.lib.*;
importação org.slf4j.Logger;
importação org.slf4j.LoggerFactory;
import com.strategyquant.tradinglib.*;
import com.strategyquant.tradinglib.optimization.ParametersSettings;
import com.strategyquant.tradinglib.optimization.WalkForwardMatrixResult;
importação org.jdom2.Element;
importação SQ.Utils.StrategyParametersHelper;
classe pública CAApplyOptimParams estende o CustomAnalysisMethod {
logger final estático público = LoggerFactory.getLogger("CAApplyOptimParams");
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
público CAApplyOptimParams() {
super("CAApplyOptimParams", TYPE_FILTER_STRATEGY);
}
//------------------------------------------------------------------------
@Override
filtro booleano públicoEstratégia (projeto String, tarefa String, banco de dados StringName, ResultsGroup rg) lança Exceção {
// obter o resultado WF da estratégia (ResultsGroup)
WalkForwardMatrixResult mwfResult = (WalkForwardMatrixResult) rg.mainResult().get(SettingsKeys.WalkForwardResult);
if(mwfResult==nulo) {
retornar verdadeiro;
}
// ser escolhido resultado WF no caso da Matriz WF
WalkForwardResult bestWFResult = mwfResult.getWFResult(rg.getBestWFResultKey(), falso);
if(bestWFResult == nulo) {
retornar verdadeiro;
}
// verificar se o resultado da WF tem alguns períodos
if(bestWFResult.wfPeriods == nulo || bestWFResult.wfPeriods.size() <= 0) {
retornar verdadeiro;
}
// escolha o último período - é aquele com parâmetros a serem utilizados para o futuro
WalkForwardPeriod lastPeriod = bestWFResult.wfPeriods.get(bestWFResult.wfPeriods.size()-1);
LastParameters de corda = lastPeriod.testParameters;
Log.info("Parâmetros futuros recomendados: {}", lastParameters);
// isto só verifica se usamos variáveis simétricas na estratégia, ou separadas para Long/Short
Elemento LastSettings = XMLUtil.stringToElement(rg.getLastSettings()));
ParâmetrosConfiguraçõesParâmetrosConfigurações = novos ParâmetrosConfigurações();
parametrosSettings.setFromXML(lastSettings, rg.getStrategyXml());
boolean symmetricVariables = parametersSettings.symmetry;
// definir novos parâmetros usando a classe helper
// os parâmetros estão em String lastParameters como chaves=valores separados por vírgula
// por exemplo: "FirstPerod=28,SecondPeriod=34,Coef=3.45"
StrategyParametersHelper.setParameters(rg, lastParameters, symmetricVariables, true);
retornar verdadeiro;
}
}
EstratégiaParametersHelper classe:
pacote SQ.Utils;
import com.strategyquant.lib.SQTime;
importar com.strategyquant.lib.XMLUtil;
import com.strategyquant.tradinglib.*;
importar com.strategyquant.tradinglib.options.TradingOptionsList;
importar com.strategyquant.tradinglib.propertygrid.IPGParameter;
import com.strategyquant.tradinglib.propertygrid.ParametersTableItemProperties;
import org.jdom2.Element;
importação org.slf4j.Logger;
importação org.slf4j.LoggerFactory;
importação java.util.ArrayList;
importação de java.util.HashMap;
importação java.util.List;
classe pública StrategyParametersHelper {
logger final estático público = LoggerFactory.getLogger(StrategyParametersHelper.class);
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
/**
* Classe de ajuda para definir parâmetros para a estratégia
* @param rg - estratégia (ResultsGroup) para aplicar parâmetros
* @param parameters - parâmetros em String como chaves=valores separados por vírgula, exemplo: "FirstPerod=28,SecondPeriod=34,Coef=3.45"
* @param symmetricVariables - são usadas variáveis simétricas?
* @param modifyLastSettings - modifica também a última configuração armazenada para esta estratégia?
* @throws Exceção
*/
conjunto de parâmetros estáticos públicosParâmetros estáticos(ResultadosParâmetros de grupo, String, boolean symmetricVariables, boolean modifyLastSettings) lança Exceção {
//Load XML e atualizar variáveis
StrategyBase xmlS = StrategyBase.createXmlStrategy(rg.getStrategyXml());
xmlS.transformToVariables(symmetricVariables);
Variáveis variáveis = xmlS.variables();
String[] params = parameters.split(",");
HashMap paramMap = novo HashMap();
for(int i=0; i<params.length; i++) {
String[] values = params[i].split("=");
paramMap.put(valores[0], valores[1]);
}
for(int a=0; a<variables.size(); a++) {
Variable variable = variables.get(a);
if(paramMap.containsKey(variable.getName())) {
variable.setFromString(paramMap.get(variable.getName()));
}
}
xmlS.transformToNumbers();
rg.portfolio().addStrategyXml(xmlS.getStrategyXml());
rg.specialValues().setString(StatsKey.OPTIMIZATION_PARAMETERS, parâmetros);
if(modificarLastSettings){
tente {
Elemento LastSettings = XMLUtil.stringToElement(rg.getLastSettings()));
Element elParams = lastSettings.getChild("Options").getChild("BuildTradingOptions").getChild("Params");
Lista paramElems = elParams.getChildren("Param");
ListaOpções Comerciais = TradingOptionsList.getInstance().getAvailableClasses();
for(String paramName : paramMap.keySet()) {
processado booleano = falso;
// devemos encontrar a opção comercial correta
for(int i=0; i<tradingOptions.size(); i++) {
se(processado) quebra;
Opção TradingOption = tradingOptions.get(i);
String optionClass = option.getClass().getSimpleName();
ArrayList optionParams = option.getParams();
// passar por seus paramédicos e encontrar aquele com o nome correspondente
for(int z=0; z<optionParams.size(); z++) {
se(processado) quebra;
IPGParameter optionParameter = optionParams.get(z);
String paramKey = optionParam.getKey();
if(!optionParam.getName().equals(paramName)) continua;
//agenda encontrar o elemento de parâmetro correto nas configurações XML e atualizar seu valor
for(int s=0; s<paramElems.size(); s++) {
Element elParam = paramElems.get(s);
String elParamClass = elParam.getAttributeValue("className");
String elParamKey = elParam.getAttributeValue("chave");
if(elParamClass != null && elParamKey != null && elParamClass.equals(optionClass) && elParamKey.equals(paramKey)) {
String value = paramMap.get(paramName);
if(optionParam.getType() == ParametrosTableItemProperties.TYPE_TIME) {
valor = "" + SQTime.HHMMToMinutes(Integer.parseInt(valor)) * 60;
}
elParam.setText(valor);
processado = verdadeiro;
pausa;
}
}
}
}
}
rg.setLastSettings(XMLUtil.elementToString(lastSettings));
}
catch(Exceção e){
Log.error("Não é possível aplicar parâmetros de opções comerciais às últimas configurações", e);
}
}
}
}
Este artigo foi útil? O artigo foi útil O artigo não foi útil
Obrigado, isto é realmente fantástico !!!! Eu não fiz onde colocar EstratégiaParametersHelper classe, então eu clonei uma função e nomeei-a EstratégiaParametersHelper . está em pasta de funções. deve funcionar
Eu encontrei a solução !! apenas importando o arquivo anexo . Este é um artigo excelente !!! Está ajudando muito.
Muito obrigado por seu fantástico trabalho !!!!
Funciona bem na seção Otimizador, testando com AutomaricRetest no fluxo de trabalho personalizado atualmente...
18:29:22 WF : GRID: Erro ao processar o resultado da estratégia - Não é possível carregar as configurações dos parâmetros. Elemento 'Optimization' não encontrado
com a versão 142