Continuiamo la discussione cominciata nella Prima parte.
La sezione seguente
#IEF = adjustOHLC(IEF)
#SPY = adjustOHLC(SPY)
anche se commentata, utilizza i dati modificati a causa di splits e dividendi. Questa function è da utilizzarsi se si selezionano titoli azionari. Per gli indici, quelli usati nell’esempio, non è necessaria, dato che non subiscono nessuna di queste due operazioni.
Vediamo adesso una function molto utile degli oggetti “xts”
IEF = to.monthly(IEF, indexAt=’endof’
SPY = to.monthly(SPY, indexAt=’endof’)
La function “to.monthly()” converte il time-frame dei dati. Nel caso qui presentato i prezzi vengono convertiti da giornalieri a mensili, presentando così, per ogni barra, l’apertura, il max, il min e la chiusura di ogni mese. Nel caso le esigenze lo richiedano, è possibile passare a time-frames diversi, tipo settimanali o annuali. Non è possibile, ovviamente, scendere da periodi più lunghi a quelli più brevi (ad esempio da mesi a giorni).
Nella sezione seguente vedremo l’uso di indicatori tecnici, contenuti nel package “TTR”
print(“Setting up indicators”)
IEF$SMA = SMA(Cl(IEF), 10)
SPY$SMA = SMA(Cl(SPY), 10)
In pratica, abbiamo calcolato le medie mobili a 10 periodi dei prezzi di chiusura dei due titoli.
Vediamo qui anche un’altra caratteristica delle strutture dati di R. Il comando:
SPY$SMA = SMA(Cl(SPY), 10)
aggiunge all’oggetto “SPY” un’ulteriore serie di dati, quella calcolata dalla media mobile. Essendo entrambi oggetti “xts”, la corrispondenza tra prezzi e valore della media viene gestita automaticamente tramite il valore delle date.
initPortf(name=’default’, symbols=symbols, initDate=initDate)
initAcct(name=’default’, portfolios=’default’, initDate=initDate, initEq=initEq)
verbose = TRUE
Qui cominciamo a vedere l’uso di due oggetti di “blotter”. Il primo è
“portfolio”, un oggetto che tiene traccia dei titoli scelti. Portfolio può
tracciare l’andamento di ogni titolo contenuto periodo per periodo.
Il secondo è “account”, che può contenere uno o più oggetti portfolio, e che
tiene traccia di tutti i titoli e i portfolio nel complesso sempre periodo
per periodo.
A questo punto entriamo nel vivo della simulazione.
for( i in 10:NROW(SPY) ) {
equity = getEndEq(Account=’default’, CurrentDate)
for( symbol in symbols ) {
sym = get(symbol)
ClosePrice = as.numeric(Cl(sym[i,]))
Posn = getPosQty(Portfolio=’default’, Symbol=symbol,Date=CurrentDate)
UnitSize = as.numeric(trunc((equity/NROW(symbols))/ClosePrice))
# Position Entry (assume fill at close)
if( Posn == 0 ) {
# No position, so test to initiate Long position
if( Cl(sym[i,]) > sym[i,’SMA’] ) {
# Store trade with blotter
addTxn(‘default’, Symbol=symbol, TxnDate=CurrentDate, TxnPrice=ClosePrice, TxnQty=UnitSize, TxnFees=0, verbose=verbose)
}
} else {
# Have a position, so check exit
if( Cl(sym[i,]) < sym[i,’SMA’] ) {
# Store trade with blotter
addTxn(Portfolio=’default’, Symbol=symbol, TxnDate=CurrentDate, TxnPrice=ClosePrice, TxnQty=-Posn, TxnFees=0, verbose=verbose)
}
}
} # End symbols loop
# Calculate P&L and resulting equity with blotter
updatePortf(Portfolio=’default’, Dates=CurrentDate)
updateAcct(name=’default’, Dates=CurrentDate)
updateEndEq(Account=’default’, Dates=CurrentDate)
} # End dates loop
Qui ci sono due cicli for, il primo effettua il ciclo sul periodo, cioè mese
per mese, il secondo fa una verifica sulle condizioni simbolo per simbolo e,
in caso di verifica, effettua le transazioni. Queste vengono registrate con
la function “addTxn()” nel portfolio. Alla fine, per ogni periodo, vengono
chiamate tre function per aggiornare il portfolio, l’account e l’equity
finale, cioè “updatePortf()”, “updateAcct()” e “updateEndEq()”.
La parte finale:
buyhold = exp(cumsum( ( 0.5*ROC(Cl(IEF)) + 0.5*ROC(Cl(SPY)) )[-1] ))
# Final values
cat(‘Tactical Asset Allocation Return: ‘,(getEndEq(Account=’default’,
Date=CurrentDate)-initEq)/initEq,’\n’)
cat(‘Buy and Hold Return: ‘,tail(buyhold,1)-1,’\n’)
# Plot Strategy Summary
png(filename=”20091118_blotter_strategy.png”, 720, 720)
#charts.PerformanceSummary(ROC(getAccount(‘default’)$TOTAL$End.Eq)[-1],main=”Tactical
Asset Allocation”)
charts.PerformanceSummary(ROC(getAccount(‘default’)$summary$End.Eq)[-1],main=”Tactical
Asset Allocation”)
dev.off()
# Plot Buy and Hold Summary
png(filename=”20091118_blotter_buyhold.png”, 720, 720)
charts.PerformanceSummary(ROC(buyhold)[-1],main=”Buy & Hold”)
dev.off()
calcola la performance della strategia “buy and hold” e disegna i grafici.
Il disegno dei grafici avviene su immagini png, salvate nella cartella di
lavoro di R.
Bene, siamo alla fine di questa spiegazione. Spero che sia stata utile per
mostrare le grandi potenzialità di R.
A presto.