Newer
Older
stockTray / stock_filter / main / fp.py
bdapp on 18 Apr 2019 7 KB 调整策略规则
import tushare as ts
import db
import history
import time

mysql = db.MY_SQL()

start_time = '09:45'
end_time = '14:45'

token = '233302841e61938a0e1b77e74dd6fe86703e0a5ddece3544569c9017'


def get_hist_time_data(time, from_day, to_day):
    codes = mysql.getListForCate('')
    for x in codes:
        # print(x)
        df = ts.get_hist_data(x[0], from_day, to_day, ktype='5')
        print(df)
        if df is not None:
            for i in df.index:
                if str(i).find(time) != -1:
                    print(df.loc[i]['open'])
                    print(df.loc[i]['p_change'])
                    print(df.loc[i]['turnover'])

                    mysql.insert_now_table(x[0], x[1], df.loc[i]['p_change'], df.loc[i]['open'], df.loc[i]['turnover'])


# 按日期查询历史数据
def get_hist_day_data(from_day, to_day, pre_day):
    # 清空当前行情表
    mysql.init_now_table()

    codes = mysql.getListForCate('')
    for x in codes:
        # print(x)
        df = ts.get_hist_data(x[0], start=from_day, end=to_day)
        if df is not None:
            for i in df.index:
                    print(x[0])

                    mysql.insert_now_table(x[0], x[1], df.loc[i]['p_change'], df.loc[i]['close'], '')

                    # 查询profit是否有相同code
                    profit = mysql.get_pre_day_data(x[0], pre_day)
                    if profit is not None:
                        #for m in profit:
                        # 取开盘价
                        price = df.loc[i]['open']

                        if x[0] == profit[2]:
                            old_price = profit[5]
                            p = float(price) - float(old_price)
                            mysql.cale_profit(profit[0], p)

    # 接近涨停的票数据
    maxData = []

    # 从表获取当天数据
    now_datas = mysql.get_now('')
    # 取出涨幅接近涨停的票
    for i in now_datas:
        if float(i[3]) > 9.6:
            # print(d['code'] + " " + d['name'])
            v = {'code': i[1], 'name': i[2], 'percent': i[3]}
            maxData.append(v)

    # 给接近涨停的票加上[行业分类]参数
    for i in range(len(maxData)):
        for j in codes:
            if maxData[i]['code'] == j[0]:
                maxData[i]['cate'] = j[2]

    # 排序参数,取第2位排序
    def take_second(elem):
        return elem[1]

    # 排序参数,取第4位排序
    def take_four(elem):
        return elem[3]

    # 取出接近涨停票中的cate分类
    # 并计算出现每个分类的次数
    # 目的是取出[热门行业]
    cates = {}
    for i in range(len(maxData)):
        key = maxData[i].get('cate')
        if key in cates:
            num = cates.get(key) + 1
        else:
            num = 1
        cates[key] = num

    # 分类排序并取出排名
    sorts = []
    cate_list = list(cates.items())
    cate_list.sort(key=take_second, reverse=True)

    # 取行业排名前6
    for i in range(0, 6):
        if cate_list[i][0] is not None:
            sorts.append(cate_list[i][0])

    print('\n')
    print(sorts)

    # 清空历史表
    mysql.clear_history()
    # 处理每个行业的数据
    for i in range(len(sorts)):
        # 取出同行业全部票
        stocks = mysql.getListForCate(sorts[i])
        stockPercent = []
        for i in range(len(stocks)):
            code = stocks[i][0]
            # 查询票当前涨幅
            p = mysql.getPercent(code)
            for j in p:
                s = (float(j[0]),)
                a = stocks[i] + s
                stockPercent.append(a)
        # 根据涨幅排序
        stockPercent.sort(key=take_four, reverse=True)
        # print(stockPercent)

        for z in range(len(stockPercent)):
            if 3 <= float(stockPercent[z][3]):
                # print(stockPercent[z])
                # 查询单个的180天历史高位数据,并保存到数据库
                history.query_stock_history(mysql, stockPercent[z][0],
                                            stockPercent[z][1],
                                            stockPercent[z][2])


    # 处理每个行业的数据
    for x in range(len(sorts)):
        stocks = mysql.getListForCate(sorts[x])
        stockPercent = []
        for i in range(len(stocks)):
            code = stocks[i][0]
            p = mysql.getPercent(code)
            for j in p:
                s = (float(j[0]),)
                a = stocks[i] + s
                # print(a)
                stockPercent.append(a)
        # 根据涨幅排序
        stockPercent.sort(key=take_four, reverse=True)
        # print(stockPercent)

        # 今日龙头
        maxPercent = []
        for i in range(len(stockPercent)):
            # 取出今天行业的领涨龙头
            if 9.8 <= float(stockPercent[i][3]):
                maxPercent.append(stockPercent[i])

        # print(maxPercent)

        allStr = ''
        for i in maxPercent:
            # 查询龙头历史数据
            days = mysql.selectDay(i[0])
            for j in days:
                result = mysql.selectRelationStocks(j[4], i[2])
                # print(str(result))
                allStr += str(result)
        # print(allStr)

        # 处理字符
        allStr = allStr.replace("(", "")
        allStr = allStr.replace(")", "")
        allStr = allStr.replace("'", "")
        allStr = allStr.replace(",,", ",")
        allStr = allStr.replace(" ", "")
        # print(allStr)

        # 移除重复字符
        sortList = []
        for i in allStr.split(','):
            if i != '':
                d = (i, allStr.count(i))
                if sortList.count(d) <= 0:
                    sortList.append(d)
        sortList.sort(key=take_second, reverse=True)
        # print(sortList)

        result = []
        for i in sortList:
            # 查询历史中高位出现的次数
            num = mysql.selectCount(i[0])[0]
            if num >= 3:
                # 查询实时行情
                # df = ts.get_realtime_quotes(i[0])
                p = 0
                price = 0
                n = ''

                # 从保存的实时信息中取出
                df = mysql.get_now(i[0])
                for j in df:
                    p = j[3]
                    price = j[4]
                    n = j[2]

                # 过滤百分比太高和太低的数据
                if 1 <= float(p) <= 7:
                    # 查询15天内的上升趋势
                    t = history.query_month_history(i[0])
                    if t[0]:
                        value = (i[0] + ' ' + n, price, str(p) + "%", t[1], num)
                        result.append(value)
                        # 保存结果到数据库
                        print(value)
                        mysql.save_to_profit(from_day, i[0], n, sorts[x], price)



pro = ts.pro_api(token=token)
cal = pro.query('trade_cal', start_date='20181220', end_date='20190415')

run_day = []
for i in cal.index:
    if cal.loc[i][2] == 1:
        day = cal.loc[i][1]
        y = day[:4]
        m = day[:6][4:]
        d = day[6:]
        run_day.append(y+'-'+m+'-'+d)

for i in range(len(run_day)):
    # 按日期取历史数据
    if i > 0:
        get_hist_day_data(run_day[i], run_day[i], run_day[i-1])
    else:
        get_hist_day_data(run_day[i], run_day[i], run_day[i])

# get_hist_time_data(end_time, '2019-04-10', '2019-04-11')

# 取分时数据(历史日期太少,最多半个月
# http://money.finance.sina.com.cn/quotes_service/api/json_v2.php/CN_MarketData.getKLineData?symbol=sz000014&scale=15&ma=5&datalen=5000)
# print(ts.get_hist_data('300655', '2019-03-29', '2019-03-31', ktype='5'))

# print(ts.__version__)

# pro = ts.pro_api(token=token)
# print(pro.daily(trade_date='20190322'))
# cal = pro.query('trade_cal', start_date='20181028', end_date='20190415')
# for i in cal.index:


# print(ts.get_hist_data('000014', '2019-03-22', '2019-03-25', ktype='5'))