新浪博客

WindR——投资组合管理

2016-07-05 23:18阅读:

Patrick

2016年7月5日


WindR介绍

今天穿插一点R之外的内容,就是Wind金融客户端,对于这一平台,相信经管类的同学并不陌生。这里我们介绍的是Wind与R语言的API——WindR的一项功能:构建并在线管理你的组合。

WindR安装与初步

工欲善其事必先利其器,所以,大家自行上Wind客户端键入QNT找到WindR的相关资料并下载安装WindR。
第一个函数也是最重要的函数w.start,它只有一个接受TRUE或者FALSE的参数,showmenu。刚开始用的话,showmenu设置为真,很有帮助,菜单选项,最后输出命令。长得像这样:
WindR——投资组合管理
鼠标放上去的话就会有中文提示,建议大家每个标签都试试。
关于WindR这里补充两点:
  • 首先Wind上的数据是比较全的,设计一般的交易策略不是问题
  • 第二点是交易日历的问题,符合国情的交易日历处理起来更加方便(相对于quantmod包)

Wind组合管理系统(PMS)

下面我们转向Wind界面,首先打开Wind,键入PMS,然后就会进入到组合管理系统界面:
WindR——投资组合管理
注意到上面的菜单栏:
WindR——投资组合管理
点击新建组合,出现如下界面:
WindR——投资组合管理
这里需要填写组合名称,比如这里我命名为SM,其他选项基本系统已经填好。点击“下一步

WindR——投资组合管理
点击左上角的调仓日期,调整到你需要的日期,这里我调整到了2015年7月1日。然后,
  1. 点击菜单栏的现金存取,输入足够的金额
  2. 点击批量证券导入,选择你感兴趣的证券,我这里选择的是创业板第一页的股票(见下图)
  3. 输入持仓数量,或者,点击等权重调仓,弹出界面的左上角调整仓位到50%(为了确保留有资金调仓),系统会根据你的设定的仓位配置股票。
WindR——投资组合管理
至此,组合初始化已经完成,下面我们对组合模拟管理,规则如下: - 按月调仓 -
如果前日股票上涨超过2%,买入一手,下跌超过2%,卖出一手(没有卖空)(请不要把关注重点放在拙计的规则上~)

通过API实现组个模拟调仓

API和PMS都具备了,下面我们看一下如何具体实现:
首先连接Wind
library(WindR)
w.start(showmenu = FALSE)

然后我们从Wind下载了所构建组合的信息,并提取了组合成分股的代码保存到stocklist变量中。
w_wpf_data <- w.wpf('SM', 'PMS.HoldingDaily', 'tradedate=20160705;reportcurrency=CNY;owner=W7923005;field=Asset_Code,Asset_Name')
stocklist <- with(w_wpf_data$Data, asset_code[-length(asset_code)])

这里提醒大家几点:
  • 日期最好写成“20160805”,不要写成“2016-08-05”
  • 以上代码就是根据w.start给出的菜单通过点击而生成,最后我们可以根据自己的需要进行调整

  • w.wpf
    对应菜单中(w.menu()可以用来调出菜单)WPF选项下的操作
接下来我们设定回测区间,这里我们把调仓频率设为“”,正如下面命令参数Period设置的那样。
w_tdays_data <- w.tdays('2015-07-01', '2016-07-01', 'Period=M')$Data$DATETIME
这里的话,正如之前提到的,Wind可以按照国内交易日历提取日期序列,w.tdays对应菜单TDays下的操作。
接下来我们每个调仓日对组合进行一次调仓,注意:
  • 我们这里的回测初始资产只有100万现金而没有股票,所以我们先重置了组合,然后存入100万现金

#重置组合,也就是将组合清空
w.wupf('SM','','','','','Owner=W7923005;reset=true')
#存入100万现金
w.wupf('SM','20150711','CNY','1000000','1','Owner=W7923005;Direction=Long;HedgeType=Spec;')
for(i1 in seq_along(w_tdays_data)){
#准备好存放各种数据的容器
date_list <- NULL
select_list <- NULL
price_list <- NULL
long_list <-NULL
volume_list <- NULL

print(w_tdays_data[i1])
start_data <- w.tdaysoffset(-20, w_tdays_data[i1])$Data$DATETIME
tdays_data <- w_tdays_data[i1]
for(i in seq_along(stocklist)){
#判断股票前日涨跌幅
stock_chg <- w.wss(stocklist[i],'pct_chg_per',
paste('startDate=', gsub('-', '', start_data), sep = ''),
paste('endDate=', gsub('-', '', tdays_data), sep = ''))$Data$PCT_CHG
#如果是NaN则跳过
if(is.na(stock_chg)) break
#如果过去20个交易日股价波动大于2%,进行调仓
if(abs(stock_chg) > 2){
#print('TRUE')
date_list <- c(date_list, as.character(w_tdays_data[i1]))
select_list <- c(select_list, stocklist[i])
stock_p_today <- w.wss(stocklist[i], 'low',
paste('tradeDate=', gsub('-','',w_tdays_data[i1]), sep = ''), 'cycle=D')$Data$LOW
price_list <- c(price_list, stock_p_today)
long_list <- c(long_list, ifelse(stock_chg > 0, 'Long', 'Short'))
volume_list <- c(volume_list, 100)
}
}
#调仓结果上传--------------------------------------------------------------------------
#各参数可以已向量的形式输入,包括:日期、代码、数量、价格、头寸方向
#参数准备
dates <- paste(gsub('-', '', date_list), collapse = ',')#gsub('-', '', tdays_data)
stocks <- paste(select_list, collapse = ',')
volumes <- paste(volume_list, collapse = ',')
prices <- paste(price_list, collapse = ',')
directions <- paste(long_list, collapse = ',')
dots <- paste0('Owner=W7923005;', paste0('Direction=', directions), ';HedgeType=', paste(rep('Spec', length(select_list)), collapse = ','), ';')
#实施上传
w.wupf('SM', #组合名称
dates, #调仓日期
stocks, #调仓股票
volumes, #调仓量
prices, #调仓价位
dots) #其他参数

}
最后,贴张结果图,左侧菜单点击你的组合、综合分析-持仓变动,就可以得到下图的结果了:
WindR——投资组合管理
好多同学一定忍不住:你的策略太烂了。
对于这个问题……
这里只是介绍一下如何使用API,至于策略的问题,那就得看各位的想象力了。

我的更多文章

下载客户端阅读体验更佳

APP专享