构建基于R的交易系统(4)boltter及相关工具
写在前边的一些话:投资有风险,交易要谨慎。 风险各种各样。就我所写的这个来说,这里很多工具仍然是在发展中的,而且我也不能保证我的用法是一定正确的。因此在任何意义上这只是探讨软件的使用方法,而不构成投资的意见或者建议。望各位读者小心使用。
4.账户管理:blotter
前面介绍的quantmod和TTR包给出了建立交易系统的技术基础:获取交易数据, 使用技术交易指标建立策略及并对策略的可视化。然而,对于一个以稳定盈利为目的的完整的交易系统来说,开发稳定盈利的(自有)策略、资金管理和风险控制应该是更值得重视的部分。
本篇主要介绍资金账户管理包blotter以及为实现资金管理所需的FinancialInstrument包(金融产品)和PerformanceAnalytics包(评价投资表现)
(1)blotter基础
(a)简介
blotter依然是一个正在开发中的包,是TradeAnalytics项目的一部分,主要作者是Peter Carl,Brian Peterson。 http://r-forge.r-project.org/R/?group_id=316 http://r-forge.r-project.org/projects/blotter/。
blotter包定义了一个交易系统所应具有的产品、交易、组合和账户等基础工具。可以支持多个资产类别和多个币种的投资组合。
(b)blotter包的主要函数: 账户的初始化: initPortf 初始化一个 portfolio对象(投资组合) initAcct 初始化一个 account对象(账户)
处理: addTxn 为组合增加交易(transaction) updatePortf 对每个周期的每个代码(symbol)计算盈亏(P&L)(也会是更新组合的情况) updateAcct 从组合数据和对应的收盘价构建证券账户 updateEndEq 对账户更新终止权益 getEndEq 获得权益账户的最新值 getPosQty 获得某日期的头寸
分析:
chart.Posn 为市场数据、头寸大小和累积P&L绘制图表 PortfReturns 计算组合产品的回报 getAccount 从 .blotter 环境获得一个account对象 getPortfolio 从 .blotter 环境获得一个portfolio对象 getTxns 从组合中取回交易 tradeStats 计算交易(trade)统计 perTradeStats 计算每一项交易(trade) flat to flat的统计 (注:这里的trade指的是在某一个证券持有头寸的完整交易过程,其中可以包括许多笔交易transaction)
(c).blotter 和 .instrument环境
blotter包创建了一个名为.blotter的环境(environment)可以为account对象和portfolio对象提供专用的存贮。在R当中,环境(environment)指的是创建函数时出现的对象集合。
library(blotter)
s()
## character(0)
ls(all = T)
## [1] ".blotter"
下面会用到的FinancialInstrument包也创建了一个叫做.instrument的环境用来存贮定义的产品(如股票、期货等)
(2)FinancialInstrument包和PerformanceAnalytics包简介 FinancialInstrument包提供了一个定义金融工具的元数据和彼此联系的基础架构。 主要函数包括currency stock bond option future fund exchange_rate 分别用于创建对应的产品类。
(3)基于blotter包的策略回测 交易账户的管理适合交易过程同步的。为了说明blotter包的功能,下面以一个策略的回测流程进行说明。所谓回测,就是对设计好的策略或模型在历史数据上的测试和评估。
(a)回测流程
初始化:
初始化资金和金融产品,载入历史数据;
初始化组合和账户。
bar-by-bar处理:
检查价格和指标是否触发买入或卖出条件;
更新组合和账户中的头寸和证券;
重复上面两个步骤直到数据结束。
评价:
生成组合表现的评价并可视化。
(b)回测实例
下面使用Faber策略,对招商银行历史数据进行回测。 Faber策略是个非常简单的战术资产配置方法: 如果月收盘价高于10月均线,买入; 如果月收盘价低于10月均线,卖出。 (忽略交易成本和滑点)
http://static.squarespace.com/static/510654e4e4b0c3c708391d25/t/51dad95ee4b084dcc6296bad/1373296990025/mebanefaber_2013_full.pdf
初始化: 初始化一个现金和一个股票工具
currency("RMB")
## [1] "RMB"
stock("ZSYH", currency = "RMB", multiplier = 1)
## [1] "ZSYH"
ls(envir = FinancialInstrument:::.instrument) #设置 .instrument环境
## [1] "RMB" "ZSYH"
get("RMB", envir = FinancialInstrument:::.instrument)
## primary_id :"RMB"
## currency :"RMB"
## multiplier :1
## tick_size :0.01
## identifiers: list()
## type :"currency"
get("ZSYH", envir = FinancialInstrument:::.instrument)
## primary_id :"ZSYH"
## currency :"RMB"
## multiplier :1
## tick_size :0.01
## identifiers: list()
## type :"stock"
Sys.setenv(TZ = "UTC") #设立时区
ZSYH <- getSymbols("600036.ss", from = "2008-01-01", to = Sys.Date(), src = "yahoo",
auto.assign = FALSE)
ZSYH <- to.monthly(ZSYH, indexAt = "endof")
ZSYH$SMA10m <- SMA(Cl(ZSYH), 10)
head(ZSYH$SMA10m)
## SMA10m
## 2008-01-31 NA
## 2008-02-29 NA
## 2008-03-31 NA
## 2008-04-30 NA
## 2008-05-30 NA
## 2008-06-30 NA
绘制月k线及10月均线
myTheme <- chart_theme()
myTheme$col$dn.col <- "lightgreen"
myTheme$col$up.col <- "lightblue"
myTheme$col$dn.border <- "grey"
myTheme$col$up.border <- "grey"
# plot OHLC series
chart_Series(x = ZSYH, theme = myTheme, name = "ZSYH", TA = "add_SMA(n=10,col=4)")
初始化组合和账户
b.strategy <- "bFaber"
initPortf(b.strategy, "ZSYH", initDate = "2007-12-31")
## [1] "bFaber"
initAcct(b.strategy, portfolios = b.strategy, initDate = "2007-12-31", initEq = 1e+06) #初始的资金是1e6,即1,000,000
## [1] "bFaber"
ls()
## [1] "b.strategy" "myTheme" "ZSYH"
ls(.blotter)
## [1] "account.bFaber" "portfolio.bFaber"
ls(envir = FinancialInstrument:::.instrument)
## [1] "RMB" "ZSYH"
Bar-by-bar 处理: 交易规则的实现。在这个过程中实现组合和账户的更新。
for( i in 1:nrow(ZSYH) )
{
#对日期更新
CurrentDate <- time(ZSYH)[i]
equity<-getEndEq(b.strategy, CurrentDate)
ClosePrice <- as.numeric(Cl(ZSYH[i,]))
Posn <- getPosQty(b.strategy, Symbol='ZSYH', Date=CurrentDate)
UnitSize <-as.numeric(trunc(equity/ClosePrice))#全仓
MA <- as.numeric(ZSYH[i,'SMA10m'])
#如有必要改变头寸
if(!is.na(MA)) #如果移动均线开始
{
if( Posn == 0 ) {#没有头寸,测试是否买入
if( ClosePrice > MA ) {
#进入多头头寸(买入)
addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,
TxnPrice=ClosePrice, TxnQty = UnitSize , TxnFees=0) }
} else {#有头寸,检测是否退出
if( ClosePrice < MA ) {
#退出头寸
addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,
TxnPrice=ClosePrice, TxnQty = -Posn , TxnFees=0) }
}
}
#计算盈亏并更新
updatePortf(b.strategy, Dates = CurrentDate)
updateAcct(b.strategy, Dates = CurrentDate)
updateEndEq(b.strategy, Dates = CurrentDate)
}
[1] "2009-05-29 00:00:00 ZSYH 77101 @ 12.97"
[1] "2010-01-29 00:00:00 ZSYH -77101 @ 15.17"
[1] "2010-10-29 00:00:00 ZSYH 80276 @ 14.57"
[1] "2010-11-30 00:00:00 ZSYH -80276 @ 13.05"
[1] "2011-03-31 00:00:00 ZSYH 74350 @ 14.09"
[1] "2011-06-30 00:00:00 ZSYH -74350 @ 13.02"
[1] "2012-01-31 00:00:00 ZSYH 76525 @ 12.65"
[1] "2012-03-30 00:00:00 ZSYH -76525 @ 11.9"
[1] "2012-04-30 00:00:00 ZSYH 74643 @ 12.2"
[1] "2012-05-31 00:00:00 ZSYH -74643 @ 11.66"
[1] "2012-12-31 00:00:00 ZSYH 63297 @ 13.75"
[1] "2013-06-28 00:00:00 ZSYH -63297 @ 11.6"
注:这个例子是基于quantstrat包的demo:faber.R来写的。
评价交易表现 chart.Posn函数可以绘出交易、头寸、累计盈亏和回撤。 getTxns函数是成交统计,输出值包括成交量(股),成交价格,成交额(元),平均成本,盈亏 tradeStats函数是一个交易过程的统计。
chart.Posn(b.strategy, Symbol = "ZSYH", Dates = "2008::", theme = myTheme)
getTxns(Portfolio = b.strategy, Symbol = "ZSYH")
## Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost
## 2007-12-31 0 0.00 0 0 0.00
## 2009-05-29 77101 12.97 0 1000000 12.97
## 2010-01-29 -77101 15.17 0 -1169622 15.17
## 2010-10-29 80276 14.57 0 1169621 14.57
## 2010-11-30 -80276 13.05 0 -1047602 13.05
## 2011-03-31 74350 14.09 0 1047592 14.09
## 2011-06-30 -74350 13.02 0 -968037 13.02
## 2012-01-31 76525 12.65 0 968041 12.65
## 2012-03-30 -76525 11.90 0 -910648 11.90
## 2012-04-30 74643 12.20 0 910645 12.20
## 2012-05-31 -74643 11.66 0 -870337 11.66
## 2012-12-31 63297 13.75 0 870334 13.75
## 2013-06-28 -63297 11.60 0 -734245 11.60
## Net.Txn.Realized.PL
## 2007-12-31 0
## 2009-05-29 0
## 2010-01-29 169622
## 2010-10-29 0
## 2010-11-30 -122020
## 2011-03-31 0
## 2011-06-30 -79555
## 2012-01-31 0
## 2012-03-30 -57394
## 2012-04-30 0
## 2012-05-31 -40307
## 2012-12-31 0
## 2013-06-28 -136089
(tstats <- tradeStats(Portfolio = b.strategy, Symbol = "ZSYH"))
## Portfolio Symbol Num.Txns Num.Trades Net.Trading.PL Avg.Trade.PL
## ZSYH bFaber ZSYH 12 6 -265741 -44290
## Med.Trade.PL Largest.Winner Largest.Loser Gross.Profits Gross.Losses
## ZSYH -68474 169622 -136089 169622 -435364
## Std.Dev.Trade.PL Percent.Positive Percent.Negative Profit.Factor
## ZSYH 111048 16.67 83.33 0.3896
## Avg.Win.Trade Med.Win.Trade Avg.Losing.Trade Med.Losing.Trade
## ZSYH 169622 169622 -87073 -79555
## Avg.Daily.PL Med.Daily.PL Std.Dev.Daily.PL Max.Drawdown
## ZSYH -44290 -68474 111048 -780005
## Profit.To.Max.Draw Avg.WinLoss.Ratio Med.WinLoss.Ratio Max.Equity
## ZSYH -0.3407 1.948 2.132 514264
## Min.Equity End.Equity
## ZSYH -265741 -265741
(4)使用PerformanceAnalytics包来评价交易表现
PerformanceAnalytics包提供了一系列的评价交易表现和风险的计量工具,包括各种评价交易的图标、指标和比率,并支持建立度量的表格。
charts.PerformanceSummary函数绘制累积回报,月度表现和回撤 table.Arbitrary函数可以创建一个统计表
library(PerformanceAnalytics)
rets <- PortfReturns(Account = b.strategy)
rownames(rets) <- NULL
charts.PerformanceSummary(rets, colorset = redfocus)
tab.perf <- table.Arbitrary(rets, metrics = c("Return.annualized", "SharpeRatio.annualized"),
metricsNames = c("Annualized Return", "Annualized Sharpe Ratio"))
tab.perf #计算年化回报和年化的夏普比
## ZSYH.DailyEndEq
## Annualized Return -0.0926
## Annualized Sharpe Ratio -0.3065
(5)一个新的交易表现评价的模版
https://gist.github.com/thertrader/7038864
4.账户管理:blotter
前面介绍的quantmod和TTR包给出了建立交易系统的技术基础:获取交易数据, 使用技术交易指标建立策略及并对策略的可视化。然而,对于一个以稳定盈利为目的的完整的交易系统来说,开发稳定盈利的(自有)策略、资金管理和风险控制应该是更值得重视的部分。
本篇主要介绍资金账户管理包blotter以及为实现资金管理所需的FinancialInstrument包(金融产品)和PerformanceAnalytics包(评价投资表现)
(1)blotter基础
(a)简介
blotter依然是一个正在开发中的包,是TradeAnalytics项目的一部分,主要作者是Peter Carl,Brian Peterson。 http://r-forge.r-project.org/R/?group_id=316 http://r-forge.r-project.org/projects/blotter/。
blotter包定义了一个交易系统所应具有的产品、交易、组合和账户等基础工具。可以支持多个资产类别和多个币种的投资组合。
(b)blotter包的主要函数: 账户的初始化: initPortf 初始化一个 portfolio对象(投资组合) initAcct 初始化一个 account对象(账户)
处理: addTxn 为组合增加交易(transaction) updatePortf 对每个周期的每个代码(symbol)计算盈亏(P&L)(也会是更新组合的情况) updateAcct 从组合数据和对应的收盘价构建证券账户 updateEndEq 对账户更新终止权益 getEndEq 获得权益账户的最新值 getPosQty 获得某日期的头寸
分析:
chart.Posn 为市场数据、头寸大小和累积P&L绘制图表 PortfReturns 计算组合产品的回报 getAccount 从 .blotter 环境获得一个account对象 getPortfolio 从 .blotter 环境获得一个portfolio对象 getTxns 从组合中取回交易 tradeStats 计算交易(trade)统计 perTradeStats 计算每一项交易(trade) flat to flat的统计 (注:这里的trade指的是在某一个证券持有头寸的完整交易过程,其中可以包括许多笔交易transaction)
(c).blotter 和 .instrument环境
blotter包创建了一个名为.blotter的环境(environment)可以为account对象和portfolio对象提供专用的存贮。在R当中,环境(environment)指的是创建函数时出现的对象集合。
library(blotter)
s()
## character(0)
ls(all = T)
## [1] ".blotter"
下面会用到的FinancialInstrument包也创建了一个叫做.instrument的环境用来存贮定义的产品(如股票、期货等)
(2)FinancialInstrument包和PerformanceAnalytics包简介 FinancialInstrument包提供了一个定义金融工具的元数据和彼此联系的基础架构。 主要函数包括currency stock bond option future fund exchange_rate 分别用于创建对应的产品类。
(3)基于blotter包的策略回测 交易账户的管理适合交易过程同步的。为了说明blotter包的功能,下面以一个策略的回测流程进行说明。所谓回测,就是对设计好的策略或模型在历史数据上的测试和评估。
(a)回测流程
初始化:
初始化资金和金融产品,载入历史数据;
初始化组合和账户。
bar-by-bar处理:
检查价格和指标是否触发买入或卖出条件;
更新组合和账户中的头寸和证券;
重复上面两个步骤直到数据结束。
评价:
生成组合表现的评价并可视化。
(b)回测实例
下面使用Faber策略,对招商银行历史数据进行回测。 Faber策略是个非常简单的战术资产配置方法: 如果月收盘价高于10月均线,买入; 如果月收盘价低于10月均线,卖出。 (忽略交易成本和滑点)
http://static.squarespace.com/static/510654e4e4b0c3c708391d25/t/51dad95ee4b084dcc6296bad/1373296990025/mebanefaber_2013_full.pdf
初始化: 初始化一个现金和一个股票工具
currency("RMB")
## [1] "RMB"
stock("ZSYH", currency = "RMB", multiplier = 1)
## [1] "ZSYH"
ls(envir = FinancialInstrument:::.instrument) #设置 .instrument环境
## [1] "RMB" "ZSYH"
get("RMB", envir = FinancialInstrument:::.instrument)
## primary_id :"RMB"
## currency :"RMB"
## multiplier :1
## tick_size :0.01
## identifiers: list()
## type :"currency"
get("ZSYH", envir = FinancialInstrument:::.instrument)
## primary_id :"ZSYH"
## currency :"RMB"
## multiplier :1
## tick_size :0.01
## identifiers: list()
## type :"stock"
Sys.setenv(TZ = "UTC") #设立时区
ZSYH <- getSymbols("600036.ss", from = "2008-01-01", to = Sys.Date(), src = "yahoo",
auto.assign = FALSE)
ZSYH <- to.monthly(ZSYH, indexAt = "endof")
ZSYH$SMA10m <- SMA(Cl(ZSYH), 10)
head(ZSYH$SMA10m)
## SMA10m
## 2008-01-31 NA
## 2008-02-29 NA
## 2008-03-31 NA
## 2008-04-30 NA
## 2008-05-30 NA
## 2008-06-30 NA
绘制月k线及10月均线
myTheme <- chart_theme()
myTheme$col$dn.col <- "lightgreen"
myTheme$col$up.col <- "lightblue"
myTheme$col$dn.border <- "grey"
myTheme$col$up.border <- "grey"
# plot OHLC series
chart_Series(x = ZSYH, theme = myTheme, name = "ZSYH", TA = "add_SMA(n=10,col=4)")
初始化组合和账户
b.strategy <- "bFaber"
initPortf(b.strategy, "ZSYH", initDate = "2007-12-31")
## [1] "bFaber"
initAcct(b.strategy, portfolios = b.strategy, initDate = "2007-12-31", initEq = 1e+06) #初始的资金是1e6,即1,000,000
## [1] "bFaber"
ls()
## [1] "b.strategy" "myTheme" "ZSYH"
ls(.blotter)
## [1] "account.bFaber" "portfolio.bFaber"
ls(envir = FinancialInstrument:::.instrument)
## [1] "RMB" "ZSYH"
Bar-by-bar 处理: 交易规则的实现。在这个过程中实现组合和账户的更新。
for( i in 1:nrow(ZSYH) )
{
#对日期更新
CurrentDate <- time(ZSYH)[i]
equity<-getEndEq(b.strategy, CurrentDate)
ClosePrice <- as.numeric(Cl(ZSYH[i,]))
Posn <- getPosQty(b.strategy, Symbol='ZSYH', Date=CurrentDate)
UnitSize <-as.numeric(trunc(equity/ClosePrice))#全仓
MA <- as.numeric(ZSYH[i,'SMA10m'])
#如有必要改变头寸
if(!is.na(MA)) #如果移动均线开始
{
if( Posn == 0 ) {#没有头寸,测试是否买入
if( ClosePrice > MA ) {
#进入多头头寸(买入)
addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,
TxnPrice=ClosePrice, TxnQty = UnitSize , TxnFees=0) }
} else {#有头寸,检测是否退出
if( ClosePrice < MA ) {
#退出头寸
addTxn(b.strategy, Symbol='ZSYH', TxnDate=CurrentDate,
TxnPrice=ClosePrice, TxnQty = -Posn , TxnFees=0) }
}
}
#计算盈亏并更新
updatePortf(b.strategy, Dates = CurrentDate)
updateAcct(b.strategy, Dates = CurrentDate)
updateEndEq(b.strategy, Dates = CurrentDate)
}
[1] "2009-05-29 00:00:00 ZSYH 77101 @ 12.97"
[1] "2010-01-29 00:00:00 ZSYH -77101 @ 15.17"
[1] "2010-10-29 00:00:00 ZSYH 80276 @ 14.57"
[1] "2010-11-30 00:00:00 ZSYH -80276 @ 13.05"
[1] "2011-03-31 00:00:00 ZSYH 74350 @ 14.09"
[1] "2011-06-30 00:00:00 ZSYH -74350 @ 13.02"
[1] "2012-01-31 00:00:00 ZSYH 76525 @ 12.65"
[1] "2012-03-30 00:00:00 ZSYH -76525 @ 11.9"
[1] "2012-04-30 00:00:00 ZSYH 74643 @ 12.2"
[1] "2012-05-31 00:00:00 ZSYH -74643 @ 11.66"
[1] "2012-12-31 00:00:00 ZSYH 63297 @ 13.75"
[1] "2013-06-28 00:00:00 ZSYH -63297 @ 11.6"
注:这个例子是基于quantstrat包的demo:faber.R来写的。
评价交易表现 chart.Posn函数可以绘出交易、头寸、累计盈亏和回撤。 getTxns函数是成交统计,输出值包括成交量(股),成交价格,成交额(元),平均成本,盈亏 tradeStats函数是一个交易过程的统计。
chart.Posn(b.strategy, Symbol = "ZSYH", Dates = "2008::", theme = myTheme)
getTxns(Portfolio = b.strategy, Symbol = "ZSYH")
## Txn.Qty Txn.Price Txn.Fees Txn.Value Txn.Avg.Cost
## 2007-12-31 0 0.00 0 0 0.00
## 2009-05-29 77101 12.97 0 1000000 12.97
## 2010-01-29 -77101 15.17 0 -1169622 15.17
## 2010-10-29 80276 14.57 0 1169621 14.57
## 2010-11-30 -80276 13.05 0 -1047602 13.05
## 2011-03-31 74350 14.09 0 1047592 14.09
## 2011-06-30 -74350 13.02 0 -968037 13.02
## 2012-01-31 76525 12.65 0 968041 12.65
## 2012-03-30 -76525 11.90 0 -910648 11.90
## 2012-04-30 74643 12.20 0 910645 12.20
## 2012-05-31 -74643 11.66 0 -870337 11.66
## 2012-12-31 63297 13.75 0 870334 13.75
## 2013-06-28 -63297 11.60 0 -734245 11.60
## Net.Txn.Realized.PL
## 2007-12-31 0
## 2009-05-29 0
## 2010-01-29 169622
## 2010-10-29 0
## 2010-11-30 -122020
## 2011-03-31 0
## 2011-06-30 -79555
## 2012-01-31 0
## 2012-03-30 -57394
## 2012-04-30 0
## 2012-05-31 -40307
## 2012-12-31 0
## 2013-06-28 -136089
(tstats <- tradeStats(Portfolio = b.strategy, Symbol = "ZSYH"))
## Portfolio Symbol Num.Txns Num.Trades Net.Trading.PL Avg.Trade.PL
## ZSYH bFaber ZSYH 12 6 -265741 -44290
## Med.Trade.PL Largest.Winner Largest.Loser Gross.Profits Gross.Losses
## ZSYH -68474 169622 -136089 169622 -435364
## Std.Dev.Trade.PL Percent.Positive Percent.Negative Profit.Factor
## ZSYH 111048 16.67 83.33 0.3896
## Avg.Win.Trade Med.Win.Trade Avg.Losing.Trade Med.Losing.Trade
## ZSYH 169622 169622 -87073 -79555
## Avg.Daily.PL Med.Daily.PL Std.Dev.Daily.PL Max.Drawdown
## ZSYH -44290 -68474 111048 -780005
## Profit.To.Max.Draw Avg.WinLoss.Ratio Med.WinLoss.Ratio Max.Equity
## ZSYH -0.3407 1.948 2.132 514264
## Min.Equity End.Equity
## ZSYH -265741 -265741
(4)使用PerformanceAnalytics包来评价交易表现
PerformanceAnalytics包提供了一系列的评价交易表现和风险的计量工具,包括各种评价交易的图标、指标和比率,并支持建立度量的表格。
charts.PerformanceSummary函数绘制累积回报,月度表现和回撤 table.Arbitrary函数可以创建一个统计表
library(PerformanceAnalytics)
rets <- PortfReturns(Account = b.strategy)
rownames(rets) <- NULL
charts.PerformanceSummary(rets, colorset = redfocus)
tab.perf <- table.Arbitrary(rets, metrics = c("Return.annualized", "SharpeRatio.annualized"),
metricsNames = c("Annualized Return", "Annualized Sharpe Ratio"))
tab.perf #计算年化回报和年化的夏普比
## ZSYH.DailyEndEq
## Annualized Return -0.0926
## Annualized Sharpe Ratio -0.3065
(5)一个新的交易表现评价的模版
https://gist.github.com/thertrader/7038864
谢谢分享,请问一下,如果用blotter同时分析几只股票,该怎么改变一下?我本里爱想直接把一只股票换成stockvector,结果不行,后来用for循环,结果还是不对,求大神指导
请问,运行时遇到这个错误,什么原因
> initPortf(b.strategy, "ZSYH", initDate = "2007-12-31")
错误于initPortf(b.strategy, "ZSYH", initDate = "2007-12-31") :
Portfolio bFaber already exists, use updatePortf() or addPortfInstr() to update it.
把这句注释后解决了~谢谢您的文章
有一种相见恨晚的赶脚,膜拜楼主,我现在都不想去学MATLAB了
qq多少,我的396884748,我也想朝着方面发展,有空多聊聊
getSymbols(c("SPY","DIA"))
不知道这个是不是你想要的答案
是大学老师吗~偶然路过,好文,赞一个
为什么现在不能安装blotter包了?我不管是install.packages("blotter"),
还是在CRAN上,都找不到这个包。。。。。。
找到了,不好意思
3.2.2版本的R GUI不支持,好忧伤
> 我来回应