# -*- coding:utf-8 -*-
"""
@author:code37
@file:UnleverBeta.py
@time:2018/3/123:35
"""
import pandas as pd
import numpy as np
import tushare as ts
from factorset.factors import BaseFactor
from factorset.data.OtherData import code_to_symbol, shift_date
from factorset.data import CSVParser as cp
[docs]class TA2TL(BaseFactor):
"""
:名称: 资产负债比(百度百科),资产负债率(Debt Assets ratio)的倒数
:计算方法: 资产负债比 = 资产总额 / 负债总额
:应用: 资产所占的比重越大,企业的经营风险就比较低,但相对来说,企业的资金利用就不是太有效率。
"""
def __init__(self, factor_name='TA2TL', tickers='000016.SH', data_source='', factor_parameters={}, save_dir=None):
# Initialize super class.
super().__init__(factor_name=factor_name, tickers=tickers,
factor_parameters=factor_parameters,
data_source=data_source, save_dir=save_dir)
[docs] def prepare_data(self, begin_date, end_date):
"""
数据预处理
"""
# 获取财务数据:
# 资产负债比 = 总资产 / 公司债务总额
# TA2TL = totalAssets / totalLiabilities
# 117负债, 121资产
shifted_begin_date = shift_date(begin_date, 500)
ff = cp.concat_fund(self.data_source, self.tickers, 'BS').loc[shifted_begin_date:end_date,['ticker', 117, 121]]
# 这里以report date假定为announce date
ff['reportDate'] = ff.index
# 取出负债,资产总额数据
ff['TA2TL'] = ff[117] / ff[121]
ff.drop([117, 121], axis=1, inplace = True)
self.df = ff
[docs] def generate_factor(self, end_day):
"""
逐日生成因子数据
Parameters
-----------
end_day:
因子生产的日期
Returns
-----------
ret: pd.Series类型
indx为ticker,value为因子值
"""
df = self.df.loc[:end_day]
df.sort_index(ascending=False, inplace=True)
# 取最近的财报
df = df.groupby('ticker').apply(lambda x: x.head(1))
return df['TA2TL'].reset_index(level=1, drop=True).dropna()
if __name__ == '__main__':
# 设定要需要生成的因子数据范围
from_dt = '2017-06-15'
to_dt = '2018-03-09'
# 取沪深300
hs300 = ts.get_hs300s()
hs300.code = hs300.code.apply(code_to_symbol)
# 实例化因子
TA2TL = TA2TL(
factor_name='TA2TL',
factor_parameters={},
tickers=hs300.code.tolist(),
save_dir='',
data_source='D:\\idwzx\\project\\factorset\\data',
)
# 生成因子数据并入库
TA2TL.generate_factor_and_store(from_dt, to_dt)
print('因子构建完成,并已成功入库!')