Commit 4e86d506 authored by Dr.李's avatar Dr.李

added one more std step to factor analysis

parent 6a7a551c
...@@ -33,7 +33,7 @@ def factor_processing(raw_factors: np.ndarray, ...@@ -33,7 +33,7 @@ def factor_processing(raw_factors: np.ndarray,
if risk_factors is not None: if risk_factors is not None:
new_factors = neutralize(risk_factors, new_factors) new_factors = neutralize(risk_factors, new_factors)
return new_factors return standardize(new_factors)
def build_portfolio(er: np.ndarray, def build_portfolio(er: np.ndarray,
......
...@@ -174,13 +174,17 @@ if __name__ == '__main__': ...@@ -174,13 +174,17 @@ if __name__ == '__main__':
engine = SqlEngine(db_url) engine = SqlEngine(db_url)
ref_date = '2017-07-04' ref_date = '2017-07-04'
factors = engine.fetch_factors_meta()[['factor', 'source']]
factors['factor'] = factors.factor.str.strip()
factors['source'] = factors.source.str.strip()
import datetime as dt import datetime as dt
start = dt.datetime.now() start = dt.datetime.now()
for i in range(10): for i in range(1):
factors = engine.fetch_factors_meta() factors = engine.fetch_factors_meta()
codes = engine.fetch_codes('2017-07-04', universe) codes = engine.fetch_codes('2017-07-04', universe)
total_data = engine.fetch_data(ref_date, ['EPS', 'DROEAfterNonRecurring'], [1, 5], 905) total_data = engine.fetch_data(ref_date, factors.factor.tolist(), [1, 5], 905)
print(dt.datetime.now() - start) print(dt.datetime.now() - start)
......
# -*- coding: utf-8 -*-
"""
Created on 2017-7-10
@author: cheng.li
"""
import pandas as pd
from alphamind.analysis.factoranalysis import factor_analysis
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.universe import Universe
from alphamind.data.engines.sqlengine import risk_styles
from alphamind.data.engines.sqlengine import industry_styles
from PyFin.api import bizDatesList
engine = SqlEngine('mssql+pymssql://licheng:A12345678!@10.63.6.220/alpha')
universe = Universe('custom', ['zz500'])
total_risks = risk_styles + industry_styles
type = 'risk_neutral'
def calculate_one_day(ref_date, factors, weights):
print(ref_date)
codes = engine.fetch_codes(ref_date, universe)
total_data = engine.fetch_data(ref_date, factors, codes, 905)
factor_data = total_data['factor']
factor_df = factor_data[['Code', 'industry', 'd1', 'weight', 'isOpen'] + total_risks + factors].dropna()
weights, _ = factor_analysis(factor_df[factors],
weights,
factor_df.industry.values,
factor_df.d1.values,
detail_analysis=False,
benchmark=factor_df.weight.values,
risk_exp=factor_df[total_risks].values,
is_tradable=factor_df.isOpen.values,
method=type)
return ref_date, (weights.weight - factor_df.weight).dot(factor_df.d1)
if __name__ == '__main__':
from matplotlib import pyplot as plt
factors = ['EPS']#, 'FY12P', 'VAL', 'CFinc1', 'BDTO', 'RVOL']
weights = [1.]#, 1., 1., 1., 0.5, 0.5]
biz_dates = bizDatesList('china.sse', '2013-01-01', '2017-07-05')
ers = []
dates = []
for ref_date in biz_dates:
ref_date, er = calculate_one_day(ref_date, factors, weights)
dates.append(ref_date)
ers.append(er)
res = pd.Series(ers, index=dates)
res.cumsum().plot()
plt.show()
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment