基于javascript的股价监控与基金净值计算以及套利提醒

一、项目背景:

较早前就接触股市,但由于风险承受能力较低,所以比较偏爱基金投资。然鹅,权益类基金的风险似乎对我而言也有些高了,所以之前有一段时间热衷于无风险/低风险基金套利。彼时市面上监控套利机会的程序还不多,且用起来不是那么顺手,而自己又是个技术宅,于是开始哼哧哼哧研究。

二、项目解读:

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. 股市、基市有风险,入市需谨慎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

雪山青木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值