Documentazione
Applicazioni
Ultimo aggiornamento il 22. 12. 2021 da Mark Fric
Modifica programmatica dei parametri della strategia
La richiesta originale:
Esiste un modo per applicare i migliori parametri suggeriti alla strategia durante un'ottimizzazione Walk-Forward passata? (Sto cercando di farlo nel mio flusso di lavoro per eseguire un ultimo OOS con i migliori parametri applicati all'ultimo periodo).
È possibile, vedere l'esempio seguente. Si tratta di uno snippet di CustomAnalysis che può essere eseguito al termine dell'ottimizzazione di WF.
Questo dimostra anche come applicare i parametri alla strategia in modo programmatico in generale.
Si noti che l'impostazione dei parametri alla strategia è piuttosto complessa, per cui abbiamo creato una classe di aiuto speciale StrategiaParametriHelper che viene utilizzato in questo esempio.
Snippet di analisi personalizzato CAApplyOptimParams - l'esempio reale:
pacchetto SQ.CustomAnalysis;
importare com.strategyquant.lib.*;
importare org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.strategyquant.tradinglib.*;
import com.strategyquant.tradinglib.optimization.ParametersSettings;
import com.strategyquant.tradinglib.optimization.WalkForwardMatrixResult;
importare org.jdom2.Element;
importare SQ.Utils.StrategyParametersHelper;
public class CAApplyOptimParams extends CustomAnalysisMethod {
public static final Logger Log = LoggerFactory.getLogger("CAApplyOptimParams");
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
public CAApplyOptimParams() {
super("CAApplyOptimParams", TYPE_FILTER_STRATEGY);
}
//------------------------------------------------------------------------
@Override
public boolean filterStrategy(String project, String task, String databankName, ResultsGroup rg) throws Exception {
// otteniamo il risultato WF dalla strategia (ResultsGroup)
WalkForwardMatrixResult mwfResult = (WalkForwardMatrixResult) rg.mainResult().get(SettingsKeys.WalkForwardResult);
if(mwfResult==null) {
restituisce true;
}
// ottenere il risultato WF scelto in caso di matrice WF
WalkForwardResult bestWFResult = mwfResult.getWFResult(rg.getBestWFResultKey(), false);
if(bestWFResult == null) {
return true;
}
// verificare che il risultato WF abbia dei periodi
if(bestWFResult.wfPeriods == null || bestWFResult.wfPeriods.size() <= 0) {
return true;
}
// scegliere l'ultimo periodo, che è quello con i parametri da utilizzare in futuro
WalkForwardPeriod lastPeriod = bestWFResult.wfPeriods.get(bestWFResult.wfPeriods.size()-1);
String lastParameters = lastPeriod.testParameters;
Log.info("Parametri futuri consigliati: {}", lastParameters);
// questo verifica solo se utilizziamo variabili simmetriche nella strategia, o separate per Long/Short
Element lastSettings = XMLUtil.stringToElement(rg.getLastSettings());
ParametersSettings parametersSettings = new ParametersSettings();
parametersSettings.setFromXML(lastSettings, rg.getStrategyXml());
booleano symmetricVariables = parametersSettings.symmetry;
// impostare nuovi parametri utilizzando questa classe di aiuto
// i parametri sono nella stringa lastParameters come chiavi=valori separati da virgole
// per esempio: "FirstPerod=28,SecondPeriod=34,Coef=3.45"
StrategyParametersHelper.setParameters(rg, lastParameters, symmetricVariables, true);
restituisce true;
}
}
StrategiaParametriHelper classe:
pacchetto SQ.Utils;
importare com.strategyquant.lib.SQTime;
importare com.strategyquant.lib.XMLUtil;
import com.strategyquant.tradinglib.*;
importare com.strategyquant.tradinglib.options.TradingOptionsList;
importare com.strategyquant.tradinglib.propertygrid.IPGParameter;
importare com.strategyquant.tradinglib.propertygrid.ParametersTableItemProperties;
importare org.jdom2.Element;
importare org.slf4j.Logger;
import org.slf4j.LoggerFactory;
importare java.util.ArrayList;
importare java.util.HashMap;
importare java.util.List;
public class StrategyParametersHelper {
public static final Logger Log = LoggerFactory.getLogger(StrategyParametersHelper.class);
//------------------------------------------------------------------------
//------------------------------------------------------------------------
//------------------------------------------------------------------------
/**
* Classe helper per impostare i parametri alla strategia
* @param rg - strategia (ResultsGroup) a cui applicare i parametri
* @param parametri - parametri in stringa come chiavi=valori separati da virgola, esempio: "FirstPerod=28,SecondPeriod=34,Coef=3.45"
* @param symmetricVariables - vengono utilizzate variabili simmetriche?
* @param modifyLastSettings - modifica anche l'ultima impostazione memorizzata per questa strategia?
* @Trova un'eccezione
*/
public static void setParameters(ResultsGroup rg, String parameters, boolean symmetricVariables, boolean modifyLastSettings) throws Exception {
//Carica l'XML e aggiorna le variabili
StrategyBase xmlS = StrategyBase.createXmlStrategy(rg.getStrategyXml());
xmlS.transformToVariables(symmetricVariables);
Variabili variabili = xmlS.variables();
String[] params = parameters.split(",");
HashMap paramMap = new HashMap();
for(int i=0; i<params.length; i++) {
String[] values = params[i].split("=");
paramMap.put(valori[0], valori[1]);
}
for(int a=0; a<variables.size(); a++) {
Variabile variabile = variabili.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, parameters);
se(modifyLastSettings){
try {
Element lastSettings = XMLUtil.stringToElement(rg.getLastSettings());
Element elParams = lastSettings.getChild("Options").getChild("BuildTradingOptions").getChild("Params");
List paramElems = elParams.getChildren("Param");
List tradingOptions = TradingOptionsList.getInstance().getAvailableClasses();
for(String paramName : paramMap.keySet()) {
booleano elaborato = false;
//dobbiamo trovare l'opzione di trading giusta
for(int i=0; i<tradingOptions.size(); i++) {
if(processed) break;
TradingOption option = tradingOptions.get(i);
String optionClass = option.getClass().getSimpleName();
ArrayList optionParams = option.getParams();
//scorre i suoi parametri e trova quello con il nome corrispondente
for(int z=0; z<optionParams.size(); z++) {
if(elaborato) break;
IPGParameter optionParam = optionParams.get(z);
String paramKey = optionParam.getKey();
if(!optionParam.getName().equals(paramName)) continua;
//ora troviamo l'elemento Param giusto nell'XML delle impostazioni e aggiorniamo il suo valore
for(int s=0; s<paramElems.size(); s++) {
Element elParam = paramElems.get(s);
String elParamClass = elParam.getAttributeValue("className");
String elParamKey = elParam.getAttributeValue("key");
if(elParamClass.null && elParamKey.null && elParamClass.equals(optionClass) && elParamKey.equals(paramKey)) {
String value = paramMap.get(paramName);
if(optionParam.getType() == ParametersTableItemProperties.TYPE_TIME) {
value = "" + SQTime.HHMMToMinutes(Integer.parseInt(value)) * 60;
}
elParam.setText(valore);
elaborato = vero;
break;
}
}
}
}
}
rg.setLastSettings(XMLUtil.elementToString(lastSettings));
}
catch(Exception e){
Log.error("Impossibile applicare i parametri delle opzioni di trading alle ultime impostazioni", e);
}
}
}
}
Questo articolo è stato utile? L'articolo è stato utile L'articolo non è stato utile
Grazie, questo è davvero fantastico !!!! Non ho capito dove mettere StrategiaParametriHelper quindi ho clonato una funzione e l'ho chiamata StrategiaParametriHelper . si trova nella cartella delle funzioni. dovrebbe funzionare
Ho trovato la soluzione!! importando il file allegato. Questo articolo è eccellente !!! Mi sta aiutando molto.
Grazie mille per il tuo fantastico lavoro !!!!
Funziona bene nella sezione Optimizer, attualmente è in fase di test con AutomaricRetest nel flusso di lavoro personalizzato...
18:29:22 WF : GRID: Errore durante l'elaborazione del risultato della strategia - Impossibile caricare le impostazioni dei parametri. Elemento 'Ottimizzazione' non trovato
con la versione 142