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——投资组合管理]()
鼠标放上去的话就会有中文提示,建议大家每个标签都试试。
关于WindR这里补充两点:
- 首先Wind上的数据是比较全的,设计一般的交易策略不是问题
- 第二点是交易日历的问题,符合国情的交易日历处理起来更加方便(相对于quantmod包)
Wind组合管理系统(PMS)
下面我们转向Wind界面,首先打开Wind,键入PMS,然后就会进入到组合管理系统界面:
![WindR——投资组合管理 WindR——投资组合管理]()
注意到上面的菜单栏:
![WindR——投资组合管理 WindR——投资组合管理]()
点击新建组合,出现如下界面:
![WindR——投资组合管理 WindR——投资组合管理]()
这里需要填写组合名称,比如这里我命名为SM,其他选项基本系统已经填好。点击“
下一步
”
![WindR——投资组合管理 WindR——投资组合管理]()
点击左上角的调仓日期,调整到你需要的日期,这里我调整到了2015年7月1日。然后,
- 点击菜单栏的现金存取,输入足够的金额
- 点击批量证券导入,选择你感兴趣的证券,我这里选择的是创业板第一页的股票(见下图)
-
输入持仓数量,或者,点击等权重调仓,弹出界面的左上角调整仓位到50%(为了确保留有资金调仓),系统会根据你的设定的仓位配置股票。
![WindR——投资组合管理 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——投资组合管理 WindR——投资组合管理]()
好多同学一定忍不住:你的策略太烂了。
对于这个问题……
这里只是介绍一下如何使用API,至于策略的问题,那就得看各位的想象力了。