簡體   English   中英

Python rpy2和Quantmod示例

[英]Python rpy2 and quantmod examples

Python編程語言在開發財務數據分析應用程序方面給了我很大幫助。 另外,也有用於數據分析的R,它具有專用的財務數據分析軟件包,例如: quantmod

現在,這兩種語言之間都存在rpy2接口(即Python和R)。 我想使用帶有quantmod包的python的功能來原型化一些財務數據分析應用程序。

到目前為止,我已經花了幾個小時在互聯網上搜索一些使用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'

對你的幫助表示感謝...

getSymbols()位似乎有點不合常規(R已經具有函數get()mget() )。

問題發生在importDefaults() (包Defaults )(它本身是一個奇怪的野獸)中:它返回堆棧上的兩個調用幀,以獲取調用函數的名稱(因此在此處為“ 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"}))

今天,我還測試了以下方法...即顯式調用rpy2.robjects以便在python中調用R腳本。 這種方法的示例是In [5]:中的行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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM