Source code for factorset.factors.EP_LYR

# -*- coding:utf-8 -*-
"""
@author:code37
@file:EP_LYR.py
@time:2018/3/116:49
"""
import pandas as pd
import tushare as ts
from factorset.factors import BaseFactor
from factorset.data.OtherData import code_to_symbol, shift_date, market_value
from factorset.data import CSVParser as cp



[docs]class EP_LYR(BaseFactor): """ :名称: 静态市盈率的倒数;最近年报的市盈率的倒数 :计算方法: EP_LYR=净利润(不含少数股东权益)_最新年报/总市值 :应用: 市盈率越低,代表投资者能够以相对较低价格购入股票。 :注: 这里用的是市值,而不是价格,这种方法适合计算日度的数据,防止除权除息带来的价格扰动。 """ def __init__(self, factor_name='EP_LYR', tickers='000016.SH', data_source='', factor_parameters={}, save_dir=None): # Initialize super class. super(EP_LYR, self).__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): shifted_begin_date = shift_date(begin_date, 500) earings_df = cp.concat_fund(self.data_source, self.tickers, 'IS').loc[shifted_begin_date:end_date,['ticker', 40]] earings_df['motherNetProfit'] = earings_df[40] earings_df.drop(40, axis=1, inplace=True) earings_df['reportDate'] = earings_df.index earings_df['reportDate'] = earings_df['reportDate'].apply(lambda x: x.strftime("%Y-%m-%d")) # 仅仅取年报, 查找是否reportDate是否以12月31日结尾 self.earings_df = earings_df[earings_df['reportDate'].str.endswith('12-31')] # Tushare的市值数据只有17年-now df = market_value(self.data_source+'\\other\\otherdata.csv', self.tickers) self.mkt_value = df.drop(['price', 'totals'], axis=1)
[docs] def generate_factor(self, trading_day): earings_df = self.earings_df.loc[:trading_day] earings_df = earings_df.sort_values(by='reportDate', ascending=False) earings_df = earings_df.groupby('ticker').apply(lambda x: x.head(1)) # 取最近1年的财报 today_mkt_value = self.mkt_value.loc[trading_day] ret_df = earings_df.merge(today_mkt_value, on='ticker', how='inner') ret_df['EP_LYR'] = ret_df['motherNetProfit'] / (ret_df['mkt_value']) return ret_df.set_index('ticker')['EP_LYR']
if __name__ == '__main__': from_dt = '2017-07-15' to_dt = '2018-04-09' # 取沪深300 hs300 = ts.get_hs300s() hs300.code = hs300.code.apply(code_to_symbol) EP_LYR = EP_LYR( factor_name='EP_LYR', factor_parameters={}, tickers=hs300.code.tolist(), save_dir='', data_source='D:\\idwzx\\project\\factorset\\data', ) EP_LYR.generate_factor_and_store(from_dt, to_dt) print('因子构建完成,并已成功入库!')