不知道如何分析选择基金、股票?Python来教你

废话不多说,直接上菜。

第一步:基金数据爬取
打开天天基金网(https://fund.eastmoney.com/),通过浏览器的开发者工具,我们能观察到用户的请求和数据的返回过程。从而利用正则表达式,以及 xpath 等工具,辅以一点 python 爬虫的知识,很容易就能获取到每支基金的增长率和持仓情况。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:883888997
我所用到的代码如下。

XMtool.py:


# In[]: 
#!/usr/bin/env python
# coding: utf-8
# encoding=utf-8
import pandas as pd
import requests
from lxml import etree
import re
#import collections
import numpy as np


# In[]: 
sample = '150000'#样本数量
sc = '6yzf'#排序键值
st = 'desc'#排序方式
ft = 'gp'#基金类型
dx = '1'#是否可购
season = 1#季度选择


r1r = 1#日增长率
r1z = 1#近1周
r1y = 1#近1月
r3y = 0.3333#近3月
r6y = 0.3333#近6月
r1n = 0.25#近1年
r2n = 0.25#近2年
r3n = 0.25#近3年
rjnl = 0.25#今年来
rcll = 1#成立来


    
sd = '2021-01-07'
ed = '2021-02-07'

# In[] 在参数文书写单元后加上这么一段就可以了
#from PyQt5.QtWidgets import QInputDialog, QLineEdit, QDialog
from PyQt5.QtWidgets import QDialog
import sys
from PyQt5.QtWidgets import QApplication
import dialog
class TestDialog1(QDialog,dialog.Ui_XMtool):  
    def __init__(self,parent=None):  
        super(TestDialog1,self).__init__(parent)  
        self.setupUi(self)

app=QApplication(sys.argv)  
dlg=TestDialog1()  
dlg.show()  
app.exec_()

sample = dlg.sample.text() #样本数量
sc = dlg.sc.currentText() #排序键值
st = dlg.st.currentText() #排序方式
ft = dlg.ft.currentText() #基金类型
dx = dlg.dx.currentText() #是否可购
season = int(dlg.season.currentText()) #季度选择


r1r = float(dlg.r1r.text()) #日增长率
r1z = float(dlg.r1z.text())#近1周
r1y = float(dlg.r1y.text())#近1月
r3y = float(dlg.r3y.text())#近3月
r6y = float(dlg.r6y.text())#近6月
r1n = float(dlg.r1n.text())#近1年
r2n = float(dlg.r2n.text())#近2年
r3n = float(dlg.r3n.text())#近3年
rjnl = float(dlg.rjnl.text())#今年来
rcll = float(dlg.rcll.text())#成立来

# In[]:
header = {
   
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36',
        'Referer': 'http://fund.eastmoney.com/data/fundranking.html',
        'Cookie':'st_si=74949607860286; st_asi=delete; ASP.NET_SessionId=gekyucnll0wte0wrks2rr23b; _adsame_fullscreen_18503=1; EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; EMFUND5=null; EMFUND6=null; EMFUND7=null; EMFUND8=null; EMFUND0=null; EMFUND9=02-07 16:37:21@#$%u521B%u91D1%u5408%u4FE1%u5DE5%u4E1A%u5468%u671F%u80A1%u7968A@%23%24005968; st_pvi=90009717841707; st_sp=2021-02-07%2012%3A14%3A29; st_inirUrl=https%3A%2F%2Fwww.baidu.com%2Flink; st_sn=21; st_psi=2021020716562364-0-0372414431'
}
url = 'http://fund.eastmoney.com/data/rankhandler.aspx?op=ph&dt=kf&ft='+ft+'&rs=&gs=0&sc='+sc+'&st='+st+'&sd='+sd+'&ed='+ed+'&qdii=&tabSubtype=,,,,,&pi=1&pn='+sample+'&dx='+dx+'&v=0.2692835962833908'
response = requests.get(url=url, headers=header)
text = response.text
data = text.split('=')[1]#使用等号分开去后面一部分
compile_data = re.findall("{datas:\\[(.*)\\],allRecords", str(data))[0]#取datas和allRecords中的所有内容
strip_data = str(compile_data).strip('[').strip(']')#移除字符串头尾的中括号
replace_quta = strip_data.replace('"', "")#双引号替换为空
quota_arrays = replace_quta.split(",")#使用逗号转为列表
intervals = [[i * 25, (i + 1) * 25] for i in range(15000)]#生成10000个区间,每个区间长度为25
narrays = []
for k in intervals:
    start, end = k[0], k[1]
    line = quota_arrays[start:end]#将条目25个分为一组,表示一只基金
    narrays.append(line)
header = ["基金代码", "基金简称", "基金条码", "日期",
          "单位净值", "累计净值", "日增长率", "近1周", "近1月", "近3月", "近半年", "近1年", "近2年", "近3年",
          "今年来", "成立来", "其他1", "其他2", "其他3", "其他4", "其他5", "其他6", "其他7", "其他8", "其他9"]
df = pd.DataFrame(narrays, columns=header)#生成pd数据结构
df.dropna()
total = df.count()[0]
print("共有{}支基金!".format(total))
df = df.head(total)
df_part = df[["基金代码", "基金简称", "日增长率", "近1周", "近1月", "近3月", "近半年", "近1年", "近2年", "近3年",
          "今年来", "成立来"]]#挑选部分感兴趣的条目
df.to_csv("./基金增长率.csv", encoding="utf_8_sig")

# In[]:
df_picked_part = df_part
rates = [r1r,r1z,r1y,r3y,r6y,r1n,r2n,r3n,rjnl,rcll]
i = -1
for sc in ["日增长率", "近1周", "近1月", "近3月", "近半年", "近1年", "近2年", "近3年",
          "今年来", "成立来"]:
    i = i+1
    #print(sc)
    rate = rates[i]
    rate_num = int(total*rate)
    df_tmp = df_part.sort_values(by=[sc], ascending=False, axis=0)
    df_tmp = df_tmp.head(rate_num)
    df_picked_part = pd.merge(df_picked_part,df_tmp,how='inner')
print(df_picked_part.head(10))
df_picked_part.to_csv("./4433法则结果.csv", encoding="utf_8_sig")

# In[]:
rank_codes = df_part['基金代码'].values.tolist()
#len_codes = len(rank_codes)
stocks_array = []
stock_funds = []
total_part = int(total/100)+1 #每百分之一报一次进度
for index, code in enumerate(rank_codes):
#    if index < 1:
#        print("<" * 30 + "所有基金的股票池前10情况" + ">" * 30)
#    print(code)
    if index%total_part==0:
        print("<" * 30 + "获得基金持仓数据中:"+str(index)+"/"+str(total)+ ">" * 30)
    url = "http://fundf10.eastmoney.com/FundArchivesDatas.aspx?type=jjcc&code={}&topline=10&year=&month=&rt=0.5032668912422176".format(code)
    head = {
   
    "Cookie": "EMFUND1=null; EMFUND2=null; EMFUND3=null; EMFUND4=null; EMFUND5=null; EMFUND6=null; EMFUND7=null; EMFUND8=null; EMFUND0=null; st_si=44023331838789; st_asi=delete; EMFUND9=08-16 22:04:25@#$%u4E07%u5BB6%u65B0%u5229%u7075%u6D3B%u914D%u7F6E%u6DF7%u5408@%23%24519191; ASP.NET_SessionId=45qdofapdlm1hlgxapxuxhe1; st_pvi=87492384111747; st_sp=2020-08-16%2000%3A05%3A17; st_inirUrl=http%3A%2F%2Ffund.eastmoney.com%2Fdata%2Ffundranking.html; st_sn=12; st_psi=2020081622103685-0-6169905557"
    ,
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"}
    response = requests.get(url, headers=head)
    text = response.text
    div = re.findall('content:\\"(.*)\\",arryear', text)[0]
    html_body = '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>test</title></head><body>%s</body></html>' % (
        div)#构造网页
    html = etree.HTML(html_body)#将传进去的字符串转变成_Element对象
    stock_info = html.xpath(
  • 3
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值