python如何幫我在投資中獲取更高收益


搞技術的大都比較純粹,比較實在,除了工資之外基本就沒有別的收入了(少部分人能接外包賺外塊)。或許是迫於生活的壓力,或許是不甘於固定的工資,或許是出於技術人骨子里的好奇,亦或是這幾年關於理財投資的大力宣傳、門檻降低,理財越來越被我們所接受,並開始嘗試股票、基金、P2P、XX寶等各種理財產品,本文所講與P2P有關,但不打廣告,只講技術,順便說明:投資有風險,理財需謹慎,我們賺錢不容易,不能給打了水漂。

背景介紹

某公司的理財產品有如下特點:

  1. 公司分別有12,18,24,36個月的固定期限理財產品,期限越長利率越高
  2. 投資用戶可將債權申請轉給其他投資人,轉出時的利率你可以自行控制
  3. 你也可以通過平台借錢,借錢金額不能超過在投金額的3倍,所謂加杠桿

有一部分用戶(行話叫牛)就靠平台活動或高息的時候借錢加杠桿投資,需要還錢的時候通過債權轉讓平台轉讓標還借款,通過買入和賣出時的利率差獲得額外收益。這中間比較關鍵的一點就是轉出時的利率,利率低收益就高(但太低就沒有人接手了,轉不出去還不了借款就要支付高額罰金),利率又跟當天待還的金額和已成交的金額有直接關系,那么如果能及時獲取這兩個數據就大概知道自己標多少利率能轉手成功了。

我們接下來的技術實現就主要跟獲取這兩個數據,以及如何及時的展示數據有關。

服務和工具

  • python3.4
  • mysql5.7
  • redis2.8
  • django2.0

技術實現

只是為了技術研究,沒有商用,代碼和架構以實現需求為目的,未做優化,且非專業開發,湊合看

抓取數據

翻了一遍平台官網發現有個頁面直接展示了轉讓標的詳細信息,無需登錄,且是通過ajax方式異步加載的json字符串(但是json字符串里套了一堆的html代碼,不知道咋設計的)的方式渲染頁面的,那抓取工作簡單多了,寫了個抓取腳本,流程為:訪問頁面接口 --> 取到數據 --> 簡單處理 --> 錄入數據庫,抓取腳本直接放在計划任務里每三分鍾執行一次,腳本內容如下:

import re
import time
import datetime
import requests

import pymysql

# 連接mysql數據庫
db = pymysql.connect("127.0.0.1","root","passwd","pzp")
cursor = db.cursor()

for i in range(1, 9999):
    data = {
        "RepaymentTypeId": 0,
        "pagesize": 1,
        "pageindex": i,
        "type": 1,
        "status": 2,
        "startDeadLine": 0,
        "endDeadLine": 0,
        "rate": 0,
        "beginRate": 0,
        "endRate": 0,
        "strkey": None,
        "orderby": 15,
        "unitStart": 0,
        "unitEnd": 0
    }

    try:
        r = requests.post('https://www.tuandai.com/pages/zSharePlan/getZXList', data=data).json()

        if r.get('code') == 0:
            html = r.get('data').get('projectListHtml')

            dr = re.compile(r'<[^>]+>', re.S)
            dd = dr.sub('', html).split()

            # 截取單號,只取字符串中的數字
            order_num = ''.join(re.compile('\d+').findall(dd[0]))

            # 查詢mysql數據庫
            cursor.execute("select order_num from tdw_zx_done where order_num = %s" %order_num)
            # 獲取到查詢結果
            ex = cursor.fetchone()

            # 判斷單號是否已經記錄過
            if ex is None:
                # 如果單號沒有記錄過,則計數器置為0
                x = 0

                publish_time = datetime.datetime.strptime(
                    '20%s-%s-%s %s:%s:%s' %(order_num[0:2],order_num[2:4],order_num[4:6],order_num[6:8],order_num[8:10],order_num[10:12]),
                    '%Y-%m-%d %H:%M:%S'
                )

                # ‘元’單位都替換成‘萬元’,並去掉漢字
                a = dd[1].split(':')[1]
                if '元' in a:
                    money = int(''.join(re.compile('\d+').findall(a))) / 10000
                else:
                    money = a.replace('萬','')

                # 取利率
                rate = dd[4].replace('%','')

                # 計算還款日期,借款日期 + 借款時間
                days = ''.join(re.compile('\d+').findall(dd[6]))
                repay = (publish_time + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')

                print(publish_time, order_num, money, rate, days, repay)

                # 往數據庫里插入數據並提交
                sql = "INSERT INTO tdw_zx_done VALUES('%s', %s, %s, %s, %s, '%s')" %(publish_time, order_num, money, rate, days, repay)
                cursor.execute(sql)
                db.commit()

            else:
                # 如果單號已經記錄過,則計數器加1
                x += 1

                # 如果單號已錄入過數據庫,則返回
                print('單號已錄入:%s' %str(order_num))

            # 判斷如果有連續200個單號都已經錄入過數據庫,則跳出循環
            if x == 200:
                break

            time.sleep(0.02)
        else:
            print(r)
    except Exception as e:
        print(e)

db.close()

數據處理及緩存

上邊已經獲取到了原始數據,接下來需要對原始數據進行清洗,取自己需要的今日待還及實時成交,並寫入緩存,寫入緩存的目的是公眾號並發查詢的情況下,直接去緩存取數據,減小對數據庫的壓力,這個腳本程序也放在計划任務里每分鍾執行

import os
import sys
import json
import datetime
from decimal import Decimal

os.chdir(sys.path[0])

from connection import rediscon, mysqlcon
mc, rc = mysqlcon().cursor(), rediscon()

def cache_now_data():
    today = datetime.date.today().strftime('%Y-%m-%d')

    tj, th, = '', ''

    try:
        # 成交數據統計
        mc.execute("select count(1),sum(money) from tdw_zx_done where DATE(publish_time)='%s';" %today)
        tj = mc.fetchone()

        tjie = '借款人數:%s 借款金額:%s' %(tj[0], tj[1])

        # 待還數據統計
        mc.execute("select count(1),sum(money) from tdw_zx_done where repay='%s';" %today)
        th = mc.fetchone()

        thuan = '待還人數:%s 待還金額:%s' %(th[0], th[1])

        # 完成還款預估時間
        if th[0]:
            tomorror_date = datetime.date.today() + datetime.timedelta(days=1)
            tomorror_time_str = tomorror_date.strftime('%Y-%m-%d 00:00:00')
            tomorror_time_format = datetime.datetime.strptime(tomorror_time_str, '%Y-%m-%d %H:%M:%S') 

            last_hour = (tomorror_time_format - datetime.datetime.now()).seconds / 60 / 60
            avg_hour_money = round(Decimal(th[1] - tj[1]) / Decimal(last_hour), 4)
            avg_hour_money = avg_hour_money if avg_hour_money > 0 else 0
        else:
            avg_hour_money = '無今日待還數據,無法計算'

        # 按小時統計詳情
        mc.execute("select Hour(publish_time) as Hour,count(1),sum(money) from tdw_zx_done where DATE(publish_time) ='%s' group by Hour;" %today)
        tdetail = mc.fetchall()

        dl = '小時  |  成交額(萬元)\n'
        for i in tdetail:
            dl += str(i[0]) + '  |  ' + str(i[2]) + '\n'

    except Exception as e:
        print('數據庫操作異常:%s' %e)

    try:
        key = datetime.datetime.now().strftime('%Y%m%d%H%M')
        val = {"daihuan":str(th[1]),"chengjiao":str(tj[1]),"avg_hour_money":str(avg_hour_money)}

        print(rc.set('tdw_zx_now_'+key, json.dumps(val), ex=7200))
    except Exception as e:
        print('緩存操作異常:%s' %e)

if __name__ == '__main__':
    cache_now_data()

微信好友、群自動回復

我想看數據的時候如何去看呢?去服務器上執行下腳本這方式太low了吧,借助微信機器人,就像你跟朋友聊天一樣,發消息“最新數據”,那他就立即回復最新消息給你,這個方式看起來不錯,實現完成后有幾個朋友覺得不錯,也想看數據,那我干脆將這些需要看數據的朋友都拉倒一個群里吧,回復消息群里所有用戶都看得到很方便了,技術實現主要借助了itchat模塊(itchat主要通過網頁版微信接口處理數據,網頁版微信很多用戶無法登陸了,也就沒有辦法使用itchat),代碼如下

文章未完,全部內容請關注公眾號【運維咖啡吧】或個人網站https://ops-coffee.cn查看,運維咖啡吧專注於原創精品內容分享,感謝您的支持

掃碼關注公眾號查看更多實用文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM