量化交易/基金爬虫(一)

先说说这个python脚本的初衷,就是为了给将来的量化交易----实现自动化亏钱做一个基石,打一下基础。
但是没想到的是,在写完这个脚本之后,仅仅两天时间,我全部的收益就被赔光。。。哭了。。。

import requests
from bs4 import BeautifulSoup
import re
import numpy as np
import matplotlib
import xlsxwriter

# 处理乱码
matplotlib.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['axes.unicode_minus'] = False

#基金字典   这里是我们的基金代码已经名称
def my_data():
    datas = {
        '160222': '国泰国证食品饮料行业',
        '160632': '鹏华酒',
        '320007':'诺安成长混合',
        '002472':'光大先进服务业混合',
        '006113':'汇添富创新医药混合',
        '161726':'招商国证生物医药指数',
        '000742':'国泰新经济灵活配置混合',
        '164906':'交银中证海外中国互联网指数',
        '008888':'华夏国证半导体芯片ETF联接C',
        '004997':'广发高端制造股票A',
        '160630':'鹏华中证国防指数(LOF)',
        '160225':'国泰国证新能源汽车指数',
        '005827':'易方达蓝筹精选混合',
        '260108':'景顺长城新兴成长混合',
        '163417':'兴全合宜混合(LOF)A',
        '003984':'嘉实新能源新材料股票A',
        '519069':'汇添富价值精选混合A',
    }
    return datas

#数据保存到execl
def save_excel(file_dir, data_list, sheet_name):
    workbook = xlsxwriter.Workbook(file_dir)

    for i in range(len(sheet_name)):
        worksheet = workbook.add_worksheet(sheet_name[i])
        bold = workbook.add_format({'bold': 1})
        headings = ['净值日期', '单位净值', '累计净值', '日增长率', '申购状态', '赎回状态', '分红送配']
        worksheet.write_row('A1', headings, bold)
        for h in range(len(data_list[i])):
            worksheet.write_row('A' + str(h + 2), data_list[i][h])

        chart_col = workbook.add_chart({'type': 'line'})

        # 配置第一个系列数据
        chart_col.add_series({
            # 如果新建sheet时设置了sheet名,这里就要设置成相应的值,如果没有的话,那就是Sheet1
            'name': '={}!$B$1'.format(sheet_name[i]),
            'categories': '={}!$A$2:$A${}'.format(sheet_name[i],len(data_list[i])),
            'values': '={}!$B$2:$B${}'.format(sheet_name[i],len(data_list[i])),
            'line': {'color': 'red'},
        })
        # 配置第二个系列数据
        chart_col.add_series({
            'name': '={}!$C$1'.format(sheet_name[i]),
            'categories': '={}!$A$2:$A${}'.format(sheet_name[i],len(data_list[i])+1),    #展示名字
            'values': '={}!$C$2:$C${}'.format(sheet_name[i],len(data_list[i])+1),       #展示数据
            'line': {'color': 'yellow'},
        })
        # 设置图表的title 和 x,y轴信息
        chart_col.set_title({'name': '基金走势'})
        chart_col.set_x_axis({'name': '时间'})
        chart_col.set_y_axis({'name': '价值'})
        # 设置图表的风格
        chart_col.set_style(1)
        # 把图表插入到worksheet并设置偏移
        worksheet.insert_chart('A2', chart_col, {'x_offset': 500, 'y_offset': 1})

    workbook.close()

#页面解析
def get_html(code, start_date, end_date, page=1, per=20):
    url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx?type=lsjz&code={0}&page={1}&sdate={2}&edate={3}&per={4}'.format(
        code, page, start_date, end_date, per)
    rsp = requests.get(url)
    html = rsp.text
    return html

#获取数据
def get_fund(code, start_date, end_date, page=1, per=20):
    # 获取html
    html = get_html(code, start_date, end_date, page, per)
    soup = BeautifulSoup(html, 'html.parser')
    # 获取总页数
    pattern = re.compile('pages:(.*),')
    result = re.search(pattern, html).group(1)
    total_page = int(result)
    # 获取表头信息
    heads = []
    for head in soup.findAll("th"):
        heads.append(head.contents[0])

    # 数据存取列表
    records = []
    # 获取每一页的数据
    current_page = 1
    while current_page <= total_page:
        html = get_html(code, start_date, end_date, current_page, per)
        soup = BeautifulSoup(html, 'html.parser')
        # 获取数据
        for row in soup.findAll("tbody")[0].findAll("tr"):
            row_records = []
            for record in row.findAll('td'):
                val = record.contents
                # 处理空值
                if val == []:
                    row_records.append(np.nan)
                else:
                    row_records.append(val[0])
            # 记录数据
            records.append(row_records)
        # 下一页
        current_page = current_page + 1

    return records

#次程序
def collect(start_time,end_time):
    datas = []
    names = []
    data = my_data()
    for i in data:
        fund_code = i
        name = data[i]
        names.append(name)
        print(fund_code, name)
        fund_df = get_fund(fund_code, start_date=start_time, end_date=end_time)
        for i in fund_df:     #为了方便制图,写入到execl表内时,数字转换成浮点型
            i[1] = float(i[1])
            i[2] = float(i[2])
            i[6] = str(i[6])    #存入到execl表前,要转换成str
        datas.append(fund_df)
    return datas,names

if __name__ == '__main__':
    datas,names = collect('2020-10-13','2021-01-13')  #这里是获取基金数据的时间
    save_excel('01-14.xlsx', datas, names)   #名称

脚本运行完之后的效果(图表会在execl中自动生成)
在这里插入图片描述

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值