quantmode newbie here,
My end goal is to have a CSV file including monthly stock prices, I've downloaded the data using getSymbols using this code:
Symbols <- c("DIS", "TSLA","ATVI", "MSFT", "FB", "ABT","AAPL","AMZN",
"BAC","NFLX","ADBE","WMT","SRE","T","MS")
Data <- new.env()
getSymbols(c("^GSPC",Symbols),from="2015-01-01",to="2020-12-01"
,periodicity="monthly",
env=Data)
the line above works fine, now I need to create a data frame that only includes the adjusted prices for all the symbols with a data column ofc,
any help, please? :)
Desired output would be something similar to this
enter image description here
Another straightforward way to get your monthly data:
tickers <- c('AMZN','FB','GOOG','AAPL')
getSymbols(tickers,periodicity="monthly")
head(do.call("merge.xts",c(lapply(mget(tickers),"[",,6),all=FALSE)),3)
AMZN.Adjusted FB.Adjusted GOOG.Adjusted AAPL.Adjusted
2012-06-01 228.35 31.10 288.9519 17.96558
2012-07-01 233.30 21.71 315.3032 18.78880
2012-08-01 248.27 18.06 341.2658 20.46477
Note the logical argument all = FALSE is the equivalent of an innerjoin and you get data when all of your stocks have prices. all = TRUE fills data which is not available with NAs (outerjoin).
To write the file you can use:
write.zoo(monthlyPrices,file = 'filename.csv',sep=',',quote=FALSE)
First get your data from the environment:
require(quantmod)
# your code
dat <- mget(ls(Data), env=Data)
Then draw the data from the Objects:
newdat <- as.data.frame(sapply( names(dat), function(x) coredata(dat[[x]])[,1] ))
Note that this takes the Opening values (see: dat[[x]])[,1]), the Objects have more, e.g.:
names(dat[["AAPL"]])
[1] "AAPL.Open" "AAPL.High" "AAPL.Low" "AAPL.Close"
[5] "AAPL.Volume" "AAPL.Adjusted"
Last, get the dates (assumes symmetric dates for all symbols):
rownames(newdat) <- index(dat[["AAPL"]])
# OR, more universal, by extracting from the complete list:
rownames(newdat) <-
as.data.frame( sapply( names(dat), function(x) as.character(index(dat[[x]])) ) )[,1]
head(newdat, 3)
AAPL ABT ADBE AMZN ATVI BAC DIS FB GSPC MS
2015-01-01 27.8475 45.25 72.70 312.58 20.24 17.99 94.91 78.58 2058.90 39.05
2015-02-01 29.5125 44.93 70.44 350.05 20.90 15.27 91.30 76.11 1996.67 33.96
2015-03-01 32.3125 47.34 79.14 380.85 23.32 15.79 104.35 79.00 2105.23 35.64
MSFT NFLX SRE T TSLA WMT
2015-01-01 46.66 49.15143 111.78 33.59 44.574 86.27
2015-02-01 40.59 62.84286 112.38 33.31 40.794 84.79
2015-03-01 43.67 67.71429 108.20 34.56 40.540 83.93
Writing the csv:
write.csv(newdat, "file.csv")
I have more than 300 stocks downloaded with getsymbols() and I have the name of this stocks in a vector, for example:
USA_STOCKS = c("AAL","AAPL","ADBE","ADI","ADP","ADSK","ALGN",
"ALXN","AMAT","AMGN","AMZN","ASML","ATVI","AVGO",
"BIDU","BIIB") # This is just an extract from 300
getSymbols(AAL) # this is just one of the 300 "getsymbols"
With that, I have a XTS object called AAL and a vector USA_TOCKS with all the name of the XTS Objets.
I would like to do:
AAL = na.omit(AAL)
But, instead of use the Object AAL, I want to refer the object using the name inside the vector. Something like this:
USA_STOCKS[1] = na.omit(USA_STOCKS[1])
Obviusly if i did this, I will change only the name of "AAL" inside the vector. But what I want is to refer the object AAL.
Hmm, still a bit unclear, but I think you want to do something like this:
library(quantmod)
USA_STOCKS = c("AAL","AAPL","ADBE")
# Put all requested quotes in big list
stocks_usa <- lapply(USA_STOCKS,
getSymbols,
from = "2018-10-01",
to = "2018-11-01",
auto.assign = F)
# set the names of the list
names(stocks_usa) <- USA_STOCKS
#reference AAL
head(stocks_usa$AAL)
AAL.Open AAL.High AAL.Low AAL.Close AAL.Volume AAL.Adjusted
2018-10-01 41.41 41.75 39.60 39.61 7210700 39.50097
2018-10-02 39.60 39.60 38.40 38.50 7625000 38.39403
2018-10-03 38.70 39.26 38.42 38.80 6370300 38.69320
2018-10-04 38.80 39.01 37.48 37.92 5916500 37.81562
2018-10-05 37.93 38.13 36.21 36.44 9127000 36.33969
2018-10-08 36.44 36.85 35.60 35.90 7879300 35.80119
# more referencing
stocks_usa$AAL <- na.omit(stocks_usa$AAL)
I am trying to download some stocks data but the quantmod functions don't seem to work. For example:
getSymbols.yahoo("F",env= globalenv(), return.class = 'xts',
from = "2017-01-01",
to = Sys.Date())
[1] "F"
The package is upadated, as well as the local date set = Sys.setlocale("LC_TIME", "C"). I also tried with getSymbols.google but it doesn't work neither and to change the return class.
getSymbols() currently (as-of 0.4-10) loads the data into an environment, just like the load() function. In quantmod 0.5-0, it will return the data, like read.table() and most other functions.
If you want getSymbols() to return the data, you can set auto.assign = FALSE.
Data <- getSymbols("F", from = "2017-01-01", to = Sys.Date(), auto.assign = FALSE)
Also note that you should not call getSymbols.yahoo() directly (as it says in ?getSymbols.yahoo).
That's correct. Now if you want to see the historical data just type F:
> head(F)
F.Open F.High F.Low F.Close F.Volume F.Adjusted
2017-01-03 12.20 12.60 12.13 12.59 40510800 12.22555
2017-01-04 12.77 13.27 12.74 13.17 77638100 12.78876
2017-01-05 13.21 13.22 12.63 12.77 75628400 12.40034
2017-01-06 12.80 12.84 12.64 12.76 40315900 12.39063
2017-01-09 12.79 12.86 12.63 12.63 39183400 12.26440
2017-01-10 12.70 13.02 12.66 12.85 58703500 12.47803
I have a text file with close data that I am trying to convert to XTS format.
I am able to call it into R, but cannot figure out a way to convert this data to XTS format. Below is the sample data I am working with.
05/31/2017,32.78,FCOM
05/30/2017,32.72,FCOM
05/26/2017,32.56,FCOM
05/25/2017,32.57,FCOM
05/24/2017,32.47,FCOM
05/31/2017,35.63,FDIS
05/30/2017,35.71,FDIS
05/26/2017,35.67,FDIS
05/25/2017,35.54,FDIS
05/24/2017,35.23,FDIS
05/31/2017,18.17,FENY
05/30/2017,18.26,FENY
05/26/2017,18.53,FENY
05/25/2017,18.51,FENY
05/24/2017,18.90,FENY
05/31/2017,36.52,FHLC
05/30/2017,36.40,FHLC
05/26/2017,36.50,FHLC
05/25/2017,36.62,FHLC
05/24/2017,36.41,FHLC
05/31/2017,34.28,FIDU
05/30/2017,34.34,FIDU
05/26/2017,34.33,FIDU
05/25/2017,34.31,FIDU
05/24/2017,34.17,FIDU
05/31/2017,30.56,FMAT
05/30/2017,30.66,FMAT
05/26/2017,30.68,FMAT
05/25/2017,30.62,FMAT
05/24/2017,30.70,FMAT
05/31/2017,34.26,FNCL
05/30/2017,34.60,FNCL
05/26/2017,34.86,FNCL
05/25/2017,34.90,FNCL
05/24/2017,34.85,FNCL
05/31/2017,23.96,FREL
05/30/2017,23.96,FREL
05/26/2017,24.02,FREL
05/25/2017,24.21,FREL
05/24/2017,24.16,FREL
Thank you in advance for any assistance you can provide me with!
Use the split argument to read.zoo to indicate which column contains the data that should be used to create columns.
x <- read.zoo(text = "05/31/2017,32.78,FCOM
05/30/2017,32.72,FCOM
05/26/2017,32.56,FCOM
05/25/2017,32.57,FCOM
05/24/2017,32.47,FCOM
05/31/2017,35.63,FDIS
05/30/2017,35.71,FDIS
05/26/2017,35.67,FDIS
05/25/2017,35.54,FDIS
05/24/2018,35.23,FDIS
05/31/2017,18.17,FENY
05/30/2017,18.26,FENY
05/26/2017,18.53,FENY
05/25/2017,18.51,FENY
05/24/2017,18.90,FENY
05/31/2017,36.52,FHLC
05/30/2017,36.40,FHLC
05/26/2017,36.50,FHLC
05/25/2017,36.62,FHLC
05/24/2017,36.41,FHLC
05/31/2017,34.28,FIDU
05/30/2017,34.34,FIDU
05/26/2017,34.33,FIDU
05/25/2017,34.31,FIDU
05/24/2017,34.17,FIDU
05/31/2017,30.56,FMAT
05/30/2017,30.66,FMAT
05/26/2017,30.68,FMAT
05/25/2017,30.62,FMAT
05/24/2017,30.70,FMAT
05/31/2017,34.26,FNCL
05/30/2017,34.60,FNCL
05/26/2017,34.86,FNCL
05/25/2017,34.90,FNCL
05/24/2017,34.85,FNCL
05/31/2017,23.96,FREL
05/30/2017,23.96,FREL
05/26/2017,24.02,FREL
05/25/2017,24.21,FREL
05/24/2017,24.16,FREL", sep = ",", format = "%m/%d/%Y", split = 3)
Setting split = 3 tells read.zoo to use the 3rd column in the file to create columns. Then x is a zoo object:
R> x
FCOM FDIS FENY FHLC FIDU FMAT FNCL FREL
2017-05-24 32.47 35.23 18.90 36.41 34.17 30.70 34.85 24.16
2017-05-25 32.57 35.54 18.51 36.62 34.31 30.62 34.90 24.21
2017-05-26 32.56 35.67 18.53 36.50 34.33 30.68 34.86 24.02
2017-05-30 32.72 35.71 18.26 36.40 34.34 30.66 34.60 23.96
2017-05-31 32.78 35.63 18.17 36.52 34.28 30.56 34.26 23.96
You can convert x to xts using x <- as.xts(x).
I apologize if this is an easy question. I am trying to use the points from the MixSim package in R to act as the sampling points in an old Fortran program because I like the way that MixSim creates sampling points better, but am using the Fortran program to simulate vegetation data across many levels of beta diversity, alpha diversity, etc.
I generate my data in MixSim by:
d=MixSim(BarOmega=0.000,MaxOmega=0.000,K=4,p=3,ecc=0.99,int=c(10,90),PiLow=0.1)
m=simdataset(n=10,Pi=d$Pi,Mu=d$Mu,S=d$S)
And if I do use write.table, this is what I get
write.table(m$X,file="example.txt",quote=F,row.names=F)
V1 V2 V3
87.540626647788 62.8444539443256 17.0026406651813
83.9939847940881 65.0069747775257 18.8676229149976
84.4477456535804 63.6892673685408 18.6384437248469
84.7684968694547 65.4610993744652 17.6252989584773
13.4600970937604 16.9988156469822 49.6810813619893
23.9952555783055 18.6598302958281 48.4204641715953
17.0523647853253 11.518037157788 43.0417655739052
57.5107395863171 40.4872578216636 24.938188234695
11.8320140526743 52.9077915021041 34.5723480775864
12.8754032313702 53.1795899126135 34.1309377040482
But I need my output to look exactly like this for the Fortran program to accept it.
***** SAMPLING PATTERN FILE
50 3 1 0.0000
50
87.54 62.84 17.00
83.99 65.00 18.86
84.44 63.68 18.63
84.76 65.46 17.62
13.46 16.99 49.68
23.99 18.65 48.42
17.05 11.51 43.04
57.51 40.48 24.93
11.83 52.90 34.57
12.87 53.17 34.13
I should note, that I know exactly how to do the rounding in r by:
m=round(m$X,digits=2)
Is my best bet going to be simply using write.table and then formatting "by hand". Most of my models will then be created in a loop that I wrote in Fortran. I will only need to generate maybe a few dozen models in MixSim and then format them if that is the case. All models will have considerably more than 10 points.
(Tried a variety of things with write.table but always got undesired truncation of the decimal values when the trailing figures were nn.00.)
Use cat for the file preamble and write.fwf from pkg::gdata:
cat(top, file='out.txt')
install.packages('gdata')
gdata::write.fwf(signif(dat,4), file = "out.txt", append = TRUE, quote = FALSE, sep = "\t",
colnames = FALSE)
-------result----------
***** SAMPLING PATTERN FILE
50 3 1 0.0000
50
87.54 62.84 17.00
83.99 65.01 18.87
84.45 63.69 18.64
84.77 65.46 17.63
13.46 17.00 49.68
24.00 18.66 48.42
17.05 11.52 43.04
57.51 40.49 24.94
11.83 52.91 34.57
12.88 53.18 34.13
If you need padding on the LHS you can use width=7 or 8.