【上班摸魚】企業微信、釘釘、飛書自動提醒基金預估加減倉

IT策士發表於2021-09-21

企業微信、釘釘、飛書自動提醒股票加減倉

序言

大家是否有這樣的苦惱,上班期間,下午三點時候前因工作原因影響,不能及時檢視基金導致損失幾百萬,近一步增加深圳買房距離。
圖1
有沒有一種工具能在下午三點前定時每個多久(時間自己設定)通過機器人我們,且能顯示當前時間、最近三天、五天、一週、兩週的漲跌,以及連續漲跌多少,重要的是工具免費,方便使用。作為一名屌絲,經過損失幾輛“寶馬”的痛苦經歷,根據自己掌握的知識,終於通過python爬蟲以及CI的方式實現,加班不容易,想要原碼微信聯絡。

效果展示
圖2

功能解析

實現如上圖的功能拆分為如下幾個步驟:

  • python介面爬蟲基金
    1、根據當前基金獲取基金名稱
    2、獲取基金當前時間點的收益率
    3、獲取基金最近每天的收益率
    4、計算基金最近三天、一週、半月收益率
    5、計算最近一週的漲跌情況

  • ci定時觸發
    1、通過使用免費的ci工具,當前使用CODING平臺(該平臺每月提供1000分鐘構建,白嫖就是香
    連結(https://coding.net/)
    圖1
    2、設定構建時間(工作日11點-12點,每半個小時觸發一次。下午2點-4點,每10分鐘觸發一次。金魚都知道加/減倉)
    圖1

  • 企業微信markdown格式
    1、展示基金格式,具體如下:

# 實時基金
## 當前時間:<font color="blue">**2021-09-20 15:50:20**</font>
>**1、** 基金號:<font color="black"> **011329** </font> 基金名稱:<font color="black"> **景順長城新能源產業股票C**</font> 當日長跌:<font color="red"> **0.60%**</font> 三天長跌:<font color="green"> **-3.05%**</font> 一週長跌:<font color="green"> **-1.06%**</font> 半月長跌:<font color="green"> **-0.87%**</font> 近一週長跌天數:<font color="red"> **3**</font>  <font color="green"> **2**</font>

功能實現

基金介面分析

當前是通過天天基金免費查詢,連結地址如下:
https://fund.eastmoney.com/

python實現

  • 獲取近3天,近5天,近7天,近15天,近1個月漲跌幅
    def get_fund_range_form_code(self, fundCode,dayRange=50):
        #預計獲取近3天,近5天,近7天,近15天,近1個月漲跌幅
        fundinformation = dict()
        headers = {
            "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.72 Safari/537.36",
            'Referer': f'http://fundf10.eastmoney.com/jjjz_{0}.html'.format(fundCode)
        }
        pageIndex = 1
        pageSize = 40
        startDate = (datetime.datetime.now()-datetime.timedelta(days=dayRange)).strftime("%Y-%m-%d")
        endDate = time.strftime("%Y-%m-%d", time.localtime())
        url = f'http://api.fund.eastmoney.com/f10/lsjz?fundCode={fundCode}&pageIndex={pageIndex}&pageSize={pageSize}&startDate={startDate}&endDate={endDate}'
        rs = self.get(url, headers=headers)
        results = json.loads(rs.text)['Data']['LSJZList']

        if len(results)>10:
            print(len(results))
            pass
        fundinformation['risedays'] = 0
        fundinformation['dropdays'] = 0
        for i in range(0,5,1):
            if float(results[i]['JZZZL'])>0:
                fundinformation['risedays']+=1
            if float(results[i]['JZZZL'])<0:
                fundinformation['dropdays']+=1
        fundinformation['threeday'] = results[2]['DWJZ']
        fundinformation['weekday'] = results[4]['DWJZ']
        fundinformation['twoweekday'] = results[9]['DWJZ']

        return fundinformation
  • 獲取最新的基金漲幅、漲跌天數以及實時資訊
    def get_fund_from_code(self,fundcode):
        '''
        從'http://fundgz.1234567.com.cn/js/%s.js'%funcode
        :return: 返回字典型別,{title:標題,girlurl:圖片地址
        '''
        fundinformation = {} #返回的資料
        url = "http://fundgz.1234567.com.cn/js/%s.js?rt=1627999965000"%fundcode
        rs = self.get(url,headers=self.headers)
        # 返回資訊
        content = rs.text
        print(content)
        # content = """jsonpgz({"fundcode":"501019","name":"國泰國證航天軍工指數","jzrq":"2020-08-13","dwjz":"1.2327","gsz":"1.2690","gszzl":"2.95","gztime":"2020-08-14 15:00"});"""

        #正則匹配
        pattern = r'^jsonpgz\((.*)\)'
        # 查詢結果
        search = re.findall(pattern, content)
        # 遍歷結果
        for i in search:
            data = json.loads(i)
            # print(data,type(data))
            fundinformation["gztime"] = data['gztime']
            fundinformation["fundcode"] = data['fundcode']
            fundinformation["name"] = data['name']
            fundinformation["cur_price"] = data['gsz']
            fundinformation["gszzl"] = data['gszzl']
            print("當前時間:{},基金號:{},基金:{},實時長幅: {}".format(data['gztime'],data['fundcode'],data['name'], data['gszzl']))
        fundrangeprice = self.get_fund_range_form_code(fundcode)
        fundinformation["twoday_gszzl"] = '%.2f' % ((float(fundinformation["cur_price"]) - float(fundrangeprice['threeday']))/float(fundrangeprice['threeday']))
        fundinformation["weekday_gszzl"] = '%.2f' % (
            (float(fundinformation["cur_price"]) - float(fundrangeprice['weekday'])) / float(
                fundrangeprice['weekday']))
        fundinformation["twoweekday_gszzl"] = '%.2f' % (
            (float(fundinformation["cur_price"]) - float(fundrangeprice['twoweekday'])) / float(
                fundrangeprice['twoweekday']))
        fundinformation['risedays'] = fundrangeprice['risedays']
        fundinformation['dropdays'] = fundrangeprice['dropdays']
        print(fundinformation)
        return fundinformation
  • 批量獲取基金
    def get_funds_from_code(self,fundcodes):
        funcodeslist = fundcodes.split(',')
        fundinfors = []
        for fundcode in funcodeslist:
            fundinfors.append(self.get_fund_from_code(fundcode))
        return fundinfors
  • 基金轉換為markdown格式方式企業微信以及叮叮、飛書傳送
    def deal_message_to_markdown(self,fundinfors=None):
        '''
        處理各種途徑訊息
        :param messages:
        :return:
        '''
        message = '# 實時基金\r\n\
## 當前時間:<font color="blue">**%s**</font>\r\n' % time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
        i = 0
        for fundinfor in fundinfors:
            i+=1
            message += f'>**{i}、** 基金號:<font color="black"> **%s** </font> 基金名稱:<font color="black"> **%s**</font>' %(fundinfor['fundcode'], fundinfor['name'])
            if float(fundinfor['gszzl']) > 0:
                message += ' 當日長跌:<font color="red"> **%s**</font>' % (fundinfor['gszzl'])
            else:
                message += ' 當日長跌:<font color="green"> **%s**</font>' % (fundinfor['gszzl'])
            #最近3天、一週、半月長跌
            if float(fundinfor['twoday_gszzl']) > 0:
                message += ' 三天長跌:<font color="red"> **%s**</font>' % (fundinfor['twoday_gszzl'])
            else:
                message += ' 三天長跌:<font color="green"> **%s**</font>' % (fundinfor['twoday_gszzl'])

            if float(fundinfor['weekday_gszzl']) > 0:
                message += ' 一週長跌:<font color="red"> **%s**</font>' % (fundinfor['weekday_gszzl'])
            else:
                message += ' 一週長跌:<font color="green"> **%s**</font>' % (fundinfor['weekday_gszzl'])

            if float(fundinfor['twoweekday_gszzl']) > 0:
                message += ' 半月長跌:<font color="red"> **%s**</font>' % (fundinfor['twoweekday_gszzl'])
            else:
                message += ' 半月長跌:<font color="green"> **%s**</font>' % (fundinfor['twoweekday_gszzl'])

             #近一週長跌天數
            message += ' 近一週長跌天數:<font color="red"> **%s**</font>  <font color="green"> **%s**</font>\r\n' % (fundinfor['risedays'],fundinfor['dropdays'])
        return message
  • 企業微信機器人
def send_wechart(self,wechart_url,msg=None):
        '''
        企業微信傳送圖片資源訊息
        :param wechart_url: 企業微信機器人地址
        :param msg: 傳送資源訊息
        :return:
        '''
        header = {
            'Content-Type': 'application/json'
        }
        data = {
            "msgtype": "markdown",
            "markdown": {
                "content": msg
            }
        }
        respone = requests.post(url=wechart_url, headers=header, json=data)
        return respone

coding配置

image
image
效果
image

總結

當前基金功能不太完善,基本夠用,後續可以自動計算漲跌來投入以及止損的方式來進行建議

相關文章