def get_quarter_data(code,start='2019-01-01',end='2020-02-02'): start_year=start[:4] end_year=end[:4] cash_flow_list=[] profit_list = [] balance_list =[] growth_list = [] for year in range(int(start_year),int(end_year)): for quarter in range(1,5): if today[:4]>=str(year): # print(code,start, end) rs_cash_flow = bs.query_cash_flow_data(code=code, 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()) rs_profit = bs.query_profit_data(code=code, year=year, quarter=quarter)##盈利 while (rs_profit.error_code == '0') & rs_profit.next(): profit_list.append(rs_profit.get_row_data()) rs_balance = bs.query_balance_data(code=code, year=year, quarter=quarter) ##资产负债 while (rs_balance.error_code == '0') & rs_balance.next(): balance_list.append(rs_balance.get_row_data()) rs_growth = bs.query_growth_data(code=code, year=year, quarter=quarter) ##成长 while (rs_growth.error_code == '0') & rs_growth.next(): growth_list.append(rs_growth.get_row_data()) result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields) result_profit = pd.DataFrame(profit_list, columns=rs_profit.fields) result_balance = pd.DataFrame(balance_list, columns=rs_balance.fields) result_growth = pd.DataFrame(growth_list, columns=rs_growth.fields) return result_cash_flow,result_profit,result_balance,result_growth
def query_cash_flow_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) cash_flow_list = [] rs_cash_flow = bs.query_cash_flow_data(code=code, 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()) result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields) bs.logout() return result_cash_flow
def fetch_cash_flow_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"]: cash_flow_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 + ' cash_flow: ' + year.__str__() + 'Q' + quarter.__str__()) rs_cash_flow = bs.query_cash_flow_data(code=code, year=year, quarter=quarter) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): cash_flow_list.append([year, quarter] + rs_cash_flow.get_row_data()) if len(cash_flow_list) > 0: db_conn.execute(r'''INSERT OR REPLACE INTO stock_cash_flow_data VALUES (?,?,?,?,?,?,?,?,?,?,?,?)''', cash_flow_list) print(code + ' fetch cash_flow data finish and write database') bs.logout()
def get_cash_flow_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_cash_flow_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 queryCashFlowByCode(code,year,quater): list=[] data=query_cash_flow_data(code,year,quater) while (data.error_code == '0') & data.next(): list.append(data.get_row_data()) data = pd.DataFrame(list, columns=data.fields) return data
def query_cashflow(): # 接口提供的数据最早从2007年开始 lg = bs.login() shobjs = AStocksHeader.objects.all() #all() count = 0 start = time() for obj in shobjs: cash_flow_list = [] count += 1 print(count) for year in range(2007, 2020): for quarter in range(1, 5): if obj.stock_code.startswith('6'): rs_profit = bs.query_cash_flow_data(code="sh.{}".format( obj.stock_code), year=year, quarter=quarter) else: rs_profit = bs.query_cash_flow_data(code="sz.{}".format( obj.stock_code), year=year, quarter=quarter) while (rs_profit.error_code == '0') & rs_profit.next(): cash_flow_list.append(rs_profit.get_row_data()) result_profit = pd.DataFrame(cash_flow_list, columns=rs_profit.fields).values for item in result_profit: print(item) if any([ item[3], item[4], item[5], item[6], item[7], item[8], item[9] ]): ac = AStocksCashFlow() ac.stock = obj ac.pub_date = item[1] ac.stat_date = item[2] ac.cat_to_asset = float(item[3]) if item[3] else 0.0 ac.nca_to_asset = float(item[4]) if item[4] else 0.0 ac.tangible_asset_to_asset = float(item[5]) if item[5] else 0.0 ac.ebit_to_interest = float(item[6]) if item[6] else 0.0 ac.cfo_to_or = float(item[7]) if item[7] else 0.0 ac.cfo_to_np = float(item[8]) if item[8] else 0.0 ac.cfo_to_gr = float(item[9]) if item[9] else 0.0 ac.save() print('import finish, need time: ', time() - start) bs.logout()
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 query_cash_flow_data(self): """ 季频现金流量:query_cash_flow_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: cash_flow_list = [] rs_cash_flow = bs.query_cash_flow_data(code=code, 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()) result_cash_flow = pd.DataFrame( cash_flow_list, columns=rs_cash_flow.fields) result_all = result_all.append(result_cash_flow) year = year + 1 # 打印输出 #print(result_cash_flow) # 结果集输出到csv文件 cash_flow_data = pd.read_csv(self.path + "cash_flow_data.csv") result_all = result_all.append(cash_flow_data) result_all.drop_duplicates(subset=['code', 'pubDate', 'statDate'], keep='first', inplace=True) result_all.to_csv(self.path + "cash_flow_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout() return
def query_cash_flow_data(self, code, year = None, quarter = None): ''' code:股票代码,sh或sz.+6位数字代码,或者指数代码,如:sh.601398。sh:上海;sz:深圳。此参数不可为空; year:统计年份,为空时默认当前年; quarter:统计季度,为空时默认当前季度。不为空时只有4个取值:1,2,3,4。 ''' cash_flow_list = [] rs_cash_flow = bs.query_cash_flow_data(code=code, year=year, quarter=quarter) self.log('query_cash_flow_data respond error_msg:', rs_cash_flow) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): cash_flow_list.append(rs_cash_flow.get_row_data()) result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields) return result_cash_flow
def get_cash_flow_from_start_year(code, start_year: int): """ 获取指定年度到现在的1,2,3,4季度 """ data_list = [] for y in range(start_year, datetime.datetime.now().year + 1): for i in range(1, 5): rs = bs.query_cash_flow_data(get_type(code) + code, year=y, quarter=i) while (rs.error_code == '0') & rs.next(): d = {} r = rs.get_row_data() for k_i in range(len(r)): d[rs.fields[k_i]] = r[k_i] d['statDate'] = datetime.datetime.strptime(d['statDate'], '%Y-%m-%d') for k in d.keys(): if k not in ['code', 'pubDate', 'statDate']: d[k] = str_to_dec(d[k]) data_list.insert(0, d) return data_list
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_cash_flow_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_cash_flow_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 post(self, request): ''' quarter: 为空--"",默认查当前季度 ''' if request.body: msg = json.loads(request.body) # 查询季频估值指标盈利能力 profit_list = [] rs_profit = baostock.query_cash_flow_data(code=msg["code"], year=msg["year"], quarter=msg["quarter"]) while (rs_profit.error_code == '0') & rs_profit.next(): profit_list.append(rs_profit.get_row_data()) result_profit = pandas.DataFrame(profit_list, columns=rs_profit.fields) response = result_profit.to_json(orient="records") print(response) return HttpResponse(json.dumps(response)) else: result = {"code": -1, "msg": "fail"} return HttpResponse(result)
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_cash_flow = bs.query_cash_flow_data(code=stockCode, year=year, quarter=quarter) # rs_growth = bs.query_growth_data(code="sh.600000", year=2017, quarter=2) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): operation_list.append(rs_cash_flow.get_row_data()) saveToCsv(operation_list, fileName) #### 登出系统 #### bs.logout()
] count = 0 # 親數據 for code_item in code_item_list: for year in range(2019, 2020): for quarter in range(1, 5): code = code_item[1] + "." + code_item[0] cur_growth_sql = "select code,year,quarter from tdx.cash_flow where code='%s' and year='%d' and quarter='%d';" % ( code, year, quarter) # 查看数据库是否已有该数据 cur_cash_flow.execute(cur_growth_sql) findinfo = cur_cash_flow.fetchone() if findinfo is None: # 數據庫中還沒有該數據,寫入數據庫 rs_cash_flow = bs.query_cash_flow_data(code=code_item[1] + "." + code_item[0], year=year, quarter=quarter) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): growth_list = rs_cash_flow.get_row_data() insert_sql = "INSERT INTO cash_flow(" value_sql = "VALUES(" value_list = [] for index in range(len(growth_list)): if growth_list[index] != '': insert_sql += cash_flow_head[index] + ',' value_sql += "'%s'," value_list.append(growth_list[index]) insert_sql += 'year,quarter) '
def getCashFlow(id: str, yea: str = None, quarter: str = None): data = BaoStock.query_cash_flow_data(id, yea, quarter).get_data() return {getCashFlowMap[key][0]: getCashFlowMap[key][1](data.at[0, key]) for key in data.keys() if key in getCashFlowMap}
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) # 季频现金流量 cash_flow_list = [] rs_cash_flow = bs.query_cash_flow_data(code="sh.600000", year=2017, quarter=2) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): cash_flow_list.append(rs_cash_flow.get_row_data()) result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields) # 打印输出 print(result_cash_flow) # 结果集输出到csv文件 result_cash_flow.to_csv("D:\\cash_flow_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout()
continue print(stock_code) profit_list_1 = [] profit_list_2 = [] profit_list_3 = [] balance_list = [] cash_flow_list = [] operation_list = [] rs_profit_1 = bs.query_profit_data(code=stock_code, year=last_year_1, quarter=4) rs_profit_2 = bs.query_profit_data(code=stock_code, year=last_year_2, quarter=4) rs_profit_3 = bs.query_profit_data(code=stock_code, year=last_year_3, quarter=4) rs_balance = bs.query_balance_data(code=stock_code, year=assign_year, quarter=assign_quarter) rs_cash_flow = bs.query_cash_flow_data(code=stock_code, year=assign_year, quarter=assign_quarter) rs_operation = bs.query_operation_data(code=stock_code, year=assign_year, quarter=assign_quarter) while (rs_profit_1.error_code == '0') & rs_profit_1.next(): profit_list_1.append(rs_profit_1.get_row_data()) if rs_profit_2.cur_row_num != 0: profit_list_2.append(rs_profit_2.get_row_data()) if rs_profit_2.cur_row_num != 0: profit_list_3.append(rs_profit_3.get_row_data()) balance_list.append(rs_balance.get_row_data()) cash_flow_list.append(rs_cash_flow.get_row_data()) operation_list.append(rs_operation.get_row_data()) try: result_profit_1 = pd.DataFrame(profit_list_1, columns=rs_profit_1.fields) result_profit_2 = pd.DataFrame(profit_list_2, columns=rs_profit_2.fields) result_profit_3 = pd.DataFrame(profit_list_3, columns=rs_profit_3.fields)
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) # 季频现金流量 cash_flow_list = [] rs_cash_flow = bs.query_cash_flow_data(code="sz.000001", year=2019, quarter=2) while (rs_cash_flow.error_code == '0') & rs_cash_flow.next(): cash_flow_list.append(rs_cash_flow.get_row_data()) result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields) # 打印输出 print(result_cash_flow) # 结果集输出到csv文件 result_cash_flow.to_csv("D:\\cash_flow_data.csv", encoding="gbk", index=False) # 登出系统 bs.logout()
def quarter_cash_flow_data(self, code, year, quarter): self.getStockInstance() rs = bs.query_cash_flow_data(code, year, quarter) self._test_rs(rs) return rs