2

Python 编程语言在开发金融数据分析应用程序方面帮助了我很多。或者,还有用于数据分析的 R,它具有专用的财务数据分析包,例如:quantmod

现在,这两种语言(即 Python 和 R)之间有rpy2接口。我想使用 python 的强大功能和 quantmod 包对一些金融数据分析应用程序进行原型设计。

到目前为止,我已经花了几个小时在互联网上搜索一些使用 rpy2(python 包)并调用 quantmod 函数的 Python 编程语言的快速入门代码示例。到目前为止,我还没有成功找到任何合适的材料……除了 rpy2 和 quantmod 文档。

因此问题如下=>

  1. 有谁知道合适的资源让我开始使用 rpy2 使用 python 和 quantmod?
  2. 或者,有人可以发布使用 rpy2 调用 quantmod 函数的简单 Python 代码示例吗?

这是我使用 rpy2 和 quantmod 实现原型的尝试:

from rpy2.robjects.packages import importr

sta = {"skeleton.TA": "skeleton_dot_TA", "skeleton_TA": "skeleton_uscore_TA"}
quantmod = importr('quantmod', robject_translations = sta)

IBM = quantmod.getSymbols("IBM")

上述代码(quantmodplot.py)的问题是它产生“RuntimeError”,如下所示:

 As of 0.4-0, ‘getSymbols’ uses env=parent.frame() and
 auto.assign=TRUE by default.

 This  behavior  will be  phased out in 0.5-0  when the call  will
 default to use auto.assign=FALSE. getOption("getSymbols.env") and 
 getOptions("getSymbols.auto.assign") are now checked for alternate defaults

 This message is shown once per session and may be disabled by setting 
 options("getSymbols.warning4.0"=FALSE). See ?getSymbol for more details
Error in as.character(sc[[1]]) : 
  cannot coerce type 'closure' to vector of type 'character'
Traceback (most recent call last):
  File "quantmodplot.py", line 6, in <module>
    IBM = quantmod.getSymbols("IBM")
  File "/usr/local/lib/python2.7/dist-packages/rpy2-2.3.6-py2.7-linux-i686.egg/rpy2/robjects/functions.py", line 86, in __call__
    return super(SignatureTranslatedFunction, self).__call__(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/rpy2-2.3.6-py2.7-linux-i686.egg/rpy2/robjects/functions.py", line 35, in __call__
    res = super(Function, self).__call__(*new_args, **new_kwargs)
rpy2.rinterface.RRuntimeError: Error in as.character(sc[[1]]) : 
  cannot coerce type 'closure' to vector of type 'character'

对你的帮助表示感谢...

4

2 回答 2

3

getSymbols()一点似乎有点不合常规(R 已经有函数get()mget())。

问题出现在importDefaults()(package Defaults) 中,它本身就是一个奇怪的野兽:它返回 2 个调用堆栈的帧,以便获取调用函数的名称(所以这里是“getSymbols”)。

getSymbols()中的函数quantmod包含代码:

function (Symbols = NULL, env = parent.frame(), reload.Symbols = FALSE, 
    verbose = FALSE, warnings = TRUE, src = "yahoo", symbol.lookup = TRUE, 
    auto.assign = getOption("getSymbols.auto.assign", TRUE), 
    ...) 
{
    # (...code cut out...)
    importDefaults("getSymbols")

调用importDefaults("getSymbols)向上调用堆栈以获取调用函数的符号,即“getSymbols”。

在 rpy2 中,调用(来自 Python)的 R 函数在 R 封闭框架中没有符号(因为封闭框架是 Python)。在某种程度上,它就像 R 的一个匿名函数。这可能会在高级界面中得到改进rpy2.robjects,但我从来没有找到时间来处理它。

一种解决方法是确保函数具有调用框架和符号:

from rpy2.robjects.vectors import ListVector
base = importr("base")
base.do_call("getSymbols", ListVector({'Symbols':"IBM"}))
于 2013-06-01T06:34:28.817 回答
1

今天,我还测试了以下方法......即显式调用rpy2.robjects以在python中调用R脚本。这种方法的示例是In [5]: In [6]:以下 python 脚本中的行。有趣的是,这种方法似乎有效:

In [1]: from rpy2.robjects import r
In [2]: from rpy2.robjects.packages import importr
In [3]: sta = {"skeleton.TA": "skeleton_dot_TA", "skeleton_TA": "skeleton_uscore_TA"}
In [4]: quantmod = importr('quantmod', robject_translations = sta)
In [5]: IBM = r("getSymbols('IBM', src='google', from='2013-01-01')")
 As of 0.4-0, ‘getSymbols’ uses env=parent.frame() and
 auto.assign=TRUE by default.

 This  behavior  will be  phased out in 0.5-0  when the call  will
 default to use auto.assign=FALSE. getOption("getSymbols.env") and 
 getOptions("getSymbols.auto.assign") are now checked for alternate defaults

 This message is shown once per session and may be disabled by setting 
 options("getSymbols.warning4.0"=FALSE). See ?getSymbol for more details

In [6]: r("candleChart(IBM, TA=NULL)")
Out[6]: <RS4 - Python:0xae3a14c / R:0xaae455c>

但是,运行这样的 python 脚本 =>quantmod.getSymbols("IBM")会产生RRuntimeError!
因此,主要问题仍未解决!

好吧,这里有一些关于我的开发机器的环境细节:

OS: Ubuntu Linux 12.04
Python version: '2.7.3'
Python package: rpy2-2.3.6
R version: 3.0.0 (2013-04-03)
R package: quantmod_0.4-0
于 2013-05-18T01:35:26.123 回答