Commit cbce5327 authored by Dr.李's avatar Dr.李

FEATURE: added more engine stuff

parent e2228533
...@@ -5,4 +5,4 @@ Created on 2017-4-25 ...@@ -5,4 +5,4 @@ Created on 2017-4-25
@author: cheng.li @author: cheng.li
""" """
__version__ = "0.2.1" __version__ = "0.2.3"
...@@ -5,14 +5,14 @@ Created on 2017-8-16 ...@@ -5,14 +5,14 @@ Created on 2017-8-16
@author: cheng.li @author: cheng.li
""" """
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine import risk_styles
from alphamind.data.engines.sqlengine import industry_styles
from alphamind.data.engines.sqlengine import macro_styles
from alphamind.analysis.factoranalysis import er_portfolio_analysis from alphamind.analysis.factoranalysis import er_portfolio_analysis
from alphamind.analysis.factoranalysis import factor_analysis from alphamind.analysis.factoranalysis import factor_analysis
from alphamind.analysis.quantileanalysis import er_quantile_analysis from alphamind.analysis.quantileanalysis import er_quantile_analysis
from alphamind.analysis.quantileanalysis import quantile_analysis from alphamind.analysis.quantileanalysis import quantile_analysis
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine import industry_styles
from alphamind.data.engines.sqlengine import macro_styles
from alphamind.data.engines.sqlengine import risk_styles
from alphamind.data.engines.universe import Universe from alphamind.data.engines.universe import Universe
from alphamind.data.engines.utilities import industry_list from alphamind.data.engines.utilities import industry_list
from alphamind.data.neutralize import neutralize from alphamind.data.neutralize import neutralize
......
# -*- coding: utf-8 -*-
"""
Created on 2020-11-14
@author: cheng.li
"""
import os
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models.models_rl import Market
from alphamind.data.dbmodel.models.models_rl import Universe
from alphamind.data.dbmodel.models.models_rl import Industry
from alphamind.data.dbmodel.models.models_rl import RiskExposure
from alphamind.data.dbmodel.models.models_rl import RiskCovDay
from alphamind.data.dbmodel.models.models_rl import RiskCovShort
from alphamind.data.dbmodel.models.models_rl import RiskCovLong
from alphamind.data.dbmodel.models.models_rl import SpecificRiskDay
from alphamind.data.dbmodel.models.models_rl import SpecificRiskShort
from alphamind.data.dbmodel.models.models_rl import SpecificRiskLong
else:
from alphamind.data.dbmodel.models.models import Market
from alphamind.data.dbmodel.models.models import Universe
from alphamind.data.dbmodel.models.models import Industry
from alphamind.data.dbmodel.models.models import RiskExposure
from alphamind.data.dbmodel.models.models import RiskCovDay
from alphamind.data.dbmodel.models.models import RiskCovShort
from alphamind.data.dbmodel.models.models import RiskCovLong
from alphamind.data.dbmodel.models.models import SpecificRiskDay
from alphamind.data.dbmodel.models.models import SpecificRiskShort
from alphamind.data.dbmodel.models.models import SpecificRiskLong
from alphamind.data.dbmodel.models.models import FactorMaster
from alphamind.data.dbmodel.models.models import IndexComponent
from alphamind.data.dbmodel.models.models import IndexMarket
from alphamind.data.dbmodel.models.models import RiskMaster
...@@ -29,6 +29,7 @@ class _StkDailyPricePro(Base): ...@@ -29,6 +29,7 @@ class _StkDailyPricePro(Base):
trade_date = Column(Date) trade_date = Column(Date)
code = Column("security_code", Text) code = Column("security_code", Text)
chgPct = Column("change_pct", FLOAT) chgPct = Column("change_pct", FLOAT)
secShortName = Column("name", Text)
is_valid = Column(INT, nullable=False) is_valid = Column(INT, nullable=False)
flag = Column(INT, index=True, server_default=text("'1'")) flag = Column(INT, index=True, server_default=text("'1'"))
is_verify = Column(INT, index=True, server_default=text("'0'")) is_verify = Column(INT, index=True, server_default=text("'0'"))
......
# -*- coding: utf-8 -*-
"""
Created on 2020-11-14
@author: cheng.li
"""
import os
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.engines.sqlengine.sqlengine_rl import SqlEngine
from alphamind.data.engines.sqlengine.sqlengine_rl import total_risk_factors
from alphamind.data.engines.sqlengine.sqlengine_rl import industry_styles
from alphamind.data.engines.sqlengine.sqlengine_rl import risk_styles
from alphamind.data.engines.sqlengine.sqlengine_rl import macro_styles
else:
from alphamind.data.engines.sqlengine import SqlEngine
from alphamind.data.engines.sqlengine.sqlengine import total_risk_factors
from alphamind.data.engines.sqlengine.sqlengine import industry_styles
from alphamind.data.engines.sqlengine.sqlengine import risk_styles
from alphamind.data.engines.sqlengine.sqlengine import macro_styles
...@@ -20,14 +20,14 @@ from sqlalchemy.sql import func ...@@ -20,14 +20,14 @@ from sqlalchemy.sql import func
from PyFin.api import advanceDateByCalendar from PyFin.api import advanceDateByCalendar
from alphamind.data.dbmodel.models import FactorMaster from alphamind.data.dbmodel.models.models import FactorMaster
from alphamind.data.dbmodel.models import IndexComponent from alphamind.data.dbmodel.models.models import IndexComponent
from alphamind.data.dbmodel.models import IndexMarket from alphamind.data.dbmodel.models.models import IndexMarket
from alphamind.data.dbmodel.models import Industry from alphamind.data.dbmodel.models.models import Industry
from alphamind.data.dbmodel.models import Market from alphamind.data.dbmodel.models.models import Market
from alphamind.data.dbmodel.models import RiskExposure from alphamind.data.dbmodel.models.models import RiskExposure
from alphamind.data.dbmodel.models import RiskMaster from alphamind.data.dbmodel.models.models import RiskMaster
from alphamind.data.dbmodel.models import Universe as UniverseTable from alphamind.data.dbmodel.models.models import Universe as UniverseTable
from alphamind.data.engines.universe import Universe from alphamind.data.engines.universe import Universe
from alphamind.data.engines.utilities import factor_tables from alphamind.data.engines.utilities import factor_tables
from alphamind.data.engines.utilities import _map_factors from alphamind.data.engines.utilities import _map_factors
...@@ -37,6 +37,7 @@ from alphamind.data.processing import factor_processing ...@@ -37,6 +37,7 @@ from alphamind.data.processing import factor_processing
from alphamind.data.transformer import Transformer from alphamind.data.transformer import Transformer
from alphamind.portfolio.riskmodel import FactorRiskModel from alphamind.portfolio.riskmodel import FactorRiskModel
risk_styles = ['BETA', risk_styles = ['BETA',
'MOMENTUM', 'MOMENTUM',
'SIZE', 'SIZE',
......
...@@ -5,14 +5,11 @@ Created on 2020-10-11 ...@@ -5,14 +5,11 @@ Created on 2020-10-11
@author: cheng.li @author: cheng.li
""" """
import os
from typing import Dict
from typing import Iterable from typing import Iterable
from typing import List from typing import List
from typing import Tuple from typing import Tuple
from typing import Union from typing import Union
import numpy as np import numpy as np
import pandas as pd import pandas as pd
import sqlalchemy as sa import sqlalchemy as sa
...@@ -21,26 +18,25 @@ from sqlalchemy import ( ...@@ -21,26 +18,25 @@ from sqlalchemy import (
and_, and_,
join, join,
select, select,
outerjoin
) )
from PyFin.api import advanceDateByCalendar from PyFin.api import advanceDateByCalendar
from alphamind.data.dbmodel.models_rl import ( from alphamind.data.dbmodel.models.models_rl import (
Market, Market,
Industry, Industry,
RiskExposure RiskExposure,
Universe as UniverseTable
) )
from alphamind.data.engines.utilities import factor_tables
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl": from alphamind.data.engines.utilities import _map_factors
from alphamind.data.dbmodel.models_rl import Universe as UniverseTable
else:
from alphamind.data.dbmodel.models import Universe as UniverseTable
from alphamind.data.engines.universe import Universe from alphamind.data.engines.universe import Universe
from alphamind.data.processing import factor_processing from alphamind.data.processing import factor_processing
from alphamind.data.engines.utilities import _map_risk_model_table from alphamind.data.engines.utilities import _map_risk_model_table
from alphamind.portfolio.riskmodel import FactorRiskModel from alphamind.portfolio.riskmodel import FactorRiskModel
from alphamind.data.transformer import Transformer
risk_styles = ['BETA', risk_styles = ['BETA',
...@@ -214,6 +210,58 @@ class SqlEngine: ...@@ -214,6 +210,58 @@ class SqlEngine:
dates: Iterable[str] = None) -> pd.DataFrame: dates: Iterable[str] = None) -> pd.DataFrame:
return universe.query(self, start_date, end_date, dates) return universe.query(self, start_date, end_date, dates)
def fetch_factor(self,
ref_date: str,
factors: Iterable[object],
codes: Iterable[int],
warm_start: int = 0,
used_factor_tables=None) -> pd.DataFrame:
if isinstance(factors, Transformer):
transformer = factors
else:
transformer = Transformer(factors)
dependency = transformer.dependency
if used_factor_tables:
factor_cols = _map_factors(dependency, used_factor_tables)
else:
factor_cols = _map_factors(dependency, factor_tables)
start_date = advanceDateByCalendar('china.sse', ref_date, str(-warm_start) + 'b').strftime(
'%Y-%m-%d')
end_date = ref_date
big_table = Market
joined_tables = set()
joined_tables.add(Market.__table__.name)
for t in set(factor_cols.values()):
if t.__table__.name not in joined_tables:
big_table = outerjoin(big_table, t, and_(Market.trade_date == t.trade_date,
Market.code == t.code))
joined_tables.add(t.__table__.name)
query = select(
[Market.trade_date, Market.code.label("code"),
Market.chgPct.label("chgPct"),
Market.secShortName.label("secShortName")] + list(
factor_cols.keys())) \
.select_from(big_table).where(and_(Market.trade_date.between(start_date, end_date),
Market.code.in_(codes)))
df = pd.read_sql(query, self.engine) \
.replace([-np.inf, np.inf], np.nan) \
.sort_values(['trade_date', 'code']) \
.set_index('trade_date')
res = transformer.transform('code', df).replace([-np.inf, np.inf], np.nan)
res['chgPct'] = df.chgPct
res['secShortName'] = df['secShortName']
res = res.loc[ref_date:ref_date, :]
res.index = list(range(len(res)))
return res
def fetch_industry(self, def fetch_industry(self,
ref_date: str, ref_date: str,
codes: Iterable[int] = None, codes: Iterable[int] = None,
...@@ -405,6 +453,8 @@ if __name__ == "__main__": ...@@ -405,6 +453,8 @@ if __name__ == "__main__":
universe = Universe("hs300") universe = Universe("hs300")
start_date = '2020-09-29' start_date = '2020-09-29'
end_date = '2020-10-10' end_date = '2020-10-10'
df = sql_engine.fetch_factor("2020-02-21", factors=["BETA"], codes=["2010031963"])
print(df)
df = sql_engine.fetch_codes_range(start_date=start_date, end_date=end_date, universe=Universe("hs300")) df = sql_engine.fetch_codes_range(start_date=start_date, end_date=end_date, universe=Universe("hs300"))
print(df) print(df)
df = sql_engine.fetch_dx_return("2020-10-09", codes=["2010031963"]) df = sql_engine.fetch_dx_return("2020-10-09", codes=["2010031963"])
......
...@@ -7,7 +7,6 @@ Created on 2017-7-7 ...@@ -7,7 +7,6 @@ Created on 2017-7-7
import abc import abc
import sys import sys
import os
import pandas as pd import pandas as pd
from sqlalchemy import and_ from sqlalchemy import and_
...@@ -15,11 +14,7 @@ from sqlalchemy import not_ ...@@ -15,11 +14,7 @@ from sqlalchemy import not_
from sqlalchemy import or_ from sqlalchemy import or_
from sqlalchemy import select from sqlalchemy import select
from alphamind.data.dbmodel.models import Universe as UniverseTable
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl":
from alphamind.data.dbmodel.models_rl import Universe as UniverseTable
else:
from alphamind.data.dbmodel.models import Universe as UniverseTable
class BaseUniverse(metaclass=abc.ABCMeta): class BaseUniverse(metaclass=abc.ABCMeta):
......
...@@ -9,34 +9,16 @@ import os ...@@ -9,34 +9,16 @@ import os
from typing import Dict from typing import Dict
from typing import Iterable from typing import Iterable
if "DB_VENDOR" in os.environ and os.environ["DB_VENDOR"].lower() == "rl": from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import Categories from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import Market from alphamind.data.dbmodel.models import RiskCovLong
from alphamind.data.dbmodel.models_rl import RiskCovDay from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models_rl import RiskCovLong from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models_rl import RiskCovShort from alphamind.data.dbmodel.models import SpecificRiskDay
from alphamind.data.dbmodel.models_rl import RiskExposure from alphamind.data.dbmodel.models import SpecificRiskLong
from alphamind.data.dbmodel.models_rl import SpecificRiskDay from alphamind.data.dbmodel.models import SpecificRiskShort
from alphamind.data.dbmodel.models_rl import SpecificRiskLong from alphamind.data.engines.industries import INDUSTRY_MAPPING
from alphamind.data.dbmodel.models_rl import SpecificRiskShort factor_tables = [Market, RiskExposure]
from alphamind.data.dbmodel.models import Uqer
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories]
else:
from alphamind.data.dbmodel.models import Categories
from alphamind.data.dbmodel.models import Market
from alphamind.data.dbmodel.models import RiskCovDay
from alphamind.data.dbmodel.models import RiskCovLong
from alphamind.data.dbmodel.models import RiskCovShort
from alphamind.data.dbmodel.models import RiskExposure
from alphamind.data.dbmodel.models import SpecificRiskDay
from alphamind.data.dbmodel.models import SpecificRiskLong
from alphamind.data.dbmodel.models import SpecificRiskShort
from alphamind.data.dbmodel.models import Uqer
from alphamind.data.engines.industries import INDUSTRY_MAPPING
factor_tables = [Market, RiskExposure, Uqer, Categories]
def _map_risk_model_table(risk_model: str) -> tuple: def _map_risk_model_table(risk_model: str) -> tuple:
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -61,7 +61,7 @@ ...@@ -61,7 +61,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -96,7 +96,7 @@ ...@@ -96,7 +96,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 22, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -230,7 +230,7 @@ ...@@ -230,7 +230,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 23, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -239,497 +239,26 @@ ...@@ -239,497 +239,26 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 24, "execution_count": 6,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "ename": "AttributeError",
"output_type": "stream", "evalue": "'SqlEngine' object has no attribute 'fetch_dx_return_index_range'",
"text": [ "output_type": "error",
"2019-02-10 00:15:34,154 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n", "traceback": [
"2019-02-10 00:15:34,160 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n", "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
"2019-02-10 00:15:34,162 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n", "\u001B[1;31mAttributeError\u001B[0m Traceback (most recent call last)",
"2019-02-10 00:15:34,196 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n", "\u001B[1;32m<ipython-input-6-994dd70dbf6c>\u001B[0m in \u001B[0;36m<module>\u001B[1;34m\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[1;31m# %%time\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 2\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 3\u001B[1;33m \u001B[0mres1\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[0mworker_func_positive\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mfactor\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mfactor\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mfactors\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 4\u001B[0m \u001B[0mres2\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[0mworker_func_negative\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mfactor\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mfactor\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mfactors\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 5\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
"2019-02-10 00:15:34,206 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n", "\u001B[1;32m<ipython-input-6-994dd70dbf6c>\u001B[0m in \u001B[0;36m<listcomp>\u001B[1;34m(.0)\u001B[0m\n\u001B[0;32m 1\u001B[0m \u001B[1;31m# %%time\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 2\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m----> 3\u001B[1;33m \u001B[0mres1\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[0mworker_func_positive\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mfactor\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mfactor\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mfactors\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 4\u001B[0m \u001B[0mres2\u001B[0m \u001B[1;33m=\u001B[0m \u001B[1;33m[\u001B[0m\u001B[0mworker_func_negative\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mfactor\u001B[0m\u001B[1;33m)\u001B[0m \u001B[1;32mfor\u001B[0m \u001B[0mfactor\u001B[0m \u001B[1;32min\u001B[0m \u001B[0mfactors\u001B[0m\u001B[1;33m]\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 5\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
"2019-02-10 00:15:34,213 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n", "\u001B[1;32m<ipython-input-4-e6c1eb1a5c2b>\u001B[0m in \u001B[0;36mworker_func_positive\u001B[1;34m(factor_name)\u001B[0m\n\u001B[0;32m 118\u001B[0m \u001B[1;32mfrom\u001B[0m \u001B[0malphamind\u001B[0m\u001B[1;33m.\u001B[0m\u001B[0mapi\u001B[0m \u001B[1;32mimport\u001B[0m \u001B[0mSqlEngine\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 119\u001B[0m \u001B[0mengine\u001B[0m \u001B[1;33m=\u001B[0m \u001B[0mSqlEngine\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mdata_source\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[1;32m--> 120\u001B[1;33m \u001B[1;32mreturn\u001B[0m \u001B[0mfactor_analysis\u001B[0m\u001B[1;33m(\u001B[0m\u001B[0mengine\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mfactor_name\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0muniverse\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mbenchmark_code\u001B[0m\u001B[1;33m,\u001B[0m \u001B[0mpositive\u001B[0m\u001B[1;33m=\u001B[0m\u001B[1;32mTrue\u001B[0m\u001B[1;33m)\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0m\u001B[0;32m 121\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 122\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
"2019-02-10 00:15:34,217 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n", "\u001B[1;32m<ipython-input-4-e6c1eb1a5c2b>\u001B[0m in \u001B[0;36mfactor_analysis\u001B[1;34m(engine, factor_name, universe, benchmark_code, positive)\u001B[0m\n\u001B[0;32m 4\u001B[0m \u001B[0mData\u001B[0m \u001B[0mphase\u001B[0m\u001B[1;33m\u001B[0m\u001B[1;33m\u001B[0m\u001B[0m\n\u001B[0;32m 5\u001B[0m \"\"\"\n\u001B[1;32m----> 6\u001B[1;33m index_return = engine.fetch_dx_return_index_range(benchmark_code, start_date, end_date, horizon=horizon,\n\u001B[0m\u001B[0;32m 7\u001B[0m offset=1).set_index('trade_date')\n\u001B[0;32m 8\u001B[0m \u001B[1;33m\u001B[0m\u001B[0m\n",
"2019-02-10 00:15:34,249 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n", "\u001B[1;31mAttributeError\u001B[0m: 'SqlEngine' object has no attribute 'fetch_dx_return_index_range'"
"2019-02-10 00:15:34,258 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:15:34,266 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,269 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,302 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:15:34,310 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:15:34,320 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,323 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,353 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:15:34,361 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:15:34,368 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,370 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,401 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:15:34,412 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:15:34,422 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,425 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,463 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:15:34,471 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:15:34,476 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,480 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,511 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:15:34,521 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:15:34,527 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,531 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,559 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:15:34,568 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:15:34,574 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,576 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,608 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:15:34,618 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:15:34,624 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,627 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,659 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:15:34,669 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:15:34,676 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,678 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,707 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:15:34,717 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:15:34,723 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,725 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,755 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:15:34,766 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:15:34,773 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,775 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,806 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:15:34,817 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:15:34,824 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,828 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,859 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:15:34,870 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:15:34,878 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,881 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,912 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:15:34,921 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:15:34,928 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,931 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2019-02-10 00:15:34,959 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:15:34,969 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:15:34,975 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:34,978 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,008 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:15:35,018 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:15:35,025 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,029 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,058 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:15:35,068 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:15:35,075 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,079 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,108 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:15:35,118 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:15:35,125 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,129 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,158 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:15:35,170 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:15:35,177 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,180 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,209 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:15:35,218 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:15:35,225 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,228 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,257 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:15:35,267 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:15:35,274 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,277 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,305 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:15:35,315 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 800\n",
"2019-02-10 00:15:35,323 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,325 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:15:35,351 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:15:35,360 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 800\n",
"2019-02-10 00:15:35,366 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,370 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,401 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:15:35,410 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 800\n",
"2019-02-10 00:15:35,419 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,421 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,448 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:15:35,457 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 800\n",
"2019-02-10 00:15:35,465 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,468 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,497 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:15:35,505 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 800\n",
"2019-02-10 00:15:35,510 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:35,513 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:35,543 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2019-02-10 00:15:50,965 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:15:50,973 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:50,977 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,012 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:15:51,021 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:15:51,028 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,030 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,060 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:15:51,069 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:15:51,076 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,079 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,107 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:15:51,115 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:15:51,122 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,124 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,158 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:15:51,167 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:15:51,173 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,177 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,208 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:15:51,217 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:15:51,222 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,225 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,255 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:15:51,264 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:15:51,270 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,273 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,305 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:15:51,314 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:15:51,320 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,323 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,353 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:15:51,360 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:15:51,366 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,369 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,397 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:15:51,406 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:15:51,413 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,416 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,449 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:15:51,459 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:15:51,465 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,467 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,499 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:15:51,508 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:15:51,514 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,516 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,545 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:15:51,554 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:15:51,560 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,564 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,594 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:15:51,603 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:15:51,608 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,611 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,641 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:15:51,649 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:15:51,656 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,659 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,689 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:15:51,699 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:15:51,706 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,708 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,736 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:15:51,745 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:15:51,750 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,753 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,782 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:15:51,792 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:15:51,798 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,800 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,831 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:15:51,841 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:15:51,848 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,850 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,883 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:15:51,893 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:15:51,900 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,904 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:15:51,933 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:15:51,944 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:15:51,949 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:51,951 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:15:51,983 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:15:51,993 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:15:51,998 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,000 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,028 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:15:52,037 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:15:52,044 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,046 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,072 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:15:52,082 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 799\n",
"2019-02-10 00:15:52,088 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,091 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,118 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:15:52,128 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 799\n",
"2019-02-10 00:15:52,134 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,138 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,166 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:15:52,175 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 799\n",
"2019-02-10 00:15:52,181 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,183 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,213 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:15:52,223 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 799\n",
"2019-02-10 00:15:52,229 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,231 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,259 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:15:52,268 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 799\n",
"2019-02-10 00:15:52,275 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:15:52,277 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:15:52,305 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:02,488 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:16:02,494 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,497 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,532 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:16:02,540 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:16:02,548 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,551 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,588 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:16:02,597 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:16:02,603 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,606 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,635 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:02,644 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:16:02,651 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,654 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,685 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:16:02,694 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:16:02,701 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,704 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,735 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:16:02,744 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:16:02,751 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,753 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,783 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:16:02,791 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:16:02,799 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,801 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,834 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:16:02,842 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:16:02,849 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,852 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,883 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:16:02,892 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:16:02,899 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,902 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,932 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:16:02,940 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:16:02,948 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,950 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:16:02,981 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:16:02,989 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:16:02,996 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:02,999 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,028 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:16:03,039 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:16:03,048 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,051 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,086 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:16:03,101 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:16:03,108 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,110 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,153 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:16:03,161 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:16:03,169 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,171 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,206 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:16:03,215 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:16:03,221 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,224 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,252 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:16:03,260 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:16:03,267 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,270 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:16:03,296 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:16:03,306 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:16:03,311 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,315 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,343 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:16:03,354 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:16:03,359 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,363 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,395 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:16:03,406 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:16:03,412 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,416 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,443 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:16:03,454 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:16:03,459 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,462 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,491 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:16:03,502 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:16:03,508 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,510 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,541 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:16:03,551 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:16:03,557 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,559 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,586 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:16:03,596 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:16:03,603 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,605 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,632 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:16:03,642 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 800\n",
"2019-02-10 00:16:03,650 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,653 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,681 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:16:03,690 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 800\n",
"2019-02-10 00:16:03,696 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,698 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,726 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:16:03,736 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 800\n",
"2019-02-10 00:16:03,742 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,745 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,774 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:16:03,784 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 800\n",
"2019-02-10 00:16:03,790 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,792 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,821 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:16:03,831 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 800\n",
"2019-02-10 00:16:03,837 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:03,839 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:03,869 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:12,133 - ALPHA_MIND - INFO - 2017-01-03 00:00:00: 800\n",
"2019-02-10 00:16:12,139 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,141 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,171 - ALPHA_MIND - INFO - 2017-01-03 00:00:00 is finished\n",
"2019-02-10 00:16:12,180 - ALPHA_MIND - INFO - 2017-01-17 00:00:00: 800\n",
"2019-02-10 00:16:12,186 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,188 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,220 - ALPHA_MIND - INFO - 2017-01-17 00:00:00 is finished\n",
"2019-02-10 00:16:12,231 - ALPHA_MIND - INFO - 2017-02-07 00:00:00: 800\n",
"2019-02-10 00:16:12,237 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,240 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,269 - ALPHA_MIND - INFO - 2017-02-07 00:00:00 is finished\n",
"2019-02-10 00:16:12,280 - ALPHA_MIND - INFO - 2017-02-21 00:00:00: 799\n",
"2019-02-10 00:16:12,287 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,289 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,324 - ALPHA_MIND - INFO - 2017-02-21 00:00:00 is finished\n",
"2019-02-10 00:16:12,333 - ALPHA_MIND - INFO - 2017-03-07 00:00:00: 800\n",
"2019-02-10 00:16:12,341 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,344 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,374 - ALPHA_MIND - INFO - 2017-03-07 00:00:00 is finished\n",
"2019-02-10 00:16:12,384 - ALPHA_MIND - INFO - 2017-03-21 00:00:00: 800\n",
"2019-02-10 00:16:12,391 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,394 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,423 - ALPHA_MIND - INFO - 2017-03-21 00:00:00 is finished\n",
"2019-02-10 00:16:12,434 - ALPHA_MIND - INFO - 2017-04-06 00:00:00: 800\n",
"2019-02-10 00:16:12,441 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,444 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,472 - ALPHA_MIND - INFO - 2017-04-06 00:00:00 is finished\n",
"2019-02-10 00:16:12,483 - ALPHA_MIND - INFO - 2017-04-20 00:00:00: 800\n",
"2019-02-10 00:16:12,488 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,492 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,522 - ALPHA_MIND - INFO - 2017-04-20 00:00:00 is finished\n",
"2019-02-10 00:16:12,531 - ALPHA_MIND - INFO - 2017-05-05 00:00:00: 800\n",
"2019-02-10 00:16:12,538 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,541 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,569 - ALPHA_MIND - INFO - 2017-05-05 00:00:00 is finished\n",
"2019-02-10 00:16:12,579 - ALPHA_MIND - INFO - 2017-05-19 00:00:00: 800\n",
"2019-02-10 00:16:12,586 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,588 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,615 - ALPHA_MIND - INFO - 2017-05-19 00:00:00 is finished\n",
"2019-02-10 00:16:12,625 - ALPHA_MIND - INFO - 2017-06-06 00:00:00: 800\n",
"2019-02-10 00:16:12,631 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,634 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,663 - ALPHA_MIND - INFO - 2017-06-06 00:00:00 is finished\n",
"2019-02-10 00:16:12,672 - ALPHA_MIND - INFO - 2017-06-20 00:00:00: 800\n",
"2019-02-10 00:16:12,680 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,682 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 full re-balance\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"2019-02-10 00:16:12,713 - ALPHA_MIND - INFO - 2017-06-20 00:00:00 is finished\n",
"2019-02-10 00:16:12,722 - ALPHA_MIND - INFO - 2017-07-04 00:00:00: 800\n",
"2019-02-10 00:16:12,728 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,731 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,761 - ALPHA_MIND - INFO - 2017-07-04 00:00:00 is finished\n",
"2019-02-10 00:16:12,771 - ALPHA_MIND - INFO - 2017-07-18 00:00:00: 800\n",
"2019-02-10 00:16:12,778 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,780 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,809 - ALPHA_MIND - INFO - 2017-07-18 00:00:00 is finished\n",
"2019-02-10 00:16:12,818 - ALPHA_MIND - INFO - 2017-08-01 00:00:00: 800\n",
"2019-02-10 00:16:12,823 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,826 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,855 - ALPHA_MIND - INFO - 2017-08-01 00:00:00 is finished\n",
"2019-02-10 00:16:12,865 - ALPHA_MIND - INFO - 2017-08-15 00:00:00: 800\n",
"2019-02-10 00:16:12,870 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,872 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,900 - ALPHA_MIND - INFO - 2017-08-15 00:00:00 is finished\n",
"2019-02-10 00:16:12,909 - ALPHA_MIND - INFO - 2017-08-29 00:00:00: 800\n",
"2019-02-10 00:16:12,915 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,917 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,945 - ALPHA_MIND - INFO - 2017-08-29 00:00:00 is finished\n",
"2019-02-10 00:16:12,953 - ALPHA_MIND - INFO - 2017-09-12 00:00:00: 800\n",
"2019-02-10 00:16:12,960 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:12,963 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:12,989 - ALPHA_MIND - INFO - 2017-09-12 00:00:00 is finished\n",
"2019-02-10 00:16:12,997 - ALPHA_MIND - INFO - 2017-09-26 00:00:00: 800\n",
"2019-02-10 00:16:13,003 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,005 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,035 - ALPHA_MIND - INFO - 2017-09-26 00:00:00 is finished\n",
"2019-02-10 00:16:13,045 - ALPHA_MIND - INFO - 2017-10-17 00:00:00: 800\n",
"2019-02-10 00:16:13,051 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,053 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,080 - ALPHA_MIND - INFO - 2017-10-17 00:00:00 is finished\n",
"2019-02-10 00:16:13,088 - ALPHA_MIND - INFO - 2017-10-31 00:00:00: 800\n",
"2019-02-10 00:16:13,094 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,097 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,127 - ALPHA_MIND - INFO - 2017-10-31 00:00:00 is finished\n",
"2019-02-10 00:16:13,136 - ALPHA_MIND - INFO - 2017-11-14 00:00:00: 800\n",
"2019-02-10 00:16:13,141 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,143 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,171 - ALPHA_MIND - INFO - 2017-11-14 00:00:00 is finished\n",
"2019-02-10 00:16:13,181 - ALPHA_MIND - INFO - 2017-11-28 00:00:00: 800\n",
"2019-02-10 00:16:13,186 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,188 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,216 - ALPHA_MIND - INFO - 2017-11-28 00:00:00 is finished\n",
"2019-02-10 00:16:13,226 - ALPHA_MIND - INFO - 2017-12-12 00:00:00: 799\n",
"2019-02-10 00:16:13,232 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,234 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,260 - ALPHA_MIND - INFO - 2017-12-12 00:00:00 is finished\n",
"2019-02-10 00:16:13,269 - ALPHA_MIND - INFO - 2017-12-26 00:00:00: 799\n",
"2019-02-10 00:16:13,275 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,276 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,307 - ALPHA_MIND - INFO - 2017-12-26 00:00:00 is finished\n",
"2019-02-10 00:16:13,315 - ALPHA_MIND - INFO - 2018-01-10 00:00:00: 799\n",
"2019-02-10 00:16:13,322 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,325 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,353 - ALPHA_MIND - INFO - 2018-01-10 00:00:00 is finished\n",
"2019-02-10 00:16:13,362 - ALPHA_MIND - INFO - 2018-01-24 00:00:00: 799\n",
"2019-02-10 00:16:13,369 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,370 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,409 - ALPHA_MIND - INFO - 2018-01-24 00:00:00 is finished\n",
"2019-02-10 00:16:13,417 - ALPHA_MIND - INFO - 2018-02-07 00:00:00: 799\n",
"2019-02-10 00:16:13,424 - ALPHA_MIND - WARNING - winsorize_normal normally should not be done after neutralize\n",
"2019-02-10 00:16:13,427 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 full re-balance\n",
"2019-02-10 00:16:13,453 - ALPHA_MIND - INFO - 2018-02-07 00:00:00 is finished\n"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 47.5 s\n"
] ]
} }
], ],
"source": [ "source": [
"%%time\n", "# %%time\n",
"\n", "\n",
"res1 = [worker_func_positive(factor) for factor in factors]\n", "res1 = [worker_func_positive(factor) for factor in factors]\n",
"res2 = [worker_func_negative(factor) for factor in factors]\n", "res2 = [worker_func_negative(factor) for factor in factors]\n",
...@@ -748,7 +277,7 @@ ...@@ -748,7 +277,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 25, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -761,7 +290,7 @@ ...@@ -761,7 +290,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 26, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -782,9 +311,9 @@ ...@@ -782,9 +311,9 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python [conda env:alpha-mind]",
"language": "python", "language": "python",
"name": "python3" "name": "conda-env-alpha-mind-py"
}, },
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
...@@ -796,7 +325,7 @@ ...@@ -796,7 +325,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.8" "version": "3.7.9"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
...@@ -829,5 +358,5 @@ ...@@ -829,5 +358,5 @@
} }
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 2 "nbformat_minor": 4
} }
\ No newline at end of file
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 1,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -32,9 +32,21 @@ ...@@ -32,9 +32,21 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 2,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [
{
"ename": "AttributeError",
"evalue": "'SqlEngine' object has no attribute 'fetch_factor'",
"output_type": "error",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-2-f6a26cae2a7b>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[0mrisk_cov\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_exposure\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_risk_model\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mfactor\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_factor\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;34m'EPS'\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mtotal_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mmerge\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfactor\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mrisk_exposure\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mon\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m'code'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdropna\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'SqlEngine' object has no attribute 'fetch_factor'"
]
}
],
"source": [ "source": [
"risk_penlty = 0.5\n", "risk_penlty = 0.5\n",
"ref_date = '2018-02-08'\n", "ref_date = '2018-02-08'\n",
...@@ -59,7 +71,7 @@ ...@@ -59,7 +71,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -79,17 +91,9 @@ ...@@ -79,17 +91,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"name": "stdout",
"output_type": "stream",
"text": [
"Wall time: 2.99 ms\n"
]
}
],
"source": [ "source": [
"%%time\n", "%%time\n",
"w = Variable(n)\n", "w = Variable(n)\n",
...@@ -109,53 +113,19 @@ ...@@ -109,53 +113,19 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 12, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "ename": "NameError",
"output_type": "stream", "evalue": "name 'prob' is not defined",
"text": [ "output_type": "error",
"-----------------------------------------------------------------\n", "traceback": [
" OSQP v0.4.1 - Operator Splitting QP Solver\n", "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
" (c) Bartolomeo Stellato, Goran Banjac\n", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
" University of Oxford - Stanford University 2018\n", "\u001b[1;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
"-----------------------------------------------------------------\n", "\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
"problem: variables n = 439, constraints m = 640\n",
" nnz(P) + nnz(A) = 4419\n",
"settings: linear system solver = qdldl,\n",
" eps_abs = 1.0e-03, eps_rel = 1.0e-03,\n",
" eps_prim_inf = 1.0e-04, eps_dual_inf = 1.0e-04,\n",
" rho = 1.00e-01 (adaptive),\n",
" sigma = 1.00e-06, alpha = 1.60, max_iter = 4000\n",
" check_termination: on (interval 25),\n",
" scaling: on, scaled_termination: off\n",
" warm start: on, polish: on\n",
"\n",
"iter objective pri res dua res rho time\n",
" 1 -6.4413e+01 5.65e+00 6.37e+02 1.00e-01 1.36e-03s\n",
" 200 -2.4008e+00 4.49e-06 1.89e-03 1.55e+00 5.62e-03s\n",
"plsh -2.4003e+00 5.55e-16 1.37e-14 --------- 6.38e-03s\n",
"\n",
"status: solved\n",
"solution polish: successful\n",
"number of iterations: 200\n",
"optimal objective: -2.4003\n",
"run time: 6.38e-03s\n",
"optimal rho estimate: 2.29e-01\n",
"\n",
"Wall time: 29.9 ms\n"
] ]
},
{
"data": {
"text/plain": [
"-2.4003282365506444"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
} }
], ],
"source": [ "source": [
...@@ -165,18 +135,19 @@ ...@@ -165,18 +135,19 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 13, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"data": { "ename": "NameError",
"text/plain": [ "evalue": "name 'prob' is not defined",
"('optimal', -2.4003282365506444)" "output_type": "error",
] "traceback": [
}, "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"execution_count": 13, "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"metadata": {}, "\u001b[1;32m<ipython-input-4-10ee360ecec6>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[1;32m----> 1\u001b[1;33m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstatus\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mprob\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mvalue\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"output_type": "execute_result" "\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
]
} }
], ],
"source": [ "source": [
...@@ -185,45 +156,19 @@ ...@@ -185,45 +156,19 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 14, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "ename": "NameError",
"output_type": "stream", "evalue": "name 'prob' is not defined",
"text": [ "output_type": "error",
"\n", "traceback": [
"ECOS 2.0.7 - (C) embotech GmbH, Zurich Switzerland, 2012-15. Web: www.embotech.com/ECOS\n", "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\n", "\u001b[1;31mNameError\u001b[0m Traceback (most recent call last)",
"It pcost dcost gap pres dres k/t mu step sigma IR | BT\n", "\u001b[1;32m<timed eval>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n",
" 0 -3.332e-01 -1.048e+02 +2e+03 9e-01 1e-02 1e+00 5e+00 --- --- 1 1 - | - - \n", "\u001b[1;31mNameError\u001b[0m: name 'prob' is not defined"
" 1 -3.461e-01 -1.811e+01 +1e+03 2e-01 2e-03 8e-01 3e+00 0.5430 3e-01 1 1 1 | 0 0\n",
" 2 -2.875e+00 -4.039e+00 +2e+02 1e-02 9e-05 9e-02 4e-01 0.9297 6e-02 1 1 1 | 0 0\n",
" 3 -2.573e+00 -2.939e+00 +5e+01 5e-03 3e-05 3e-02 1e-01 0.7733 9e-02 1 1 2 | 0 0\n",
" 4 -2.449e+00 -2.553e+00 +1e+01 1e-03 8e-06 6e-03 3e-02 0.7708 6e-02 1 1 1 | 0 0\n",
" 5 -2.407e+00 -2.418e+00 +2e+00 1e-04 9e-07 6e-04 4e-03 0.9066 2e-02 1 1 1 | 0 0\n",
" 6 -2.402e+00 -2.404e+00 +3e-01 3e-05 2e-07 1e-04 7e-04 0.8248 1e-02 1 1 2 | 0 0\n",
" 7 -2.401e+00 -2.401e+00 +6e-02 6e-06 4e-08 9e-06 2e-04 0.9466 2e-01 2 2 2 | 0 0\n",
" 8 -2.400e+00 -2.400e+00 +5e-03 4e-07 3e-09 7e-07 1e-05 0.9237 1e-03 1 1 1 | 0 0\n",
" 9 -2.400e+00 -2.400e+00 +2e-04 2e-08 1e-10 2e-08 5e-07 0.9890 3e-02 1 1 1 | 0 0\n",
"10 -2.400e+00 -2.400e+00 +2e-06 2e-10 1e-12 2e-10 5e-09 0.9890 1e-04 1 1 1 | 0 0\n",
"11 -2.400e+00 -2.400e+00 +2e-08 2e-12 1e-14 2e-12 6e-11 0.9890 1e-04 2 1 1 | 0 0\n",
"\n",
"OPTIMAL (within feastol=2.2e-12, reltol=9.8e-09, abstol=2.4e-08).\n",
"Runtime: 0.011237 seconds.\n",
"\n",
"Wall time: 32.9 ms\n"
] ]
},
{
"data": {
"text/plain": [
"-2.400328236659518"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
} }
], ],
"source": [ "source": [
...@@ -531,9 +476,9 @@ ...@@ -531,9 +476,9 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python [conda env:alpha-mind]",
"language": "python", "language": "python",
"name": "python3" "name": "conda-env-alpha-mind-py"
}, },
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
...@@ -545,7 +490,7 @@ ...@@ -545,7 +490,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.8" "version": "3.7.9"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
...@@ -578,5 +523,5 @@ ...@@ -578,5 +523,5 @@
} }
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 2 "nbformat_minor": 4
} }
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
{ {
"data": { "data": {
"text/plain": [ "text/plain": [
"datetime.datetime(2019, 2, 10, 0, 16, 56, 354078)" "datetime.datetime(2020, 11, 14, 15, 58, 13, 404266)"
] ]
}, },
"execution_count": 1, "execution_count": 1,
...@@ -64,7 +64,7 @@ ...@@ -64,7 +64,7 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 8, "execution_count": 3,
"metadata": {}, "metadata": {},
"outputs": [], "outputs": [],
"source": [ "source": [
...@@ -96,129 +96,45 @@ ...@@ -96,129 +96,45 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 9, "execution_count": 4,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stdout", "ename": "AttributeError",
"output_type": "stream", "evalue": "'SqlEngine' object has no attribute 'fetch_factor_range'",
"text": [ "output_type": "error",
"Wall time: 1min 9s\n" "traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-4-fe9f95d31cfa>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# %%time\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mpredicts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mpredict_worker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrftime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'%Y-%m-%d'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mref_dates\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-4-fe9f95d31cfa>\u001b[0m in \u001b[0;36m<listcomp>\u001b[1;34m(.0)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;31m# %%time\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mpredicts\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[0mpredict_worker\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0md\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mstrftime\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;34m'%Y-%m-%d'\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0md\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mref_dates\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m",
"\u001b[1;32m<ipython-input-3-4e15561bc4f5>\u001b[0m in \u001b[0;36mpredict_worker\u001b[1;34m(params)\u001b[0m\n\u001b[0;32m 21\u001b[0m data_source=data_source)\n\u001b[0;32m 22\u001b[0m \u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodel\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mparams\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m---> 23\u001b[1;33m \u001b[0mer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0m_\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredict_by_model\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mmodel\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdata_meta\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 24\u001b[0m \u001b[1;32mreturn\u001b[0m \u001b[0mer\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\composer.py\u001b[0m in \u001b[0;36mpredict_by_model\u001b[1;34m(ref_date, alpha_model, data_meta, x_values, codes)\u001b[0m\n\u001b[0;32m 165\u001b[0m codes: Iterable[int] = None):\n\u001b[0;32m 166\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mx_values\u001b[0m \u001b[1;32mis\u001b[0m \u001b[1;32mNone\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 167\u001b[1;33m \u001b[0mpredict_data\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mdata_meta\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_predict_data\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mref_date\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha_model\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 168\u001b[0m \u001b[0mcodes\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mx_values\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpredict_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'predict'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'code'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mpredict_data\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'predict'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;34m'x'\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 169\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\composer.py\u001b[0m in \u001b[0;36mfetch_predict_data\u001b[1;34m(self, ref_date, alpha_model)\u001b[0m\n\u001b[0;32m 140\u001b[0m \u001b[0mself\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mwarm_start\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 141\u001b[0m \u001b[0mfillna\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;32mTrue\u001b[0m\u001b[1;33m,\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 142\u001b[1;33m fit_target=alpha_model.fit_target)\n\u001b[0m\u001b[0;32m 143\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 144\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32mD:\\ProgramData\\Anaconda3\\envs\\alpha-mind\\lib\\site-packages\\alpha_mind-0.2.3-py3.7-win-amd64.egg\\alphamind\\model\\data_preparing.py\u001b[0m in \u001b[0;36mfetch_predict_phase\u001b[1;34m(engine, alpha_factors, ref_date, frequency, universe, batch, neutralized_risk, risk_model, pre_process, post_process, warm_start, fillna, fit_target)\u001b[0m\n\u001b[0;32m 406\u001b[0m \u001b[0mhorizon\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mmap_freq\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mfrequency\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 407\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m--> 408\u001b[1;33m \u001b[0mfactor_df\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_factor_range\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muniverse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mfactors\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mtransformer\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mdates\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 409\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 410\u001b[0m \u001b[1;32mif\u001b[0m \u001b[0mfillna\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mAttributeError\u001b[0m: 'SqlEngine' object has no attribute 'fetch_factor_range'"
] ]
} }
], ],
"source": [ "source": [
"%%time\n", "# %%time\n",
"predicts = [predict_worker((d.strftime('%Y-%m-%d'), alpha_model)) for d in ref_dates]" "predicts = [predict_worker((d.strftime('%Y-%m-%d'), alpha_model)) for d in ref_dates]"
] ]
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 10, "execution_count": 5,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [
{ {
"name": "stderr", "ename": "AttributeError",
"output_type": "stream", "evalue": "'SqlEngine' object has no attribute 'fetch_industry_matrix_range'",
"text": [ "output_type": "error",
"2019-02-10 00:19:34,241 - ALPHA_MIND - INFO - 2017-04-10 full re-balance: 500\n", "traceback": [
"2019-02-10 00:19:34,503 - ALPHA_MIND - INFO - 2017-04-10 is finished\n", "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m",
"2019-02-10 00:19:34,508 - ALPHA_MIND - INFO - 2017-04-17 full re-balance: 500\n", "\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)",
"2019-02-10 00:19:34,796 - ALPHA_MIND - INFO - 2017-04-17 is finished\n", "\u001b[1;32m<ipython-input-5-33f95fe45d6f>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[0mindustry_names\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mindustry_list\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mindustry_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mindustry_level\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 2\u001b[1;33m \u001b[0mindustry_total\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mengine\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mfetch_industry_matrix_range\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0muniverse\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdates\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mref_dates\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcategory\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mindustry_name\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlevel\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mindustry_level\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 3\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 4\u001b[0m \u001b[0mprevious_pos\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mDataFrame\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[0mrets\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;33m[\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"2019-02-10 00:19:34,802 - ALPHA_MIND - INFO - 2017-04-24 full re-balance: 500\n", "\u001b[1;31mAttributeError\u001b[0m: 'SqlEngine' object has no attribute 'fetch_industry_matrix_range'"
"2019-02-10 00:19:35,044 - ALPHA_MIND - INFO - 2017-04-24 is finished\n",
"2019-02-10 00:19:35,057 - ALPHA_MIND - INFO - 2017-05-02 full re-balance: 500\n",
"2019-02-10 00:19:35,288 - ALPHA_MIND - INFO - 2017-05-02 is finished\n",
"2019-02-10 00:19:35,301 - ALPHA_MIND - INFO - 2017-05-09 full re-balance: 500\n",
"2019-02-10 00:19:35,561 - ALPHA_MIND - INFO - 2017-05-09 is finished\n",
"2019-02-10 00:19:35,578 - ALPHA_MIND - INFO - 2017-05-16 full re-balance: 500\n",
"2019-02-10 00:19:35,839 - ALPHA_MIND - INFO - 2017-05-16 is finished\n",
"2019-02-10 00:19:35,849 - ALPHA_MIND - INFO - 2017-05-23 full re-balance: 500\n",
"2019-02-10 00:19:36,085 - ALPHA_MIND - INFO - 2017-05-23 is finished\n",
"2019-02-10 00:19:36,091 - ALPHA_MIND - INFO - 2017-06-01 full re-balance: 500\n",
"2019-02-10 00:19:36,356 - ALPHA_MIND - INFO - 2017-06-01 is finished\n",
"2019-02-10 00:19:36,362 - ALPHA_MIND - INFO - 2017-06-08 full re-balance: 500\n",
"2019-02-10 00:19:36,620 - ALPHA_MIND - INFO - 2017-06-08 is finished\n",
"2019-02-10 00:19:36,625 - ALPHA_MIND - INFO - 2017-06-15 full re-balance: 500\n",
"2019-02-10 00:19:36,866 - ALPHA_MIND - INFO - 2017-06-15 is finished\n",
"2019-02-10 00:19:36,873 - ALPHA_MIND - INFO - 2017-06-22 full re-balance: 500\n",
"2019-02-10 00:19:37,103 - ALPHA_MIND - INFO - 2017-06-22 is finished\n",
"2019-02-10 00:19:37,110 - ALPHA_MIND - INFO - 2017-06-29 full re-balance: 500\n",
"2019-02-10 00:19:37,404 - ALPHA_MIND - INFO - 2017-06-29 is finished\n",
"2019-02-10 00:19:37,412 - ALPHA_MIND - INFO - 2017-07-06 full re-balance: 500\n",
"2019-02-10 00:19:37,630 - ALPHA_MIND - INFO - 2017-07-06 is finished\n",
"2019-02-10 00:19:37,635 - ALPHA_MIND - INFO - 2017-07-13 full re-balance: 500\n",
"2019-02-10 00:19:37,858 - ALPHA_MIND - INFO - 2017-07-13 is finished\n",
"2019-02-10 00:19:37,866 - ALPHA_MIND - INFO - 2017-07-20 full re-balance: 500\n",
"2019-02-10 00:19:38,127 - ALPHA_MIND - INFO - 2017-07-20 is finished\n",
"2019-02-10 00:19:38,132 - ALPHA_MIND - INFO - 2017-07-27 full re-balance: 500\n",
"2019-02-10 00:19:38,421 - ALPHA_MIND - INFO - 2017-07-27 is finished\n",
"2019-02-10 00:19:38,428 - ALPHA_MIND - INFO - 2017-08-03 full re-balance: 500\n",
"2019-02-10 00:19:38,692 - ALPHA_MIND - INFO - 2017-08-03 is finished\n",
"2019-02-10 00:19:38,699 - ALPHA_MIND - INFO - 2017-08-10 full re-balance: 500\n",
"2019-02-10 00:19:38,937 - ALPHA_MIND - INFO - 2017-08-10 is finished\n",
"2019-02-10 00:19:38,942 - ALPHA_MIND - INFO - 2017-08-17 full re-balance: 500\n",
"2019-02-10 00:19:39,171 - ALPHA_MIND - INFO - 2017-08-17 is finished\n",
"2019-02-10 00:19:39,176 - ALPHA_MIND - INFO - 2017-08-24 full re-balance: 500\n",
"2019-02-10 00:19:39,410 - ALPHA_MIND - INFO - 2017-08-24 is finished\n",
"2019-02-10 00:19:39,417 - ALPHA_MIND - INFO - 2017-08-31 full re-balance: 500\n",
"2019-02-10 00:19:39,649 - ALPHA_MIND - INFO - 2017-08-31 is finished\n",
"2019-02-10 00:19:39,659 - ALPHA_MIND - INFO - 2017-09-07 full re-balance: 500\n",
"2019-02-10 00:19:39,985 - ALPHA_MIND - INFO - 2017-09-07 is finished\n",
"2019-02-10 00:19:39,993 - ALPHA_MIND - INFO - 2017-09-14 full re-balance: 500\n",
"2019-02-10 00:19:40,246 - ALPHA_MIND - INFO - 2017-09-14 is finished\n",
"2019-02-10 00:19:40,256 - ALPHA_MIND - INFO - 2017-09-21 full re-balance: 500\n",
"2019-02-10 00:19:40,573 - ALPHA_MIND - INFO - 2017-09-21 is finished\n",
"2019-02-10 00:19:40,578 - ALPHA_MIND - INFO - 2017-09-28 full re-balance: 500\n",
"2019-02-10 00:19:40,804 - ALPHA_MIND - INFO - 2017-09-28 is finished\n",
"2019-02-10 00:19:40,816 - ALPHA_MIND - INFO - 2017-10-12 full re-balance: 500\n",
"2019-02-10 00:19:41,057 - ALPHA_MIND - INFO - 2017-10-12 is finished\n",
"2019-02-10 00:19:41,068 - ALPHA_MIND - INFO - 2017-10-19 full re-balance: 500\n",
"2019-02-10 00:19:41,333 - ALPHA_MIND - INFO - 2017-10-19 is finished\n",
"2019-02-10 00:19:41,342 - ALPHA_MIND - INFO - 2017-10-26 full re-balance: 500\n",
"2019-02-10 00:19:41,571 - ALPHA_MIND - INFO - 2017-10-26 is finished\n",
"2019-02-10 00:19:41,579 - ALPHA_MIND - INFO - 2017-11-02 full re-balance: 500\n",
"2019-02-10 00:19:41,768 - ALPHA_MIND - INFO - 2017-11-02 is finished\n",
"2019-02-10 00:19:41,774 - ALPHA_MIND - INFO - 2017-11-09 full re-balance: 500\n",
"2019-02-10 00:19:41,988 - ALPHA_MIND - INFO - 2017-11-09 is finished\n",
"2019-02-10 00:19:41,993 - ALPHA_MIND - INFO - 2017-11-16 full re-balance: 500\n",
"2019-02-10 00:19:42,235 - ALPHA_MIND - INFO - 2017-11-16 is finished\n",
"2019-02-10 00:19:42,242 - ALPHA_MIND - INFO - 2017-11-23 full re-balance: 500\n",
"2019-02-10 00:19:42,534 - ALPHA_MIND - INFO - 2017-11-23 is finished\n",
"2019-02-10 00:19:42,538 - ALPHA_MIND - INFO - 2017-11-30 full re-balance: 500\n",
"2019-02-10 00:19:42,774 - ALPHA_MIND - INFO - 2017-11-30 is finished\n",
"2019-02-10 00:19:42,779 - ALPHA_MIND - INFO - 2017-12-07 full re-balance: 500\n",
"2019-02-10 00:19:43,045 - ALPHA_MIND - INFO - 2017-12-07 is finished\n",
"2019-02-10 00:19:43,053 - ALPHA_MIND - INFO - 2017-12-14 full re-balance: 500\n",
"2019-02-10 00:19:43,274 - ALPHA_MIND - INFO - 2017-12-14 is finished\n",
"2019-02-10 00:19:43,283 - ALPHA_MIND - INFO - 2017-12-21 full re-balance: 500\n",
"2019-02-10 00:19:43,547 - ALPHA_MIND - INFO - 2017-12-21 is finished\n",
"2019-02-10 00:19:43,559 - ALPHA_MIND - INFO - 2017-12-28 full re-balance: 500\n",
"2019-02-10 00:19:43,798 - ALPHA_MIND - INFO - 2017-12-28 is finished\n",
"2019-02-10 00:19:43,805 - ALPHA_MIND - INFO - 2018-01-05 full re-balance: 500\n",
"2019-02-10 00:19:44,058 - ALPHA_MIND - INFO - 2018-01-05 is finished\n",
"2019-02-10 00:19:44,067 - ALPHA_MIND - INFO - 2018-01-12 full re-balance: 500\n",
"2019-02-10 00:19:44,310 - ALPHA_MIND - INFO - 2018-01-12 is finished\n",
"2019-02-10 00:19:44,320 - ALPHA_MIND - INFO - 2018-01-19 full re-balance: 500\n",
"2019-02-10 00:19:44,578 - ALPHA_MIND - INFO - 2018-01-19 is finished\n",
"2019-02-10 00:19:44,588 - ALPHA_MIND - INFO - 2018-01-26 full re-balance: 500\n",
"2019-02-10 00:19:44,855 - ALPHA_MIND - INFO - 2018-01-26 is finished\n",
"2019-02-10 00:19:44,860 - ALPHA_MIND - INFO - 2018-02-02 full re-balance: 500\n",
"2019-02-10 00:19:45,116 - ALPHA_MIND - INFO - 2018-02-02 is finished\n",
"2019-02-10 00:19:45,123 - ALPHA_MIND - INFO - 2018-02-09 full re-balance: 500\n",
"2019-02-10 00:19:45,380 - ALPHA_MIND - INFO - 2018-02-09 is finished\n",
"2019-02-10 00:19:45,391 - ALPHA_MIND - INFO - 2018-02-23 full re-balance: 500\n",
"2019-02-10 00:19:45,660 - ALPHA_MIND - INFO - 2018-02-23 is finished\n",
"2019-02-10 00:19:45,666 - ALPHA_MIND - INFO - 2018-03-02 full re-balance: 500\n",
"2019-02-10 00:19:45,890 - ALPHA_MIND - INFO - 2018-03-02 is finished\n",
"2019-02-10 00:19:45,898 - ALPHA_MIND - INFO - 2018-03-09 full re-balance: 500\n",
"2019-02-10 00:19:46,126 - ALPHA_MIND - INFO - 2018-03-09 is finished\n",
"2019-02-10 00:19:46,136 - ALPHA_MIND - INFO - 2018-03-16 full re-balance: 500\n",
"2019-02-10 00:19:46,352 - ALPHA_MIND - INFO - 2018-03-16 is finished\n",
"2019-02-10 00:19:46,363 - ALPHA_MIND - INFO - 2018-03-23 full re-balance: 500\n",
"2019-02-10 00:19:46,630 - ALPHA_MIND - INFO - 2018-03-23 is finished\n",
"2019-02-10 00:19:46,642 - ALPHA_MIND - INFO - 2018-03-30 full re-balance: 500\n",
"2019-02-10 00:19:46,885 - ALPHA_MIND - INFO - 2018-03-30 is finished\n"
] ]
} }
], ],
...@@ -270,32 +186,9 @@ ...@@ -270,32 +186,9 @@
}, },
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": 11, "execution_count": null,
"metadata": {}, "metadata": {},
"outputs": [ "outputs": [],
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x1ef2b939e48>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [ "source": [
"ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)\n", "ret_df = pd.DataFrame({'returns': rets, 'turn_over': turn_overs, 'leverage': leverags}, index=ref_dates)\n",
"ret_df.loc[advanceDateByCalendar('china.sse', ref_dates[-1], freq)] = 0.\n", "ret_df.loc[advanceDateByCalendar('china.sse', ref_dates[-1], freq)] = 0.\n",
...@@ -308,6 +201,13 @@ ...@@ -308,6 +201,13 @@
" secondary_y='tc_cost')" " secondary_y='tc_cost')"
] ]
}, },
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{ {
"cell_type": "code", "cell_type": "code",
"execution_count": null, "execution_count": null,
...@@ -318,9 +218,9 @@ ...@@ -318,9 +218,9 @@
], ],
"metadata": { "metadata": {
"kernelspec": { "kernelspec": {
"display_name": "Python 3", "display_name": "Python [conda env:alpha-mind]",
"language": "python", "language": "python",
"name": "python3" "name": "conda-env-alpha-mind-py"
}, },
"language_info": { "language_info": {
"codemirror_mode": { "codemirror_mode": {
...@@ -332,7 +232,7 @@ ...@@ -332,7 +232,7 @@
"name": "python", "name": "python",
"nbconvert_exporter": "python", "nbconvert_exporter": "python",
"pygments_lexer": "ipython3", "pygments_lexer": "ipython3",
"version": "3.6.8" "version": "3.7.9"
}, },
"varInspector": { "varInspector": {
"cols": { "cols": {
...@@ -365,5 +265,5 @@ ...@@ -365,5 +265,5 @@
} }
}, },
"nbformat": 4, "nbformat": 4,
"nbformat_minor": 2 "nbformat_minor": 4
} }
arrow == 0.16.0 arrow
cython == 0.29.21 cython
cvxpy == 1.1.5 cvxpy
cvxopt == 1.2.5 cvxopt
deprecated == 1.2.10 deprecated
ecos == 2.0.7.post1 ecos
jupyter == 1.0.0 jupyter
jupyterlab == 2.2.6 jupyterlab
matplotlib == 3.3.1 matplotlib
numba == 0.51.1 numba
numpy == 1.19.1 numpy
pandas == 1.1.1 pandas
psycopg2-binary == 2.8.5 psycopg2-binary
scikit-learn ==0.23.2 scikit-learn
scipy == 1.5.2 scipy
simpleutils == 0.2.6 simpleutils
sqlalchemy == 1.3.19 sqlalchemy
xgboost == 1.2.0 xgboost
\ No newline at end of file \ No newline at end of file
...@@ -14,7 +14,7 @@ from Cython.Build import cythonize ...@@ -14,7 +14,7 @@ from Cython.Build import cythonize
from distutils.extension import Extension from distutils.extension import Extension
import numpy as np import numpy as np
VERSION = "0.2.1" VERSION = "0.2.3"
if platform.system() != "Windows": if platform.system() != "Windows":
import multiprocessing import multiprocessing
......
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