def fetch_dupont_data(stocklist, start_year=2007, current_year=2020, current_quarter=4): bs.login() db_conn = create_engine(common.db_path_sqlalchemy) for code in stocklist["code"]: dupont_list = [] if code.startswith("sh.6") | code.startswith("sz.00") | code.startswith("sz.300"): for year in range(start_year, current_year + 1): start_quarter = 1 if year < current_year: end_quarter = 4 else: end_quarter = current_quarter - 1 for quarter in range(start_quarter, end_quarter + 1): # 查询季频估值指标盈利能力 print(code + ' dupont: ' + year.__str__() + 'Q' + quarter.__str__()) rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append([year, quarter] + rs_dupont.get_row_data()) if len(dupont_list) > 0: db_conn.execute(r'''INSERT OR REPLACE INTO stock_dupont_data VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)''', dupont_list) print(code + ' fetch dupont data finish and write database') bs.logout()
def get_dupont_data(stock_number,stock_name,year,quarter): print('==========================================================') print("开始进行: "+stock_name+"("+stock_number+")"+"的数据处理") print("尝试登陆baostock") #####login##### lg=bs.login(user_id="anonymous",password="******") if(lg.error_code == '0'): print("登陆成功") else: print("登录失败") #####get stock data##### rs=bs.query_dupont_data(code=stock_number,year=year,quarter=quarter) print('请求历史数据返回代码:'+rs.error_code) print('请求历史数据返回信息:'+rs.error_msg) data_list=[] while(rs.error_code=='0')&rs.next(): data_list.append(rs.get_row_data()) result=pd.DataFrame(data_list,columns=rs.fields) bs.logout() print(stock_name+"("+stock_number+")"+"的数据处理完成") print('==========================================================') return result
def queryDubpontByCode(code,year,quater): dupont_list = [] rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quater) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) return result_profit
def download(stockCode, yearList: list, fileName): #### 登陆系统 #### lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 查询季频估值指标盈利能力 operation_list = [] for year in yearList: for quarter in [1, 2, 3, 4]: rs_dupont = bs.query_dupont_data(code=stockCode, year=year, quarter=quarter) # rs_dupont = bs.query_dupont_data(code="sh.600000", year=2017, quarter=2) # rs_growth = bs.query_growth_data(code="sh.600000", year=2017, quarter=2) while (rs_dupont.error_code == '0') & rs_dupont.next(): operation_list.append(rs_dupont.get_row_data()) saveToCsv(operation_list, fileName) #### 登出系统 #### bs.logout()
def getROEQuery(stock, year, quarter): dupont_list = [] rs_dupont = bs.query_dupont_data(stock['code'], year, quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) return result_profit
def getquarterdata(companycode, year, quarter): profit_list = [] rs_profit = bs.query_profit_data(code=companycode, year=year, quarter=quarter) while (rs_profit.error_code == '0') & rs_profit.next(): profit_list.append(rs_profit.get_row_data()) if len(profit_list) == 0: return [], [] # 营运能力 operation_list = [] rs_operation = bs.query_operation_data(code=companycode, year=year, quarter=quarter) while (rs_operation.error_code == '0') & rs_operation.next(): operation_list.append(rs_operation.get_row_data()) # 成长能力 growth_list = [] rs_growth = bs.query_growth_data(code=companycode, year=year, quarter=quarter) while (rs_growth.error_code == '0') & rs_growth.next(): growth_list.append(rs_growth.get_row_data()) # 偿债能力 balance_list = [] rs_balance = bs.query_balance_data(code=companycode, year=year, quarter=quarter) while (rs_balance.error_code == '0') & rs_balance.next(): balance_list.append(rs_balance.get_row_data()) # 季频现金流量 cash_flow_list = [] rs_cash_flow = bs.query_cash_flow_data(code=companycode, year=year, quarter=quarter) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): cash_flow_list.append(rs_cash_flow.get_row_data()) # 查询杜邦指数 dupont_list = [] rs_dupont = bs.query_dupont_data(code=companycode, year=year, quarter=quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) if len(profit_list) * len(operation_list) * len(growth_list) * len( balance_list) * len(cash_flow_list) * len(dupont_list) == 0: return [], [] datalist = [companycode + "-" + year + "-" + quarter] datalist += profit_list[0] + operation_list[0] + growth_list[ 0] + balance_list[0] + cash_flow_list[0] + dupont_list[0] fieldslist = ["quaryContent"] fieldslist += rs_profit.fields + rs_operation.fields + rs_growth.fields + rs_balance.fields + rs_cash_flow.fields + rs_dupont.fields return datalist, fieldslist
def getROE(code="SH.600000", year=2015): rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=4) re = 0 try: re = rs_dupont.get_row_data()[3] re = round(float(re) * 100, 2) except: pass return re
def computeROE(code, year, quarter): # 查询杜邦指数 dupont_list = [] rs_dupont = bs.query_dupont_data(code, year, quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) # 打印输出 return result_profit
def dupont(code_n, year_n, quarter_n): dupont_list = [] rs_dupont = bs.query_dupont_data(code=code_n, year=year_n, quarter=quarter_n) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) # 打印输出 return result_profit
def get_dupont(code): dupont_list = [] for year in range(2000, 2020): for quarter in [4]: rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) return result_profit
def query_dupont_data(self, code, year = None, quarter = None): ''' code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空; year:统计年份,为空时默认当前年; quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。 ''' dupont_list = [] rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quarter) self.log('query_dupont_data respond error_msg:', rs_dupont) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) return result_profit
def query_dupont_data(self): """ 季频杜邦指数:query_dupont_data() 方法说明:查询季频杜邦指数信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。 返回类型:pandas的DataFrame类型。 """ all_stock = pd.read_csv(self.path + "all_stock.csv") all_stock.drop_duplicates(subset=['code'], keep='first', inplace=True) end_year = int(self.end_date[0:4]) quarter_list = [1, 2, 3, 4] # 登陆系统 lg = bs.login() # 显示登陆返回信息 #print('login respond error_code:'+lg.error_code) #print('login respond error_msg:'+lg.error_msg) # 查询杜邦指数 result_all = pd.DataFrame([]) for code in all_stock.code: # 查询季频估值指标盈利能力 year = int(self.start_date[0:4]) while (year <= end_year): for quarter in quarter_list: dupont_list = [] rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) result_all = result_all.append(result_profit) year = year + 1 # 打印输出 #print(result_profit) # 结果集输出到csv文件 dupont_data = pd.read_csv(self.path + "dupont_data.csv") result_all = result_all.append(dupont_data) result_all.drop_duplicates(subset=['code', 'pubDate', 'statDate'], keep='first', inplace=True) result_all.to_csv(self.path + "dupont_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout() return
def dupont(code, year, quarter): filename = "data/dupont_{}_{}_{}.csv".format(code, year, quarter) if os.path.exists(filename): # get from local result_profile = pd.read_csv(filename) else: # get from remote dupont_list = [] rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profile = pd.DataFrame(dupont_list, columns=rs_dupont.fields) result_profile.to_csv(filename, encoding="utf-8", index=False) return result_profile
def getFinDataFromBS(self, codes: list, year: int, quarter: int): #盈利能力 bs.login() for code in codes: ay = code.split(".") exchg = ay[0] rawcode = ay[1] bscode = '' if exchg == 'SSE': bscode = 'sh.' + rawcode else: bscode = 'sz.' + rawcode fdata = dict() fdata['code'] = code rs = bs.query_profit_data(bscode, year, quarter) fdata = recordToDict(rs, fdata) rs = bs.query_operation_data(bscode, year, quarter) fdata = recordToDict(rs, fdata) rs = bs.query_growth_data(bscode, year, quarter) fdata = recordToDict(rs, fdata) rs = bs.query_balance_data(bscode, year, quarter) fdata = recordToDict(rs, fdata) rs = bs.query_cash_flow_data(bscode, year, quarter) fdata = recordToDict(rs, fdata) rs = bs.query_dupont_data(bscode, year, quarter) fdata = recordToDict(rs, fdata) # rs = bs.query_performance_express_report(bscode, year, quarter) # fdata = recordToDict(rs, fdata) # rs = bs.query_forcast_report(bscode, year, quarter) # fdata = recordToDict(rs, fdata) bs.logout() return fdata
def get_dupont_data_year(stock_number,stock_name,start_year,end_year): print('==========================================================') print("开始进行: "+stock_name+"("+stock_number+")"+"的数据处理") print("尝试登陆baostock") data_list=[] lg=bs.login(user_id="anonymous",password="******") if(lg.error_code == '0'): print("登陆成功") else: print("登录失败") for y in range(int(start_year),int(end_year)+1): for q in range(1,5): #####get stock data##### rs=bs.query_dupont_data(code=stock_number,year=y,quarter=q) while(rs.error_code=='0')&rs.next(): data_list.append(rs.get_row_data()) result=pd.DataFrame(data_list,columns=rs.fields) bs.logout() print(stock_name+"("+stock_number+")"+"的数据处理完成") print('==========================================================') return result
def GetCurrentStockFundamentals(self, *args, **kwargs): post_data_code = CheckKeyOrAbort(kStockCodeKey, kwargs) profit_data_handler = bs.query_profit_data(post_data_code) profit_data = profit_data_handler.get_data() operation_data_handler = bs.query_operation_data(post_data_code) operation_data = operation_data_handler.get_data() growth_data_handler = bs.query_growth_data(post_data_code) growth_data = growth_data_handler.get_data() balance_data_handler = bs.query_balance_data(post_data_code) balance_data = balance_data_handler.get_data() cash_flow_data_handler = bs.query_balance_data(post_data_code) cash_flow_data = cash_flow_data_handler.get_data() dupont_data_handler = bs.query_dupont_data(post_data_code) dupont_data = dupont_data_handler.get_data() performance_data_handler = bs.query_performance_express_report( post_data_code) performance_data = performance_data_handler.get_data() forecast_data_handler = bs.query_forecast_report(post_data_code) forecast_data = forecast_data_handler.get_data() return profit_data, operation_data, growth_data, balance_data, cash_flow_data, dupont_data, performance_data, forecast_data
def query_dupont_data(code, year=None, quarter=None): """ 季频杜邦指数 方法说明:通过API接口获取季频杜邦指数信息,可以通过参数设置获取对应年份、季度数据,提供2007年至今数据。 返回类型:pandas的DataFrame类型。 参数含义: code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空; year:统计年份,为空时默认当前年; quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。 """ lg = bs.login() if lg.error_code != '0': logger.error('login respond error_msg:' + lg.error_msg) dupont_list = [] rs_dupont = bs.query_dupont_data(code=code, year=year, quarter=quarter) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) bs.logout() return result_profit
import baostock as bs import pandas as pd # 登陆系统 lg = bs.login() # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 查询杜邦指数 dupont_list = [] rs_dupont = bs.query_dupont_data(code="sz.000001", year=2019, quarter=2) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) # 打印输出 print(result_profit) # 结果集输出到csv文件 result_profit.to_csv("D:\\dupont_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout()
def getSeasonDataOneCode(i): import baostock as bs import pandas as pd # #### 登陆系统 #### # lg = bs.login() profit_list = [] growth_list = [] dupont_list = [] code = codeFormat(i) for j in range(2015, 2023): for k in range(1, 5): # 读取季度盈利 rs_profit = bs.query_profit_data(code=code, year=j, quarter=k) while (rs_profit.error_code == '0') & rs_profit.next(): profit_list.append(rs_profit.get_row_data()) # 读取季度成长 rs_growth = bs.query_growth_data(code=code, year=j, quarter=k) while (rs_growth.error_code == '0') & rs_growth.next(): growth_list.append(rs_growth.get_row_data()) # 读取杜邦分析 rs_dupont = bs.query_dupont_data(code=code, year=j, quarter=k) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) # 处理盈利分析 profit_list = profit_list[::-1] if profit_list != []: epsTTMArray = [i, "每股收益/epsTTM", dateSeasonFormat(profit_list[0][2])] # 每股收益 # roeAvgArray = [i, "净资产收益率/roeAvg",profit_list[0][2]] #净资产收益率 for x in profit_list: x[2] = dateSeasonFormat(x[2]) if x[7] != '': epsTTMArray.append(round(float(x[7]), 2)) else: epsTTMArray.append(0) # roeAvgArray.append(round(float(x[3]),2)) # 处理成长 growth_list = growth_list[::-1] yoyniArray = [ i, "净利润同比增长率G/yoyni", dateSeasonFormat(growth_list[0][2]) ] # 净利润同比增长率 for x in growth_list: x[2] = dateSeasonFormat(x[2]) if x[5] == '': yoyniArray.append('') else: yoyniArray.append(round(float(x[5]), 2)) # 处理杜邦分析 dupont_list = dupont_list[::-1] dupontROEArray = [ i, "净资产收益率/dupontROE", dateSeasonFormat(dupont_list[0][2]) ] # 杜邦表ROE,净资产收益率 dupontNitogrArray = [ i, "销售净利润率/dupontNitogr", dateSeasonFormat(dupont_list[0][2]) ] # 销售净利润率,净利润/营业总收入 dupontAssetTurnArray = [ i, "总资产周转率/dupontAssetTurn", dateSeasonFormat(dupont_list[0][2]) ] # 总资产周转率 dupontAssetStoEquityArray = [ i, "权益乘数/dupontAssetStoEquity", dateSeasonFormat(dupont_list[0][2]) ] # 权益乘数 for x in dupont_list: x[2] = dateSeasonFormat(x[2]) if x[3] == '': dupontROEArray.append('') else: dupontROEArray.append(round(float(x[3]), 3)) if x[7] == '': dupontNitogrArray.append('') else: dupontNitogrArray.append(round(float(x[7]), 2)) if x[5] == '': dupontAssetTurnArray.append('') else: dupontAssetTurnArray.append(round(float(x[5]), 2)) if x[4] == '': dupontAssetStoEquityArray.append('') else: dupontAssetStoEquityArray.append(round(float(x[4]), 2)) # 把数据聚合 # array.append(epsTTMArray) # array.append(yoyniArray) # array.append(dupontROEArray) # array.append(dupontNitogrArray) # array.append(dupontAssetTurnArray) # array.append(dupontAssetStoEquityArray) # bs.logout() return [ epsTTMArray, yoyniArray, dupontROEArray, dupontNitogrArray, dupontAssetTurnArray, dupontAssetStoEquityArray ] #### 登出系统 #### else: # bs.logout() return [[], [], [], [], [], []]
import baostock as bs import pandas as pd # 登陆系统 lg = bs.login(user_id="anonymous", password="******") # 显示登陆返回信息 print('login respond error_code:' + lg.error_code) print('login respond error_msg:' + lg.error_msg) # 查询杜邦指数 dupont_list = [] rs_dupont = bs.query_dupont_data(code="sh.600000", year=2017, quarter=2) while (rs_dupont.error_code == '0') & rs_dupont.next(): dupont_list.append(rs_dupont.get_row_data()) result_profit = pd.DataFrame(dupont_list, columns=rs_dupont.fields) # 打印输出 print(result_profit) # 结果集输出到csv文件 result_profit.to_csv("D:\\dupont_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout()
def quarter_dupont_data(self, code, year, quarter): self.getStockInstance() rs = bs.query_dupont_data(code, year, quarter) self._test_rs(rs) return rs