一、项目背景:
较早前就接触股市,但由于风险承受能力较低,所以比较偏爱基金投资。然鹅,权益类基金的风险似乎对我而言也有些高了,所以之前有一段时间热衷于无风险/低风险基金套利。彼时市面上监控套利机会的程序还不多,且用起来不是那么顺手,而自己又是个技术宅,于是开始哼哧哼哧研究。
二、项目解读:
1. 整体方案
采用互联网公开api接口 + 微信小程序 + 企业微信实现。互联网公开api接口用于获取股票与基金的实时交易价格,微信小程序用于实时监控价格与计算基金净值以及触发用户操作等,企业微信用于向用户发出套利通知消息。实际上小程序的操作界面没有利用起来,只使用云函数自动运行监控程序,并在套利机会出现时通过企业微信开放接口通知用户。
2. 源码介绍
源码量不大,就几百行,整体逻辑也非常简单。函数列表如下:
(1)run由云函数调用,判断在合适的时间分别监控国内基金和QDII基金。
var date = new Date(event.Time);
if (14 == date.getHours())
util.httpget(url_china_fund, parseChinaDiscountInfo);
if (14 == date.getHours() || 16 == date.getHours() || 9 == date.getHours())
util.httpget(url_qdii_fund, parseQDIIDiscountInfo);
(2)parseChinaDiscountInfo函数解析A股基金信息,具体信息源当时采用的是集思录的接口,由于该接口已经提供了折溢价信息,仅仅只需要判断一下安全边界,并发送通知提醒即可,在此不细述。
(3)parseQDIIDiscountInfo函数负责解析QDII基金信息,也是采用的集思录接口,这里仅实现了中国互联LOF的监控。该基金持仓部分复杂,包含美股与港股,开市时间与A股有时差,所以预估净值时就要复杂一些。计算时要考虑前天的净值、昨天的预估净值、昨天的美股持仓收盘价、今天的港股持仓实时价格等,对于港美股同时上市的,也要采用港股实时价格。
//1取最近一日净值,以其为基础计算昨日估值
var nav_dt = new Date(row['cell']['nav_dt']);
var nav_val = parseFloat(row['cell']['fund_nav']);
//2获取持仓股比例
get_holding_ratio_via_kweb(fund.holdings, nav_dt);
//3获取美港两地上市持仓股实时价格,用于以港股推算美股ADR价格
var url = url_stock_info;
var hk_ratio = 0; //所有港股所占持仓比重,用于推算全部持仓收盘价
for (let holding of fund['holdings']){
if (holding.hkcode != ""){
hk_ratio += holding.ratio;
if (holding.uscode != "")
url = url + 's_hk' + holding.hkcode + "," + 's_us' + holding.uscode + ",";
}
}
eval(util.httpget_sync(url));
//4获取持仓股最近两日日K与实时信息
var last_est_val = rt_est_val = nav_val;
for (let holding of fund['holdings'])
{
if (holding.uscode != "")
var code = 'us' + holding.uscode + "." + holding.ipo_site;
else if (holding.hkcode != "")
var code = 'hk' + holding.hkcode;
var param = code + ",day," + util.formatDate(nav_dt, "yyyy-MM-dd") + ",,2,";
var kline_info = JSON.parse(util.httpget_sync(url_stock_daily + param));
var last_inc = 0;
if (kline_info.data[code]["day"].length >= 2) //排除休市的情况
last_inc = (parseFloat(kline_info.data[code]["day"][1][2]) - parseFloat(kline_info.data[code]["day"][0][2]))/parseFloat(kline_info.data[code]["day"][0][2]);
var rt_inc = 0;
if (holding.hkcode != "" && holding.uscode != ""){ //以港股预估:根据ADR换算成美元价格再计入净值
var adr_price = global['v_s_us' + holding.uscode].split('~')[3];
var adr_estimate = global['v_s_hk' + holding.hkcode].split('~')[3]*holding.adr/curr_us_2_hk;
rt_inc = (adr_estimate - adr_price)/adr_price;
}else{ //否则直接计入涨幅
if (kline_info.data[code]["day"].length >= 2) //排除休市的情况
rt_inc = (parseFloat(kline_info.data[code]["qt"][code][3]) - parseFloat(kline_info.data[code]["day"][1][2]))/parseFloat(kline_info.data[code]["day"][1][2]);
}
//5滚动计算昨天日估值与实时估值
last_est_val = last_est_val*(1 + last_inc*holding.ratio/100);
rt_est_val = rt_est_val*(1 + (last_inc + rt_inc)*holding.ratio/100);
}
//6预测美股收盘后估值
var fore_est_val = (rt_est_val - last_est_val)*100/hk_ratio + last_est_val;
//7.计算折溢价
var price = parseFloat(row['cell']['price']);
var rt_est_dis = (price - rt_est_val)/rt_est_val*100; //实时溢价
var fore_est_dis = (price - fore_est_val)/fore_est_val*100; //预测溢价
if (fore_est_dis < fund["premium_threshold"] && fore_est_dis > fund["discount_threshold"])
{
console.log(row['id'] + ":" + fore_est_dis.toFixed(4) + "\n");
continue;
}
//8.计算安全价格
var rt_sec_price = 0; //实时安全价格
if (rt_est_dis > 0){ //溢价
rt_sec_price = ((100 + fund['premium_safety'])/(100 + rt_est_dis))*parseFloat(row['cell']['price']);
rt_sec_price = ">" + rt_sec_price.toFixed(3);
}else{ //折价
rt_sec_price = ((100 - fund['discount_safety'])/(100 + rt_est_dis))*parseFloat(row['cell']['price']);
rt_sec_price = "<" + rt_sec_price.toFixed(3);
}
var fore_sec_price = 0; //预测安全价格
if (fore_est_dis > 0){ //溢价
fore_sec_price = ((100 + fund['premium_safety'])/(100 + fore_est_dis))*parseFloat(row['cell']['price']);
fore_sec_price = ">" + fore_sec_price.toFixed(3);
}else{ //折价
fore_sec_price = ((100 - fund['discount_safety'])/(100 + fore_est_dis))*parseFloat(row['cell']['price']);
fore_sec_price = "<" + fore_sec_price.toFixed(3);
}
(4)get_holding_ratio_via_kweb与set_holding_ratio用于获取基金的持仓比例信息,辅助预估净值生成,具体参见源码。
(5)sendNotification调用企业微信开放接口通知用户套利消息,腾讯官网有详细文档,在此不赘述。
三、结语
1. 计算逻辑复杂,且程序开发出来后随即进入熊市,准确度未经实践检验,同时现在市面的类似程序有很多免费且好用的,因而本文仅作技术交流,仅供参考。
2. 股市、基市有风险,入市需谨慎。