我对R语言的经验要比Python丰富得多,在可能的情况下,我更喜欢用这种语言编码。这一点特别适用,尤其是当它涉及到可视化的时候。Plotly和ggplot2是非常棒的软件包,提供了很多的灵活性。然而,每种语言都有其局限性,最好的结果源于它们的有效结合。
本周,我创建了下面这个蜡烛图,我认为这是一个很好的案例,可以说明一些问题。
- 如何使用Python中的investpy包从investing.com下载金融数据
- 如何有效结合Python和R的能力,部署reticulate包
- 如何用ggplot2、ggthemes和两个简单的自定义函数构建一个格式良好的蜡烛图
- 如何以不同的图像格式导出结果,包括高分辨率的可扩展矢量图(SVG)。
Python部分
让我们从所需的Python代码开始。首先,我们需要用pip安装investpy包,以运行下面的简单函数。Investpy是一个神奇的、非常强大的包装,围绕着investing.com页面的公共API。它允许检索广泛的金融工具的日终价格数据,包括股票、债券、ETF、共同基金、指数、货币、商品和加密货币,以及下载选定的元数据。详细的文件可以在这里 找到,或者在这个链接下找到pdf格式的文件。将下面定义的函数保存在一个python脚本中。
#pip install investpy
def get_fx_cross_investpy(currency_cross,st_date,ed_date):
import investpy
data = investpy.get_currency_cross_historical_data(currency_cross=currency_cross, from_date=st_date, to_date=ed_date)
return(data)
R部分
为了在R中使用之前定义的Python函数,并随后绘制数据,我们需要以下四个包,可以从CRAN中轻松安装。
install.packages("reticulate")
install.packages("ggplot2")
install.packages("ggthemes")
install.packages("scales")
定义一个漂亮的主题
ggthemes 包为ggplot2图形配备了一些漂亮的默认主题。所以你可以,比如说,复制《经济学人》的著名设计或者典型的Stata图表的外观。不过,也可以对这些主题进行改编,创建自己独特的默认布局。我在下面为我的标准格式化进行了演示。这里定义的函数后来被用于candlestick函数中。
theme_aq_black_default_font<-
function (base_size = 12, base_family = "")
{
library(ggplot2)
library(ggthemes)
library(scales)
col_aq2<-as.character(c("#04103b","#dd0400","#3b5171","#5777a7","#969696","#BDBDBD","#D9D9D9","#F0F0F0"))
theme_hc(base_size = base_size, base_family = base_family) %+replace%
烛台函数
蜡烛图被广泛用于价格数据的可视化和技术分析中。它允许观众快速衡量市场移动的意义,并分析潜在的阻力位或未来可能被逆转的非凡的价格跳跃。为了构建上面显示的日线蜡烛图,我们需要每天的开盘价和收盘价,以及盘中的高点和低点。幸运的是,这些都可以在investing.com上找到,并且可以通过我们上面定义的函数检索到一个方便的数据框架。
ggplot_candlestick<-function(df,width=0.9,chart_title,chart_subtitle)
{
library(ggplot2)
df$Date<-row.names(df)
df$Date<-as.Date(df$Date,"%Y-%m-%d")
df$chg df$Open, "dn", "up")
cols<-as.character(c("#04103b","#dd0400","#3b5171","#5777a7","#969696","#BDBDBD","#D9D9D9","#F0F0F0"))
p<-
ggplot(data=df,aes(x=as.Date(Date), y=High))+
geom_linerange(aes(ymin=Low, ymax=High)) +
geom_rect(aes(xmin = Date - width/2 * 0.9, xmax = Date + width/2 * 0.9, ymin = pmin(Open, Close), ymax = pmax(Open, Close), fill = df$chg)) +
scale_fill_manual(values = c("up" = "darkred", "dn" = "darkgreen"))+
scale_colour_manual(values = cols)+
theme_aq_black_default_font(base_size=18)+
labs(color='')+
labs(title=chart_title,subtitle=chart_subtitle,x ="")+
labs(caption = paste0('Source: DataScience+, Investing.com ', Sys.Date()))+
guides(colour = guide_legend(nrow = 1))+
scale_x_date(labels = date_format("%y/%m"))+
theme(legend.position = "none",legend.margin=margin(-20,-20,-20,-20),legend.box.margin=margin(0,0,30,0))+
ylab("")+
theme(plot.margin=margin(l=5,r=20,b=5,t=5))
return(p)
}
绘制数据并导出图形
最后但并非最不重要的是,让我们把所有这些模块结合起来,一步一步地执行它们。一旦我们使用reticulate包加载了我们的Python函数,我们就可以在R中使用它来检索investpy的财务数据。随后,我们可以使用我们先前定义的R函数来创建烛台图。然后,可以利用ggsave将该图轻松导出为PNG或SVG图形。
# Load the python function and retrieve the financial data
library(reticulate)
source_python("C:/Users/Fabian/Desktop/get_rates_investing.com.py")
df<-get_fx_cross_investpy("USD/RUB",'01/01/2022','01/05/2022')
# Use the R functions and plot the data
p<-ggplot_candlestick(df,chart_title="Following its crash, the Russian Ruble rebounded sharply",chart_subtitle="USD/RUB exchange rate")
p
# Save the plot
target_folder<-"C:/Users/Fabian/Desktop/"
ggsave(file=paste0(target_folder,"candlestick_usd_rub.svg"), plot=p, width=9, height=5)
ggsave(file=paste0(target_folder,"candlestick_usd_rub.png"), plot=p, width=9, height=5)
