量化分析之(四)股票暴涨行情不错过之买持股基金

股票暴涨行情不错过之买持股基金。

有时在行情暴涨时,出现某些股票买进不了(天天一字板,看着非常的眼馋),怎么办呢?只能曲线买基金,那怎么买呢?

技术交流微信【xicebloodx】,仅限交流,骚扰即拉黑,加微信请注明【技术交流】。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @license : (C) Copyright 2017-2020.
# @Time    : 2020/6/14 15:20
# @File    : etf.py
# @Software: PyCharm
# @desc    :

import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
import json

FUND_COLUMNS = ['SCode', 'SName', 'RDate', 'SHCode', 'SHName', 'IndtCode',
                'InstSName', 'TypeCode', 'Type', 'ShareHDNum', 'Vposition',
                'TabRate', 'TabProRate', 'BuyState']

REQUEST_HEADER = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36'}


def read_csv(path):
    """
    read data frame
    :param path: file path
    :return: data frame
    """
    with open(path, 'r') as f:
        p = re.search(r'\[.+\]', f.read().replace(r"\/", ""))
        if p:
            text = p.group(0)
            jstr = json.dumps(text)
            js = json.loads(jstr)
            df = pd.DataFrame(pd.read_json(js, dtype={'code': object}),
                              columns=FUND_COLUMNS)

            return df

def get_fund_list(symbol, date):
    """
    get fund list
    :param symbol: code
    :param date: date
    :return: data frame
    """

    stock_url = 'http://data.eastmoney.com/zlsj/detail.aspx?type=ajax&sr=-1&p=1&ps=1000&stat=0&code=%s&date=%s&rt=52763434'
    try:
        url = stock_url % (symbol, date)
        web_source = requests.get(url, headers=REQUEST_HEADER, timeout=5)

        path = f'./data/{symbol}.txt'
        open(path, 'wb').write(web_source.content)

        df = read_csv(path)
        df['SHCode'] = df['SHCode'].astype('str')
    except Exception as e:
        raise e

    return df

def get_stock_fundlist(symbol, date='2020-03-31'):
    """
     查询股票被持有的基金及持仓占比
    :param symbol: 股票代码,例如: SZ000001
    :param date: 报告日期,例如:2019-12-31,2019-03-31
    :return:
    """
    fund_url = 'http://fund.eastmoney.com/f10/FundArchivesDatas.aspx?type=jjcc&code=%s&topline=15'

    df = get_fund_list(symbol, date)
    etf_list = [x for x in list(df.SHCode) if len(x)==6]

    results = {}
    for code in etf_list[:]:
        web_source = requests.get(fund_url % code, headers=REQUEST_HEADER, timeout=5)
        html_source = web_source.content.decode()
        html_source = html_source.split("\"")[1]
        soup = BeautifulSoup(html_source, 'lxml')
        items = soup.select(".tzxq")[0].select('tr')
        for item in items[1:]:
            if symbol[2:] not in item.text:
                continue
            fields = item.select('td')
            record = [field.text.strip() for field in fields if
                      field.text.strip() != '' and '变动' not in field.text]
            results[code] = record[3][:-1]
            break
    return sorted(results.items(), key=lambda kv: kv[1], reverse=True)

测试代码:

以【三七互娱】为例,选择前10名,当然还可以以新基建或5G等等,都是可以的:

if __name__ == '__main__':
    etf = get_stock_fundlist('002555', '2020-03-31')

    for code, ratio in etf[:10]:
        print(code, ratio)

获取数据:

512980 9.43
164818 9.04
160629 9.03
160522 8.91
160512 7.75
161036 7.51
163805 7.18
240009 6.85
161605 6.63
160519 6.56

这时就可以上天天基金或者支付宝上买基金了。

你可能感兴趣的:(量化投资,Python,ETF,FUND,基金)