Skip to main content

factor model

Project description

This programme is built for back-testing factors.

Dependencies

  • python 3.5

  • pandas 0.23.0

  • numba 0.38.0

  • empyrical 0.5.0

  • data_box

  • pickle

  • multiprocessing

  • joblib

Logic

Basic definitions

  1. v_t,s_t,c_t: total value, stock value and cash value at time t after trading

  2. v^f_t,s^f_t,c^f_t: total value, stock value and cash value at time t before trading

  3. ss,sv: suspended stock value and valid stock value

  4. r_t: return at time t

  5. cost_t: cost to trade at time t

Note: s,ss,sv are all vectors while others are numbers

Equations

  1. v_t = |s_t| + c_t

  2. s^f_t = s_{t-1} * (1 + r_t) = ss^f_t + sv^f_t = ss_t + sv^f_t

  3. ss_t <- suspend, s^f_t

  4. c_{t-1} + |sv^f_t| = |sv_t| + c_t + cost_t ( where c_t, cost_t >= 0 )

  5. cost_t =|sv_t - sv^f_t| * costRate

  6. weight_t <- factor_{t-1},industry_t,suspend_t ( |weight_t| = 1 or 0 if there is no valid stocks or factors or industries)

  7. define cost^f_t = (2|sv^f_t| + c_{t-1}) * costRate s.t. cost^f_t >= cost_t, which is greater than the maximum cost we may have during the trade

  8. define available_value^f_t = c_{t-1} + |sv^f_t| - cost^f_t, which means the value ( = |sv_t| if weight_t != 0) we have in stocks after trading

  9. let sv_t = weight_t * available_value^f_t s.t. c_t = c_{t-1} + |sv^f_t| - |sv_t| - cost_t >=0

Thus to update v_t, we would start with calculating s^f_t, ss, sv^f_t, then cost^f_t, available_value^f_t, then sv_t, cost_t and c_t, and finally v_t

Example

Data Box: pre-process

from data_box import data_box
db=data_box()\
    .load_indestry(ind)\
    .load_indexWeight(ind_weight)\
    .calc_indweight()\
    .load_suspend(sus)\
    .load_adjPrice(price)\
    .add_factor('factor0',factor0)\
    .add_factor('factor1',factor1)\
    .set_lag(freq='d',day_lag=1)\
    .align_data()
# freq can be 'd' or 'm', for detail please refer to db.set_lag doc.

Where price,ind,ind_weight,sus,factor0,factor1 are all dataframes with index as date (yyyymmdd,int) and column as tickers. You can save and load this data box object by db.save('path') and db.load('path'). You can find more in data_box project.

Back Test

from single_factor_model import run_back_test

Single processor

Value,Turnover=run_back_test(data_box=db,back_end=None,n=5,out_path=None,double_side_cost=0.003)

Multi processors

Value,Turnover=run_back_test(data_box=db,back_end='loky',n=5,n_jobs=-1,out_path=None,verbose=50)

or

with __name__=='__main__':
    Value,Turnover=run_back_test(data_box=db,back_end='multiprocessing',n=5,n_jobs=-1,out_path=None)

To check detailed positions of each portfolio every day, just assign out_path.

Back test for specific industries

from single_factor_model import  run_back_test_by_industry
Value_list,Turnover_list=run_back_test_by_industry(db,industry_list=None,back_end='loky',n_jobs=-1,double_side_cost=0.003,verbose=50)

Summary and Plot

Calculate return including long short portfolio(and reverse)

from single_factor_model import calc_return
Return = calc_return(Value,Turnover,long_short=True,double_side_cost=0.003)

Summary

from single_factor_model import summary
S=summary(Return)

Plot

from single_factor_model import run_plot
run_plot(Return,show=True)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

single_factor_model-0.3.2.tar.gz (9.4 kB view details)

Uploaded Source

Built Distribution

single_factor_model-0.3.2-py3-none-any.whl (12.7 kB view details)

Uploaded Python 3

File details

Details for the file single_factor_model-0.3.2.tar.gz.

File metadata

  • Download URL: single_factor_model-0.3.2.tar.gz
  • Upload date:
  • Size: 9.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.14.2 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/3.5.5

File hashes

Hashes for single_factor_model-0.3.2.tar.gz
Algorithm Hash digest
SHA256 2fa46a605861d6d4d93808355c9a95c2d1459b6360e34523187e6c19d3ce94c0
MD5 4be616a5c684bb8faa2bc50cc1543413
BLAKE2b-256 d375c71269a2ca5648e9d800de4839db34d603507fbec51d42f7fc738bfe6c3f

See more details on using hashes here.

File details

Details for the file single_factor_model-0.3.2-py3-none-any.whl.

File metadata

  • Download URL: single_factor_model-0.3.2-py3-none-any.whl
  • Upload date:
  • Size: 12.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.11.0 pkginfo/1.4.2 requests/2.14.2 setuptools/40.2.0 requests-toolbelt/0.8.0 tqdm/4.23.4 CPython/3.5.5

File hashes

Hashes for single_factor_model-0.3.2-py3-none-any.whl
Algorithm Hash digest
SHA256 fd7d50fec54ccb2ca664f230f5ff9e2123460943883c5bcd9a2b6f895e506c4b
MD5 6e33762b5c38527d06dc509c763f4f6d
BLAKE2b-256 779a6ae258ca68b533e90d81f58c4d82e5cfecaeae64f4b1b9fb00064eaf079d

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page