2014-01-10 3 views
6

Я использую geom_boxplot, чтобы нарисовать подсвечники, используя данные фондового рынка. Проблема в том, что верхний и нижний края отдельного ящика, а также конечная точка верхнего низа показывают путь выше по оси Y, чем их соответствующие значения. Относительная высота (разница между верхним и нижним краями) и конечная точка нижнего нитевидного ушка каждого ящика плоские. Вот мой код:Проблемы с подсветом на складе с geom_boxplot (R)

candlestickPlot <- function(x){ 

library("ggplot2") 

# x is a data.frame with columns 'date','open','high','low','close' 
x$candleLower <- pmin(x$open, x$close) 
x$candleUpper <- pmax(x$open, x$close) 
x$candleMiddle <- NA 
x$fill <- "red" 
x$fill[x$open < x$close] = "green" 

# Draw the candlesticks 
g <- ggplot(x, aes(x=date, lower=candleLower, middle=candleMiddle, upper=candleUpper, ymin=low, ymax=high)) 
g <- g + geom_boxplot(stat='identity', aes(group=date, fill=fill)) 
g 
} 

Вот х:

date  close volume open high low 
5 2013-12-30 25.82 3525026 27.30 27.76 25.7 
4 2013-12-31 27.41 5487204 25.25 27.70 25.25 
3 2014-01-02 30.70 7835374 29.25 31.24 29.21 
2 2014-01-03 30.12 4577278 31.49 31.80 30.08 
1 2014-01-06 30.65 4042724 30.89 31.88 30.37 

Могу ли я сделать что-то здесь не так?

+0

Я реплицировать код, но это, кажется, работает нормально. Свечи соответствуют их значениям оси y. Возможно, вы можете сделать двойной выбор, если данные, которые вы визуализируете, и вы читаете вручную, являются одним и тем же? –

ответ

8

Есть более эффективные способы создания OHLC подсвечников с ggplot2, чем так, как вы описали, используя geom_boxplot. Ваш код кажется очень похож на пример, в ссылке: http://www.perdomocore.com/2012/using-ggplot-to-make-candlestick-charts-alpha/

Кажется, многие люди ставят ggplot примеров свечных на сети, которые основаны на примере в этой связи, используя geom_boxplot. Но проблема с построением графика с geom_boxplot заключается в том, что сам график медленно замедляется при создании графиков по мере увеличения числа построенных полос.

Вот один вычислительно быстрое решение для построения финансовых данных с использованием подсвечников/OHLC баре:

library(ggplot2) 
library(quantmod) 
FOSL <- getSymbols("FOSL", from="2015-01-01", auto.assign=FALSE) 
names(FOSL) <- gsub("^.+\\.","",names(FOSL)) # remove "FOSL." from column names 

rng <- "2015-08" 
FOSL <- FOSL[rng] 
FOSL <- data.frame(Date=as.POSIXct(index(FOSL)), FOSL[,1:4]) 

FOSL$chg <- ifelse(Cl(FOSL) > Op(FOSL), "up", "dn") 
FOSL$width <- as.numeric(periodicity(FOSL)[1]) 
FOSL$flat_bar <- FOSL[, "High"] == FOSL[, "Low"] 

# Candle chart: 
pl <- ggplot(FOSL, aes(x=Date))+ 
    geom_linerange(aes(ymin=Low, ymax=High)) + 
    theme_bw() + 
    labs(title="FOSL") + 
    geom_rect(aes(xmin = Date - width/2 * 0.9, xmax = Date + width/2 * 0.9, ymin = pmin(Open, Close), ymax = pmax(Open, Close), fill = chg)) + guides(fill = FALSE, colour = FALSE) + scale_fill_manual(values = c("dn" = "darkred", "up" = "darkgreen")) 

# Handle special case of drawing a flat bar where OHLC = Open: 
if (any(FOSL$flat_bar)) pl <- pl + geom_segment(data = FOSL[FOSL$flat_bar,], aes(x = Date - width/2 * 0.9, y = Close, yend = Close, xend = Date + width/2 * 0.9)) 

print(pl) 

enter image description here

5

Спасибо вам FXQuantTrader для введения красивого и быстрого альтернативного подхода к барам свечных в R! Удивительный, лаконичный, легко читаемый! вот немного улучшенная версия решения FXQuantTrader, включающая в себя:
    - оборачивает его в функцию
    - поддерживает более низкое разрешение (вплоть до 1 сек баров)
    - меняет цвет усов свечи, от черного для правильного одной
    - добавляет небольшую горизонтальную линию для баров с близкими == Open
    - добавляет 3-й цвета (синий) в бары с Close == Open
    - добавляет аргумент «альфа», который позволяет сделать диаграмму целых подсвечников более прозрачной, поэтому, когда вы нарисуете верхние полосы Боллинджера и/или скользящие средние, бары будут менее отвлекать (больше как фон)
- a немного больше комментариев новичков, чтобы выяснить, что происходит :)

Вот она:

library(ggplot2) 
library(quantmod) 
draw_candles <- function(df, title_param, alpha_param = 1){ 
    df$change <- ifelse(df$Close > df$Open, "up", ifelse(df$Close < df$Open, "down", "flat")) 

    # originally the width of the bars was calculated by FXQuantTrader with use of 'periodicity()', which 
    # seems to work ok only with: ‘minute’,‘hourly’, ‘daily’,‘weekly’, ‘monthly’, 
    # ‘quarterly’, and ‘yearly’, but can not do 1 sec bars while we want arbitrary bar size support!-) 
    # df$width <- as.numeric(periodicity(df)[1]) 
    # So let us instead find delta (seconds) between 1st and 2nd row and just 
    # use it for all other rows. We check 1st 3 rows to avoid larger "weekend gaps" 
    width_candidates <- c(as.numeric(difftime(df$Date[2], df$Date[1]), units = "secs"), 
         as.numeric(difftime(df$Date[3], df$Date[2]), units = "secs"), 
         as.numeric(difftime(df$Date[4], df$Date[3]), units = "secs")) 

    df$width_s = min(width_candidates) # one (same) candle width (in seconds) for all the bars 

    # define the vector of candle colours either by name or by rgb() 
    #candle_colors = c("down" = "red", "up" = "green", "flat" = "blue") 
    candle_colors = c("down" = rgb(192,0,0,alpha=255,maxColorValue=255), "up" = rgb(0,192,0,alpha=255,maxColorValue=255), "flat" = rgb(0,0,192,alpha=255,maxColorValue=255)) 

    # Candle chart: 
    g <- ggplot(df, aes(x=Date))+ 
    geom_linerange(aes(ymin=Low, ymax=High, colour = change), alpha = alpha_param) + # candle whiskerss (vertical thin lines:) 
    theme_bw() + 
    labs(title=title_param) + 
    geom_rect(aes(xmin = Date - width_s/2 * 0.9, xmax = Date + width_s/2 * 0.9, ymin = pmin(Open, Close), ymax = pmax(Open, Close), fill = change), alpha = alpha_param) +       # cabdke body 
    guides(fill = FALSE, colour = FALSE) + 
    scale_color_manual(values = candle_colors) + # color for line 
    scale_fill_manual(values = candle_colors)  # color for candle fill 

    # Handle special cases: flat bar and Open == close: 
    if (any(df$change == "flat")) g <- g + geom_segment(data = df[df$change == "flat",], aes(x = Date - width_s/2 * 0.9, y = Close, yend = Close, xend = Date + width_s/2 * 0.9, colour = change), alpha = alpha_param) 

    #print(g) 
    g 
} 
+0

+1 Nice. Если вы хотите начертить «дни» или другие частоты без пробелов пробела на диаграмме, вам может понадобиться расширить вашу функцию, как это делается здесь (это похоже на то, что делает «chart_Series» в 'quantmod') http: // stackoverflow .com/questions/28201587/ggplot-for-ohlc-chart-using-bars-not-candles? noredirect = 1 & lq = 1 – FXQuantTrader

+0

@FXQuantTrader, интересно, о чем вы говорили! Спасибо! Я бы спрятал недостающие даты от оси X, но у него есть проблема с порядком, упорядоченная по заказу, что, в свою очередь, может вызвать у нас проблемы с некоторыми форматами дат. Как насчет: просто используйте номера строк в качестве X, но назовите его как даты, хранящиеся в $ Date. Но тогда сложно решить, как часто клещи на оси X должны идти, и они должны выглядеть сексуально (например: 1-й и 15-й, а не 3-й и 28-й;). Эти пробелы не влияют на простые индикаторы btw! Я согласен с подавлением пробелов, было бы неплохо иметь опцию. Есть ли у вас какие-либо другие идеи о том, как их реализовать? –