前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用python获取基金历史数据

使用python获取基金历史数据

作者头像
写一点笔记
发布2020-10-19 10:01:59
2.1K0
发布2020-10-19 10:01:59
举报
文章被收录于专栏:程序员备忘录程序员备忘录

有时候想赚钱的念头挺强烈,但是发现自己对金钱的兴趣不大。虽然很穷,但是没有专门研究过所以很多东西还停留在想一想的地步。可能是还没有体验到赚钱的快感或者说胆子太小还满足于余额宝那种万分收益2毛钱的幸福中,总之对自己的评价就是眼界太小。虽然意识到这一点了,但还是没有具体实践呀。写这篇文章的目的就是希望有专业的朋友看到这篇文章并且觉得我还行的话,带带我哦!

基本思路:在我理解中基金和股票没有什么差别,但是基金的相对于股票来说比较稳一点,基金可以分为好多种,比如债券基金、货币基金、股票基金等。比如余额宝、余利宝都是货币基金,当然货币基金风险是最小的。债券基金就稍微有点风险了,债券基金的收益和国家发现的债券数量有关,除此之外央行的加息或者降息都会导致现金的折现出现差异,而这部分差异就是债券的收益,一般来说加息会导致债券基金走跌,降息反而导致债券走强。最明显的是中美贸易战,美联储通过连续降息方式引导资本回流美国导致人民币跟随降息导致债券一路走强。而新冠疫情的蔓延使得政府大量发行新冠相关的债券导致债券持续走的弱。除此之外股票和债券还存在跷跷板现象。

在股票上可以自由组合,比如有些基金它就是在某个行业选些股然后进行操作,至于人家为啥选这个肯定有他们的一套逻辑。总之比我们专业,所以基金其实比咋自己去割韭菜更好,毕竟搞不好被反割是常有的事。但是基金千千万,我要选哪一个?毕竟厉害的基金经理可能会做到大盘跌还可以赚钱,或者说人家管理的基金就一直收益有收益,所以我们如何发掘这些牛人管理的牛基金,总不能一个个去看app吧,所以写个脚本然后加入自己的选择思想让程序去帮我们选出我们需要的基金就成为一种潜在财务自由的关键。好了,不吹牛了。上代码吧!

要获取全部基金历史数据分两步;

第一步:获取所有上市的基金代码

问题1:你连上人家服务器然后才能获取所有基金呀,你总不能从空气中直接拿吧!

通过查阅相关资料,找到了东方财富的api,如代码所示。

代码语言:javascript
复制
import json

import requests
from prettytable import *
#     code = scrapy.Field()   # 基金代码
#     name = scrapy.Field()   # 基金名称
#     unitNetWorth = scrapy.Field()   # 单位净值
#     day = scrapy.Field()    # 日期
#     dayOfGrowth = scrapy.Field()  # 日增长率
#     recent1Week = scrapy.Field()    # 最近一周
#     recent1Month = scrapy.Field()   # 最近一月
#     recent3Month = scrapy.Field()   # 最近三月
#     recent6Month = scrapy.Field()   # 最近六月
#     recent1Year = scrapy.Field()    # 最近一年
#     recent2Year = scrapy.Field()    # 最近二年
#     recent3Year = scrapy.Field()    # 最近三年
#     fromThisYear = scrapy.Field()   # 今年以来
#     fromBuild = scrapy.Field()     # 成立以来
#     serviceCharge = scrapy.Field()  # 手续费
#     upEnoughAmount = scrapy.Field()     # 起购金额

def get_url(url, params=None, proxies=None):
    rsp = requests.get(url, params=params, proxies=proxies)
    rsp.raise_for_status()
    return rsp.text

def start_requests():
    url = 'https://fundapi.eastmoney.com/fundtradenew.aspx?ft=pg&sc=1n&st=desc&pi=1&pn=5000&cp=&ct=&cd=&ms=&fr=&plevel=&fst=&ftype=&fr1=&fl=0&isab='
    html = get_url(url)
    return html

def parse_funds_list(response):
    datas = response
    datas = datas[datas.find('{'):datas.find('}') + 1]  # 从出现第一个{开始,取到}
    # 给json各字段名添加双引号
    datas = datas.replace('datas', '\"datas\"')
    datas = datas.replace('allRecords', '\"allRecords\"')
    datas = datas.replace('pageIndex', '\"pageIndex\"')
    datas = datas.replace('pageNum', '\"pageNum\"')
    datas = datas.replace('allPages', '\"allPages\"')

    jsonBody = json.loads(datas)
    jsonDatas = jsonBody['datas']
    table = PrettyTable()
    table.field_names = ['code', 'name', 'day', 'unitNetWorth', 'dayOfGrowth', 'recent1Week', 'recent1Month',
                         'recent3Month', 'recent6Month', 'recent1Year', 'recent2Year'
        , 'recent3Year', 'fromThisYear', 'fromBuild', 'serviceCharge', 'upEnoughAmount']
    for data in jsonDatas:
        fundsArray = data.split('|')
        table.add_row([fundsArray[0], fundsArray[1], fundsArray[3], fundsArray[4], fundsArray[5], fundsArray[6],
                      fundsArray[7], fundsArray[8], fundsArray[9], fundsArray[10], fundsArray[11]
                      , fundsArray[12], fundsArray[13], fundsArray[14], fundsArray[18], fundsArray[24]])
    return table

if __name__ == "__main__":
    response = start_requests()
    table=parse_funds_list(response)
    print(table)

第二步:通过基金代码获取该基金的历史数据

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup
from prettytable import *

def get_url(url, params=None, proxies=None):
    rsp = requests.get(url, params=params, proxies=proxies)
    rsp.raise_for_status()
    return rsp.text

def get_fund_total(code,start='', end=''):
    record = {'Code': code}
    url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx'
    params = {'type': 'lsjz', 'code': code, 'page': 10, 'per': 49, 'sdate': start, 'edate': end}
    html = get_url(url, params)
    temp =html.split(',')
    return temp[1].split(':')[1],temp[2].split(':')[1],temp[3].replace("};","").split(':')[1]

def get_fund_data(code, start='', end='',p=0):
    record = {'Code': code}
    url = 'http://fund.eastmoney.com/f10/F10DataApi.aspx'
    params = {'type': 'lsjz', 'code': code, 'page': p+1, 'per': 49, 'sdate': start, 'edate': end}
    html = get_url(url, params)
    soup = BeautifulSoup(html, 'html.parser')
    records = []
    tab = soup.findAll('tbody')[0]
    for tr in tab.findAll('tr'):
        if tr.findAll('td') and len((tr.findAll('td'))) == 7:
            record['Date'] = str(tr.select('td:nth-of-type(1)')[0].getText().strip())
            record['NetAssetValue'] = str(tr.select('td:nth-of-type(2)')[0].getText().strip())
            record['ChangePercent'] = str(tr.select('td:nth-of-type(4)')[0].getText().strip())
            records.append(record.copy())
    return records

def demo(code, start, end):
    table = PrettyTable()
    table.field_names = ['Code', 'Date', 'NAV', 'Change']
    table.align['Change'] = 'r'
    total, pages, currentpage = get_fund_total(code, start, end)
    print("total:"+total)
    for i in range(int(pages)):
        records = get_fund_data(code, start, end,i)
        for record in records:
            table.add_row([record['Code'], record['Date'], record['NetAssetValue'], record['ChangePercent']])
    return table

if __name__ == "__main__":
    print(demo('003358', '2010-03-02', '2020-09-30'))

当然您可以将这两段代码进行整合,这样就可以获取中国目前所有的基金数据。当然您还可以将数据存储到数据库中,这样您获取历史数据的时候只需要获取前一天的数据或者当天数据即可然后做增量存储。当然如果不能从数据中发现什么规律用于真正的开疆拓土那将变得毫无意义。贴这些代码就是为了减少您的学习成本。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员备忘录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档