用python来获取基金历史收益率来估算出那些基金可能比较好,自己的一些愚见,纯粹视为了学习python,里面的内容不能作为任何参考,刚开始学习python,写的不好希望各位大牛能帮忙指出不足,谢谢。

1、获取获取所有基金的代码

import requests
import redef getAllFundCode():url = "http://fund.eastmoney.com/js/fundcode_search.js"all_text = requests.get(url).text# 取出全部内容findall = re.findall(r'"\d+\.?\d*"', all_text)result = []for x in findall:# 替换双引号result.append(re.sub(r'"', "", x))return result

2、获取基金信息

import requests
import re
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup
import logging# 获取html
def getHtml(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)return rsp.text# 获取基金数据
def getFund(name, code, start_date, end_date, page=1, per=20):log_format = "%(asctime)s - %(message)s"logging.basicConfig(filename="exec.log", format=log_format, level=logging.INFO)try:html = getHtml(code, start_date, end_date, 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.find_all("th"):heads.append(head.contents[0])# 数据存取列表records = []# 获取每一页数据current_page = 1while current_page <= total_page:html = getHtml(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 + 1if len(records) <= 0:return None# 将数据转换为Dataframe对象np_records = np.array(records)fund_df = pd.DataFrame()for col, col_name in enumerate(heads):fund_df[col_name] = np_records[:, col]# 按照日期排序fund_df['净值日期'] = pd.to_datetime(fund_df['净值日期'], format='%Y/%m/%d')fund_df = fund_df.sort_values(by='净值日期', axis=0, ascending=True).reset_index(drop=True)fund_df = fund_df.set_index('净值日期')# 数据类型处理fund_df['单位净值'] = fund_df['单位净值'].astype(float)fund_df['累计净值'] = fund_df['累计净值'].astype(float)fund_df['日增长率'] = fund_df['日增长率'].str.strip('%').astype(float)# print("thread_name: " + name + " code: " + code + " finish!")finish_info = "thread_name: {} code: {} finish!".format(name, code)logging.info(finish_info)return fund_dfexcept Exception as e:print(e)error_info = "thread_name: {} code: {} error!".format(name, code)logging.info(error_info)return None

3、开始分析基金数据并排序,我使用了基金  收益率方差*收益率标准差/收益率²作为基准进行排序,算出来的值越低,说明偏离和离散程度较低,收益率较高。

import GetFundInfo as gf
import GetFundCode as gd
import datetime
import numpy as np
import threading as tr
import osthreadLock = tr.Lock()# 获取列表的第三个元素
def takeSecond(elem):return elem[2]# 2015年以前的基金不算,因为没有足够的历史数据回测
def compareTime(time):# end_time = datetime.datetime.strptime(time, "%Y-%m-%d %H:%M:%S")end_time = timestart_time = datetime.datetime.strptime("2015-01-01", "%Y-%m-%d")if end_time <= start_time:return Truereturn False# 开始分析
def analysis(name, codes, analysis_list):try:for code in codes:fund_df = gf.getFund(name, code, start_date='2014-01-01', end_date='2021-01-01')if fund_df is None:continueindex_min = fund_df.index.min()if not compareTime(index_min):continue# 平均值df_mean = fund_df['日增长率'].mean(axis=0)if df_mean <= 0:continue# 方差df_var = fund_df['日增长率'].var(axis=0)# 标准差df_td = fund_df['日增长率'].std(axis=0)# 按照自己方法计算排序 (方差*标准差/平均差²)df_calculate = df_var * df_td / np.square(df_mean)info = (code, df_mean, df_var, df_td, df_calculate)analysis_list.append(info)except Exception as e:print("analysis error: " + str(e))# 取基金代码数据
def getTheCode():codes_list = []codes = gd.getAllFundCode()codes_copies = len(codes) // 20for i in range(0, len(codes), codes_copies):codes_list.append(codes[i:i + codes_copies])return codes_list# 写日志
def writeDocument(data):base_dir = os.getcwd()file_name = os.path.join(base_dir, '', 'my_info.log')my_open = open(file_name, "a")my_open.write(str(data) + '\n')my_open.close()# 开始分析
def start():try:analysis_list = []threads = []# 获取代码列表codes_list = getTheCode()thread_number = 0for codes in codes_list:thread_number = thread_number + 1t = tr.Thread(target=analysis, args=("thread" + str(thread_number), codes, analysis_list))# t = myThread(thread_number, "analysis_thread" + str(thread_number), thread_number, codes, analysis_list)t.start()threads.append(t)# print("开始运行!")writeDocument("开始运行!")# 等待所有线程任务结束。for t in threads:t.join()# print("完成添加开始排序-------------")writeDocument("完成添加开始排序-------------")output_content = sorted(analysis_list, key=lambda x: (x[4]))# print("所有线程任务完成")for infos in output_content:writeDocument(infos)writeDocument("所有线程任务完成")except Exception as e:print("start error: " + str(e))

Python获取基金收益计算相关推荐

  1. getprofile()获取不到路径_做一款RPG游戏,几乎都会用到的Python坐标最短路径计算...

    角色扮演游戏(Role-playing game),简称为RPG,是游戏类型的一种.在游戏中,玩家负责扮演这个角色在一个写实或虚构世界中活动. 玩家负责扮演一个或多个角色,并在一个结构化规则下通过一些 ...

  2. python 获取一年中所有工作日列表来辅助计算工作时间内的时间差

    python 获取一年中所有工作日列表来辅助计算工作时间内的时间差 思路来源 扣除一年365天(时间区间可自定义)中的节假日和周日休息日,得到工作日列表dataset,方便计算工作日与工作日之间的工作 ...

  3. python获取股票数据,并计算技术指标

    python获取stock数据. 计算技术指标使用talib库. 方法一:使用 pandas_datareader.data 库,该库获取的历史数据更多一些.上证股票在股票代码后面加上".S ...

  4. 使用Python、OpenCV计算轮廓的中心

    1. 使用Python.OpenCV计算轮廓的中心并标记 2. 使用Python.OpenCV检测轮廓的形状并标记 3. 使用颜色通道统计信息来标记形状的实际颜色并标记 本博客的目标:(1)检测图像中 ...

  5. python获取系统时间月份_python 取数组绝对值python获取当前日期

    今天群里一个人问了怎么获取当前时间的问题,以前接触过计算日期之差的,具体代码如下: import datetime d1=datetime.datetime(2014,3,14) d2=datetim ...

  6. python的科学计算库有哪些_Python科学计算库-Numpy

    NumPy 是 Python 语言的一个扩充程序库.支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,也是学习 python 必学的一个库. 1. 读取文件 numpy.gen ...

  7. 使用Python进行科学计算:NumPy入门

    原创2016-08-07Jamal Moir编程派 编程派微信号:codingpy 本文由 Python 翻译组 最新翻译出品,原作者为 Jamal Moir,译者为 cystone,并由编程派作者  ...

  8. python统计字符在文件中出现的次数_python字符串中字符出现次数(python获取字符串个数)...

    今天要说的是Python的字符串函数还是很方便的,只需要调用 count() 方法即可. 最近,我在一个网站上看到了一个自然语言处理课程.我详细解释了一些方法的使用,用例很容易理解,所以我想通过我的博 ...

  9. 使用python装饰器计算函数运行时间的实例

    装饰器在python里面有很重要的作用, 如果能够熟练使用,将会大大的提高工作效率 今天就来见识一下 python 装饰器,到底是怎么工作的. 本文主要是利用python装饰器计算函数运行时间 一些需 ...

  10. python获取系统时间函数_Python常用时间操作总结【取得当前时间、时间函数、应用等】...

    本文实例讲述了Python常用时间操作.分享给大家供大家参考,具体如下: 我们先导入必须用到的一个module >>> import time 设置一个时间的格式,下面会用到 > ...

最新文章

  1. UCI机器学习数据集库
  2. C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(十八) 完美精灵之八面玲珑(WPF Only)②...
  3. linux下c md5函数
  4. Intellij IDEA 提交代码到远程GitHub仓库
  5. Spring Cloud Stream 体系及原理介绍
  6. hiredis(Synchronous API)
  7. CodeForces 7D Palindrome Degree 字符串hash
  8. java list作为参数传递_Java 程序将lambda表达式作为方法参数传递
  9. intelRealsense D435 python读取并显示彩图和深度图
  10. SAP License:ERP的价格管控
  11. java 面向对象 重载_Java方法重载
  12. 这届 360 公关不行
  13. 记一次进销存软件的破解(补充)
  14. Spring整合Quartz
  15. D.MADMAX 记忆化搜索 DAG
  16. 【预测模型】预测某地区未来 10-20 年按年龄划分的人口结构(PDE模型)
  17. OC 实现扫雷达扫描动画
  18. 十进制浮点数的表示方法
  19. [jzoj 4249] 【五校联考7day1】游戏 {贪心/斜率优化}
  20. 下一代个性化推荐系统

热门文章

  1. 搜狐新闻表情出现怪异现象
  2. win10 休眠不读u盘_如何解决win10识别不了U盘问题
  3. Guava base -- Joiner
  4. 一文读懂图像局部特征点检测算法!
  5. 9个设计师常用的高清图库 不敢配图? 这9个免版权图库牢记心中!
  6. 群晖套件 Transmission 汉化
  7. mysql数据库分享点滴
  8. 嵌入式方向的毕业生,找工作很迷茫
  9. 使用c语言编写词法分析程序,用C语言编写一个简单的词法分析程序
  10. 怎么重置计算机网络设置密码,怎么重新设置wifi密码_如何重新设置无线密码?-192路由网...