[Blotter-commits] r695 - pkg/FinancialInstrument/R
noreply at r-forge.r-project.org
noreply at r-forge.r-project.org
Fri Jul 22 22:22:04 CEST 2011
Author: braverock
Date: 2011-07-22 22:22:03 +0200 (Fri, 22 Jul 2011)
New Revision: 695
Modified:
pkg/FinancialInstrument/R/build_symbols.R
Log:
- add monthContractsAhead into body of function. patch from Ilya Kipnis to resolve issue
Modified: pkg/FinancialInstrument/R/build_symbols.R
===================================================================
--- pkg/FinancialInstrument/R/build_symbols.R 2011-07-22 14:29:16 UTC (rev 694)
+++ pkg/FinancialInstrument/R/build_symbols.R 2011-07-22 20:22:03 UTC (rev 695)
@@ -1,192 +1,193 @@
-#' construct a series of symbols based on root symbol and suffix letters
-#'
-#' The columns needed by this version of the function are \code{primary_id}
-#' and \code{month_cycle}. \code{primary_id} should match the \code{primary_id}
-#' of the instrument describing the root contract.
-#' \code{month_cycle} should contain a comma delimited string describing the
-#' month sequence to use, e.g. \code{"F,G,H,J,K,M,N,Q,U,V,X,Z"} for all months
-#' using the standard futures letters, or \code{"H,M,U,Z"} for quarters, or
-#' \code{"Mar,Jun,Sep,Dec"} for quarters as three-letter month abbreviations, etc.
-#' The correct values will vary based on your data source.
-#'
-#' @param yearlist vector of year suffixes to be applied, see Details
-#' @param roots data.frame containing at least columns \code{primary_id} and \code{month_cycle}, see Details
-#' @author Brian G. Peterson
-#' @seealso \code{\link{load.instruments}}
+#' construct a series of symbols based on root symbol and suffix letters
+#'
+#' The columns needed by this version of the function are \code{primary_id}
+#' and \code{month_cycle}. \code{primary_id} should match the \code{primary_id}
+#' of the instrument describing the root contract.
+#' \code{month_cycle} should contain a comma delimited string describing the
+#' month sequence to use, e.g. \code{"F,G,H,J,K,M,N,Q,U,V,X,Z"} for all months
+#' using the standard futures letters, or \code{"H,M,U,Z"} for quarters, or
+#' \code{"Mar,Jun,Sep,Dec"} for quarters as three-letter month abbreviations, etc.
+#' The correct values will vary based on your data source.
+#'
+#' @param yearlist vector of year suffixes to be applied, see Details
+#' @param roots data.frame containing at least columns \code{primary_id} and \code{month_cycle}, see Details
+#' @author Brian G. Peterson
+#' @seealso \code{\link{load.instruments}}
#' @TODO add more flexibility in input formats for \code{roots}
-#' @export
-build_series_symbols <- function(roots, yearlist=c(0,1)) {
- symbols<-''
- id_col<-grep('primary_id',colnames(roots)) #TODO: check length
- date_col<-grep('month_cycle',colnames(roots)) #TODO: check length
- for (year_code in yearlist){
- for(i in 1:nrow(roots)) {
- symbols <- c(symbols, paste(paste(roots[i,id_col], strsplit(as.character(roots[i,date_col]),",")[[1]],sep=''),year_code,sep=''))
- }
- }
- return(symbols[-1])
-}
-
-#' build symbols for exchange guaranteed (calendar) spreads
-#'
-#' The columns needed by this version of the function are \code{primary_id},
-#' \code{month_cycle}, and code \code{contracts_ahead}.
-#'
-#' \code{primary_id} should match the \code{primary_id}
-#' of the instrument describing the root contract.
-#'
-#' \code{month_cycle} should contain a comma delimited string describing the
-#' month sequence to use, e.g. \code{"F,G,H,J,K,M,N,Q,U,V,X,Z"} for all months
-#' using the standard futures letters, or \code{"H,M,U,Z"} for quarters, or
-#' \code{"Mar,Jun,Sep,Dec"} for quarters as three-letter month abbreviations, etc.
-#' The correct values will vary based on your data source.
-#'
-#' \code{contracts_ahead} should contain a comma-delimited string describing
-#' the cycle on which the guaranteed calendar spreads are to be consructed,
-#' e.g. '1' for one-month spreads, '1,3' for one and three month spreads,
+#' @export
+build_series_symbols <- function(roots, yearlist=c(0,1)) {
+ symbols<-''
+ id_col<-grep('primary_id',colnames(roots)) #TODO: check length
+ date_col<-grep('month_cycle',colnames(roots)) #TODO: check length
+ for (year_code in yearlist){
+ for(i in 1:nrow(roots)) {
+ symbols <- c(symbols, paste(paste(roots[i,id_col], strsplit(as.character(roots[i,date_col]),",")[[1]],sep=''),year_code,sep=''))
+ }
+ }
+ return(symbols[-1])
+}
+
+#' build symbols for exchange guaranteed (calendar) spreads
+#'
+#' The columns needed by this version of the function are \code{primary_id},
+#' \code{month_cycle}, and code \code{contracts_ahead}.
+#'
+#' \code{primary_id} should match the \code{primary_id}
+#' of the instrument describing the root contract.
+#'
+#' \code{month_cycle} should contain a comma delimited string describing the
+#' month sequence to use, e.g. \code{"F,G,H,J,K,M,N,Q,U,V,X,Z"} for all months
+#' using the standard futures letters, or \code{"H,M,U,Z"} for quarters, or
+#' \code{"Mar,Jun,Sep,Dec"} for quarters as three-letter month abbreviations, etc.
+#' The correct values will vary based on your data source.
+#'
+#' \code{contracts_ahead} should contain a comma-delimited string describing
+#' the cycle on which the guaranteed calendar spreads are to be consructed,
+#' e.g. '1' for one-month spreads, '1,3' for one and three month spreads,
#' '1,6,12' for 1, 6, and 12 month spreads, etc.
-#'
+#'
#' \code{active_months} is a numeric field indicating how many months including
#' the month of the \code{start_date} the contract is available to trade.
#' This number will be used as the upper limit for symbol generation.
-#'
-#' One of \code{data} or \code{file} must be populated for input data.
-#'
-#' @param data data.frame containing at least columns \code{primary_id}, \code{month_cycle}, amd \code{contracts_ahead}, see Details
-#' @param file if not NULL, will read input data from the file named by this argument, in the same folrmat as \code{data}, above
-#' @param outputfile if not NULL, will write out put to this file as a CSV
-#' @param start_date date to start building from, of type \code{Date} or an ISO-8601 date string, defaults to \code{\link{Sys.Date}}
+#'
+#' One of \code{data} or \code{file} must be populated for input data.
+#'
+#' @param data data.frame containing at least columns \code{primary_id}, \code{month_cycle}, amd \code{contracts_ahead}, see Details
+#' @param file if not NULL, will read input data from the file named by this argument, in the same folrmat as \code{data}, above
+#' @param outputfile if not NULL, will write out put to this file as a CSV
+#' @param start_date date to start building from, of type \code{Date} or an ISO-8601 date string, defaults to \code{\link{Sys.Date}}
#' @author Ilya Kipnis <Ilya.Kipnis<at>gmail.com>
-#' @seealso
-#' \code{\link{load.instruments}}
-#' \code{\link{build_series_symbols}}
-#' @export
-build_spread_symbols <- function(data=NULL,file=NULL,outputfile=NULL,start_date=Sys.Date())
-{
- if(!is.null(data)) {
- Data<-data
- } else if(!is.null(file)) {
- Data<-read.csv(file,header=TRUE,stringsAsFactors=FALSE)
- } else {
- stop("you must either pass a data.frame as the 'data' parameter or pass the 'file' parameter")
- }
-
-
-
- yearCheck<-function(monthNum,yearNum){
- if(monthNum>12){
- yearNum=yearNum+1
- } else if(monthNum<0){
- yearNum=yearNum-1
- } else {
- yearNum=yearNum
- }
- return(yearNum)
- }
-
- makeNameCal<-function(primary_id,MonthOne,YearOne,MonthTwo,YearTwo){
- contractName<-NULL
- contractName<-paste(primary_id,MonthOne,YearOne,"-",MonthTwo,YearTwo,sep="")
- return(contractName)
- }
-
- makeCalRows<-function(dataRow){
- calFrame<-NULL
- calContracts<-as.numeric(unlist(strsplit(dataRow$contracts_ahead[1],",",fixed=TRUE)))
- contractIndex<-c(1:length(monthsTraded))
- contractTable<-cbind(monthsTraded,contractIndex)
- for(k in 1:length(calContracts)){
- yearsAhead=trunc(calContracts[k]/length(monthsTraded))%%10
- monthContractsAhead=calContracts[k]%%length(monthsTraded)
- workingContractNum<-as.numeric(contractTable[which(contractTable[,1]==workingContractMonthLet),2])
- monthIndex=workingContractNum+monthContractsAhead
- if(monthIndex>length(monthsTraded)){
- yearsAhead<-(yearsAhead+1)%%10
- monthIndex=monthIndex-length(monthsTraded)
- }
- newCalMonthLetter<-contractTable[monthIndex,1]
- newCalYearNumber<-workingContractYearNum+yearsAhead%%10
- contractName<-makeNameCal(Data$primary_id[i],workingContractMonthLet,workingContractYearNum,newCalMonthLetter,newCalYearNumber)
- calRow<-cbind(contractName,dataRow$type[1])
- #Other data would be added here. Take in a row from root contracts, add other details (EG timezone, currency, etc...)
- calFrame<-rbind(calFrame,contractName)
- }
- return(calFrame)
- }
-
- PPFNames<-c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
- PPFNums<-c(-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
- PPFLets<-c("F","G","H","J","K","M","N","Q","U","V","X","Z","F","G","H","J","K","M","N","Q","U","V","X","Z","F","G","H","J","K","M","N","Q","U","V","X","Z")
- PPFFrame<-as.data.frame(cbind(PPFNames,PPFNums,PPFLets),stringsAsFactors=FALSE) #PPF=Past, Present, Future
-
- contractFrame<-NULL
- today<-start_date
- for(i in 1:nrow(Data)){
- currentMonthNum<-as.numeric(substr(today,6,7))
- monthsTraded<-unlist(strsplit(Data$month_cycle[i],",",fixed=TRUE))
- monthNumsTraded<-as.numeric(PPFFrame[which(PPFFrame[,3] %in% monthsTraded),2])
- currentContractMonthNum<-as.numeric(monthNumsTraded[(min(which(monthNumsTraded>=currentMonthNum)))])
- currentContractMonthLet<-PPFFrame[currentContractMonthNum,3]
- currentYearNum<-as.numeric(substr(today,4,4))
- currentContractYearNum<-yearCheck(currentContractMonthNum,currentYearNum)
-
- workingContractMonthNum<-currentContractMonthNum
- workingContractMonthLet<-currentContractMonthLet
- workingContractYearNum<-currentContractYearNum
-
- contractIndex<-c(1:length(monthsTraded))
- contractTable<-cbind(monthsTraded,contractIndex)
-
- if(Data$type[i]=="calendar_spread" || Data$type[i]=='guaranteed_spread'){
- calFrame<-makeCalRows(Data[i,])
- contractFrame<-rbind(contractFrame,calFrame)
- } else {
- #make name for non-calendar
- #add other details to the row
- #rbind it to the contractFrame
- }
-
- for(j in 1:(Data$active_months[i]-1)){
- yearsAhead=trunc(j/length(monthsTraded))%%10 #aka if it's 10+ years ahead, since the year is one digit, for contracts further out than 10 years, you'll get 0, 1, 2, 3 instead of 10, 11, 12, etc.
- currentContractNum<-as.numeric(contractTable[which(contractTable[,1]==currentContractMonthLet),2])
- monthIndex=currentContractNum+monthContractsAhead
- if(monthIndex>length(monthsTraded)){
- yearsAhead<-(yearsAhead+1)%%10
- monthIndex=monthIndex-length(monthsTraded)
- }
- workingContractMonthLet<-contractTable[monthIndex,1]
- workingContractYearNum<-currentContractYearNum+yearsAhead
- if(Data$type[i]=="calendar_spread" || Data$type[i]=='guaranteed_spread'){
- calFrame<-makeCalRows(Data[i,])
- contractFrame<-rbind(contractFrame,calFrame)
- } else {
- #make name for non-calendar
- #add other details to the row
- #rbind it to the contractFrame
- }
- }
- }
-
- rownames(contractFrame)<-NULL
- colnames(contractFrame)<-c("RICs")
-
- if(!is.null(outputfile)){
- write.csv(contractFrame,outputfile)
- } else {
- return(contractFrame)
- }
-}
-
-###############################################################################
-# R (http://r-project.org/) Instrument Class Model
-#
-# Copyright (c) 2009-2011
-# Peter Carl, Lance Levenson, Brian G. Peterson
-#
-# This code is distributed under the terms of the GNU Public License (GPL)
-# for full details see the file COPYING
-#
+#' @seealso
+#' \code{\link{load.instruments}}
+#' \code{\link{build_series_symbols}}
+#' @export
+build_spread_symbols <- function(data=NULL,file=NULL,outputfile=NULL,start_date=Sys.Date())
+{
+ if(!is.null(data)) {
+ Data<-data
+ } else if(!is.null(file)) {
+ Data<-read.csv(file,header=TRUE,stringsAsFactors=FALSE)
+ } else {
+ stop("you must either pass a data.frame as the 'data' parameter or pass the 'file' parameter")
+ }
+
+
+
+ yearCheck<-function(monthNum,yearNum){
+ if(monthNum>12){
+ yearNum=yearNum+1
+ } else if(monthNum<0){
+ yearNum=yearNum-1
+ } else {
+ yearNum=yearNum
+ }
+ return(yearNum)
+ }
+
+ makeNameCal<-function(primary_id,MonthOne,YearOne,MonthTwo,YearTwo){
+ contractName<-NULL
+ contractName<-paste(primary_id,MonthOne,YearOne,"-",MonthTwo,YearTwo,sep="")
+ return(contractName)
+ }
+
+ makeCalRows<-function(dataRow){
+ calFrame<-NULL
+ calContracts<-as.numeric(unlist(strsplit(dataRow$contracts_ahead[1],",",fixed=TRUE)))
+ contractIndex<-c(1:length(monthsTraded))
+ contractTable<-cbind(monthsTraded,contractIndex)
+ for(k in 1:length(calContracts)){
+ yearsAhead=trunc(calContracts[k]/length(monthsTraded))%%10
+ monthContractsAhead=calContracts[k]%%length(monthsTraded)
+ workingContractNum<-as.numeric(contractTable[which(contractTable[,1]==workingContractMonthLet),2])
+ monthIndex=workingContractNum+monthContractsAhead
+ if(monthIndex>length(monthsTraded)){
+ yearsAhead<-(yearsAhead+1)%%10
+ monthIndex=monthIndex-length(monthsTraded)
+ }
+ newCalMonthLetter<-contractTable[monthIndex,1]
+ newCalYearNumber<-workingContractYearNum+yearsAhead%%10
+ contractName<-makeNameCal(Data$primary_id[i],workingContractMonthLet,workingContractYearNum,newCalMonthLetter,newCalYearNumber)
+ calRow<-cbind(contractName,dataRow$type[1])
+ #Other data would be added here. Take in a row from root contracts, add other details (EG timezone, currency, etc...)
+ calFrame<-rbind(calFrame,contractName)
+ }
+ return(calFrame)
+ }
+
+ PPFNames<-c("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
+ PPFNums<-c(-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24)
+ PPFLets<-c("F","G","H","J","K","M","N","Q","U","V","X","Z","F","G","H","J","K","M","N","Q","U","V","X","Z","F","G","H","J","K","M","N","Q","U","V","X","Z")
+ PPFFrame<-as.data.frame(cbind(PPFNames,PPFNums,PPFLets),stringsAsFactors=FALSE) #PPF=Past, Present, Future
+
+ contractFrame<-NULL
+ today<-start_date
+ for(i in 1:nrow(Data)){
+ currentMonthNum<-as.numeric(substr(today,6,7))
+ monthsTraded<-unlist(strsplit(Data$month_cycle[i],",",fixed=TRUE))
+ monthNumsTraded<-as.numeric(PPFFrame[which(PPFFrame[,3] %in% monthsTraded),2])
+ currentContractMonthNum<-as.numeric(monthNumsTraded[(min(which(monthNumsTraded>=currentMonthNum)))])
+ currentContractMonthLet<-PPFFrame[currentContractMonthNum,3]
+ currentYearNum<-as.numeric(substr(today,4,4))
+ currentContractYearNum<-yearCheck(currentContractMonthNum,currentYearNum)
+
+ workingContractMonthNum<-currentContractMonthNum
+ workingContractMonthLet<-currentContractMonthLet
+ workingContractYearNum<-currentContractYearNum
+
+ contractIndex<-c(1:length(monthsTraded))
+ contractTable<-cbind(monthsTraded,contractIndex)
+
+ if(Data$type[i]=="calendar_spread" || Data$type[i]=='guaranteed_spread'){
+ calFrame<-makeCalRows(Data[i,])
+ contractFrame<-rbind(contractFrame,calFrame)
+ } else {
+ #make name for non-calendar
+ #add other details to the row
+ #rbind it to the contractFrame
+ }
+
+ for(j in 1:(Data$active_months[i]-1)){
+ yearsAhead=trunc(j/length(monthsTraded))%%10 #aka if it's 10+ years ahead, since the year is one digit, for contracts further out than 10 years, you'll get 0, 1, 2, 3 instead of 10, 11, 12, etc.
+ monthContractsAhead=j%%length(monthsTraded)
+ currentContractNum<-as.numeric(contractTable[which(contractTable[,1]==currentContractMonthLet),2])
+ monthIndex=currentContractNum+monthContractsAhead
+ if(monthIndex>length(monthsTraded)){
+ yearsAhead<-(yearsAhead+1)%%10
+ monthIndex=monthIndex-length(monthsTraded)
+ }
+ workingContractMonthLet<-contractTable[monthIndex,1]
+ workingContractYearNum<-currentContractYearNum+yearsAhead
+ if(Data$type[i]=="calendar_spread" || Data$type[i]=='guaranteed_spread'){
+ calFrame<-makeCalRows(Data[i,])
+ contractFrame<-rbind(contractFrame,calFrame)
+ } else {
+ #make name for non-calendar
+ #add other details to the row
+ #rbind it to the contractFrame
+ }
+ }
+ }
+
+ rownames(contractFrame)<-NULL
+ colnames(contractFrame)<-c("RICs","type")
+
+ if(!is.null(outputfile)){
+ write.csv(contractFrame,outputfile)
+ } else {
+ return(contractFrame)
+ }
+}
+
+###############################################################################
+# R (http://r-project.org/) Instrument Class Model
+#
+# Copyright (c) 2009-2011
+# Peter Carl, Lance Levenson, Brian G. Peterson
+#
+# This code is distributed under the terms of the GNU Public License (GPL)
+# for full details see the file COPYING
+#
# $Id$
-#
-###############################################################################
+#
+###############################################################################
More information about the Blotter-commits
mailing list