{ "info": { "author": "Yili Peng", "author_email": "yili_peng@outlook.com", "bugtrack_url": null, "classifiers": [], "description": "This programme is used for statistical arbitrage with co integation\nmethod\n\nDependencies\n~~~~~~~~~~~~\n\n- python 3.5\n- pandas 0.22.0\n- spyder 3.2.8\n- joblib 0.12.3\n- RNWS 0.1.2\n- mini_exchange 0.0.7\n\nSample\n~~~~~~\n\nBack Test\n---------\n\nCalculate p_value of stationarity among all pairs along all history\n\n.. code:: bash\n\n import pandas as pd\n from CointArbitrage.pairing_period import find_pair,filter_tickers\n\n price=pd.read('price.csv') # index:yyyymmdd(int),columns:tickers,values:adjusted price\n\n past_date=60 # use last 60 days to calculate p_value\n P=[]\n for i in range(past_date,price.shape[0]):\n # filter unavailable tickers, this step is optional\n df=filter_tickers(price.iloc[(i-past_date):i])\n # calculate p_value\n des=find_pair(df,mul=True,n_jobs=-1)\n dt=filter_tickers.index[i]\n P.append(pd.Series(des.p_value.values,index=des['ticker1'].str.cat(des['ticker2'],'|').values,name=dt))\n pairs=pd.concat(P,axis=1).T \n\nMake signal dataframe\n\n.. code:: bash\n\n from CointArbitrage.trading_period import zscore_log_w,zscore_w,sig,sig_cut_tail\n window=20 # use 20 days to calculate zscore ( = normalize(stockPrice1/stockPrice2))\n ratio,zs=zscore_w(price_df=price,pair_lst=pairs.columns,window=window)\n # or use log zscore = normalize(log(stockPrice1/stockPrice2))\n ratio,zs=zscore_log_w(price_df=price,pair_lst=pairs.columns,window=window)\n # or use exponential moving to calculate zscore with function zscore_df and zscore_log_df\n\n # generate signal\n # k0: close position, int, float or pd.Series if need to specify different values for each pairs\n # k1: open position\n # k2: close out position\n k0,k1,k2=1,2,4\n sig_df=sig(zscore=zs,k0=k0,k1=k1,k2=k2)\n # sig_df contains value Nan,-3,-2,-1,0,1,2,3 \n # 3(-3) means close position and open another position in different direction\n # 2(-2) means close position\n # 1(-1) means open position\n # keep signal when stationary (i.e. p_val<0.1), others would be kept in Nan\n # and add a new signal 4(-4), which means reaching the end of stationarity period\n sig_result=sig_cut_tail(sig_df,pairs<0.1,n_jobs=-1,new_signal=4)\n\nSimulate trade\n\n::\n\n from CointArbitrage.trading_period import Trade\n start=20140101\n end=20180101\n TT=Trade(price,start=start,end=end)\n user_name='user01'\n TT.add_user(user_name,sig_result,start_amount=1000)\n # add signal 4 as close signal \n # and leave close status as -1 (default close status is 0)\n # more reference can be found in mini_exchange package\n TT.add_close_signal(4,close_status=-1)\n TT.add_close_signal(-4,close_status=-1)\n # trade 10 dollars when opening position each time\n uad=pd.DataFrame({'user_name':[user_name],'amt_type':0,'value':10})\n TT.trade(uad)\n print(TT.summary())\n # to analysis in detail, get the account info and position info of user01\n account,position=TT.get_user(user_name)\n # more details can be found in mini_exchange package\n account.plot_history(by_pct=True)\n account.annual_return()\n account.draw_down()\n account.romad()\n position.win_rate(dual=True)\n position.log\n # plot one pair\n pair='0001.HK|0002.HK'\n TT.plot_trade_pair(user_name,pair,k0=k0,k1=k1,k2=k2,window=window)\n\nInstant simulation in HK market with Wind Api\n---------------------------------------------\n\nFind New Pair\n\n.. code:: bash\n\n # initialize\n from CointArbitrage.instant_with_wind import init_log\n init_log('log.csv')\n\n # last t trading days\n from WindPy import w\n from CointArbitrage.instant_with_wind import trading_times\n w.start()\n times=trading_times(w,length=60,text=\"TradingCalendar=HKEX\")\n\n # download adjusted close price up to yesterday\n # price is kept in file price_yyyymmdd.csv with eachline as 'tickers,values'\n # more can be found in RNWS package\n from CointArbitrage.instant_with_wind import download_hist_price\n tickers=['0001.HK','0002.HK','0003.HK'...]\n download_hist_price(tickers,times,'price_path',w)\n\n # read in history price\n from RNWS import read_df\n hist_price=read_df('price_path',file_pattern='price',dt_range=times)\n\n # filter stationary pairs\n from CointArbitrage.pairing_period import filter_pval\n import pandas as pd\n pairs=['0001.HK|0002.HK','0001.HK|0003.HK',...]\n new_pairs=filter_pval(hist_price,pairs,n_jobs=-1)\n new_tickers=pd.Series(new_pairs).str.split('|',expand=True).unstack().unique().tolist()\n new_hist=hist_price[new_tickers]\n\n # lotsize and shortability\n ls=pd.DataFrame({'shortable':[0,0,1,...],'lotsize':[500,1000,500,...]},index=['0001.HK','0002.HK','0003.HK'...])\n\n # find new pairs\n from CointArbitrage.instant_with_wind import find_new_hk\n params={'log_path':'log.csv'\n ,'hist_price':hist_price\n ,'hist_log': pd.read_csv('history_log.csv') #from back test\n ,'pairs':new_pairs\n ,'tickers':new_tickers\n ,'zs_window':20\n ,'zs_log':False \n ,'w':w\n ,'ls':ls\n ,'potential_path':'potential_path.csv'\n ,'potential_k':1.8\n ,'k0':1\n ,'k1':2\n ,'k1':4\n ,'match_max':50000\n }\n\n # update log.csv\n sign=find_new_hk(**params)\n\nupdate file every 1800s at trading hour and refresh evrey 900s at lunch\nbreak and before trading start\n\n.. code:: bash\n\n from CointArbitrage.instant_with_wind import time_sleep\n time_sleep(sign={0:1800,1:900,2:'break',3:'break'})(find_new_hk)(**params)\n\nRefresh log and check close status\n\n.. code:: bash\n\n params2={}\n for key in ['log_path','hist_price','w','hist_log','k0','k2','plot_mark','potential_path','zs_log','zs_window']:\n params2.update(params[key])\n refresh_hk(**params2)\n # to continue refresh every 1800s\n time_sleep(sign={0:1800,1:900,2:'break',3:'break'})(refresh_hk)(**params2)\n\nCheck stationarity by using the price at last 10min of all trading hours\n\n.. code:: bash\n\n param3={}\n for key in ['log_path','hist_price','w','zs_window','zs_log','k0','k1']\n param3.update(key)\n time_sleep(sign={0:10,1:9000,2:'break',3:'break'})(last_hk)(**param3)\n\nNotice: After using time_sleep, sleep loops will start directly. Thus\n``find_new``, ``refresh`` and ``last`` should be running in 3 different\nconsules.\n\n\n", "description_content_type": "", "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "", "keywords": "", "license": "", "maintainer": "", "maintainer_email": "", "name": "CointArbitrage", "package_url": "https://pypi.org/project/CointArbitrage/", "platform": "", "project_url": "https://pypi.org/project/CointArbitrage/", "project_urls": null, "release_url": "https://pypi.org/project/CointArbitrage/0.0.63/", "requires_dist": [ "RNWS", "mini-exchange" ], "requires_python": "", "summary": "Conintegration method", "version": "0.0.63" }, "last_serial": 4658372, "releases": { "0.0.3a0": [ { "comment_text": "", "digests": { "md5": "49811e6fc3fa7473e2b62658d28b0853", "sha256": "27c7b3c75fe889c9a66dbbea4e10ec50ec4dc4cdb0641594dcc368d3a386e853" }, "downloads": -1, "filename": "CointArbitrage-0.0.3a0-py3-none-any.whl", "has_sig": false, "md5_digest": "49811e6fc3fa7473e2b62658d28b0853", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21646, "upload_time": "2018-11-16T08:20:31", "url": "https://files.pythonhosted.org/packages/f7/17/4e8256f5a1ed2f1a4ed11eade75b84279e26deb3f4105aa656a676753502/CointArbitrage-0.0.3a0-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "f6968788fe131e4427a31d412be5a229", "sha256": "86c6aa9a5883d15db44b4a2989ca1974cb5b39d6132f70baa6c78568fc938d14" }, "downloads": -1, "filename": "CointArbitrage-0.0.3a0.tar.gz", "has_sig": false, "md5_digest": "f6968788fe131e4427a31d412be5a229", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14596, "upload_time": "2018-11-16T08:20:33", "url": "https://files.pythonhosted.org/packages/0f/8a/e42b13c2212e98a4b6693075c7e8f13f760e45e1d4569a8e3540c8b263b4/CointArbitrage-0.0.3a0.tar.gz" } ], "0.0.3a1": [ { "comment_text": "", "digests": { "md5": "0ed04f08a8fb48179c688b09b547ad67", "sha256": "cdba576664e82d0d7e389319f1a24b30d378a7ef2f60e7f2cc6d0372b93bb34c" }, "downloads": -1, "filename": "CointArbitrage-0.0.3a1-py3-none-any.whl", "has_sig": false, "md5_digest": "0ed04f08a8fb48179c688b09b547ad67", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21647, "upload_time": "2018-11-20T03:16:01", "url": "https://files.pythonhosted.org/packages/df/0a/feba42b9804bca3c031a98ddd7758733ba093ef3db2a09e2b58c7697d8f4/CointArbitrage-0.0.3a1-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "1a620bf6a6c87b5e082fdf9f6dc652dd", "sha256": "7bf6cba89d5b46815c732faa66e2834a783c8d244eaf9c685f8771bb48579457" }, "downloads": -1, "filename": "CointArbitrage-0.0.3a1.tar.gz", "has_sig": false, "md5_digest": "1a620bf6a6c87b5e082fdf9f6dc652dd", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14597, "upload_time": "2018-11-20T03:16:03", "url": "https://files.pythonhosted.org/packages/61/c2/e8d604b9c54b1f9c837a652f3c2173934ff982afa049761a346f224be3cf/CointArbitrage-0.0.3a1.tar.gz" } ], "0.0.3a2": [ { "comment_text": "", "digests": { "md5": "0af8703949eea9636012820858ecbb81", "sha256": "badf445339dd766cd6ab32741db0c1812f898af373493a9630cc2ed6fe25ab70" }, "downloads": -1, "filename": "CointArbitrage-0.0.3a2-py3-none-any.whl", "has_sig": false, "md5_digest": "0af8703949eea9636012820858ecbb81", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21717, "upload_time": "2018-11-23T02:18:06", "url": "https://files.pythonhosted.org/packages/77/7e/61220c201e75975d119c0c2d12ddadaf38d46ce9b65632dfbb957313e58e/CointArbitrage-0.0.3a2-py3-none-any.whl" }, { "comment_text": "", "digests": { "md5": "e6181e084201f8b4896d0820aaab3f2c", "sha256": "44ce554f87238204d179d4209c5a3aea43ca218a6602658124164c37b30206dd" }, "downloads": -1, "filename": "CointArbitrage-0.0.3a2.tar.gz", "has_sig": false, "md5_digest": "e6181e084201f8b4896d0820aaab3f2c", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 14638, "upload_time": "2018-11-23T02:18:07", "url": "https://files.pythonhosted.org/packages/1d/91/c3c5ad919b0d56b1b4d48ee65c2c71a49768e668bd51310bd421788a781e/CointArbitrage-0.0.3a2.tar.gz" } ], "0.0.4": [ { "comment_text": "", "digests": { "md5": "2274493b01d0f13cecbde21d65a2dd15", "sha256": "6c727fa3a4490976a4dbfaaff016a234d580b4f60aa55072b442405b6ff86b16" }, "downloads": -1, "filename": "CointArbitrage-0.0.4-py3-none-any.whl", "has_sig": false, "md5_digest": "2274493b01d0f13cecbde21d65a2dd15", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21869, "upload_time": "2018-11-30T01:30:39", "url": "https://files.pythonhosted.org/packages/21/e0/581eda4d35abd5748ad43b86bcab10f73f18efd5d7e79f70fcfcc9ef5d08/CointArbitrage-0.0.4-py3-none-any.whl" } ], "0.0.5": [ { "comment_text": "", "digests": { "md5": "b5837d568086e21203c39a13c3d63c33", "sha256": "9dc81d337a9f2cfe01bb41134c29fb68d28d4c764635abf31a4bb9d105eecafa" }, "downloads": -1, "filename": "CointArbitrage-0.0.5-py3-none-any.whl", "has_sig": false, "md5_digest": "b5837d568086e21203c39a13c3d63c33", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21866, "upload_time": "2018-11-30T08:58:57", "url": "https://files.pythonhosted.org/packages/9e/4a/d6928367fbfe97c6cf608a9a176282ce844c5b658d3675e72397788acefb/CointArbitrage-0.0.5-py3-none-any.whl" } ], "0.0.6": [ { "comment_text": "", "digests": { "md5": "e8f8cfc3f5f4adfef29bd59931b222f3", "sha256": "7250f2a0227ba4cab3b47dad6e7bacf5c8dfb70434cd4d78e4ddfbd9826adf80" }, "downloads": -1, "filename": "CointArbitrage-0.0.6-py3-none-any.whl", "has_sig": false, "md5_digest": "e8f8cfc3f5f4adfef29bd59931b222f3", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21863, "upload_time": "2018-12-03T02:00:13", "url": "https://files.pythonhosted.org/packages/31/80/0af3d47af7499abdd621922ab99f3854da521e2bcfa2751dc2b889bb70f5/CointArbitrage-0.0.6-py3-none-any.whl" } ], "0.0.63": [ { "comment_text": "", "digests": { "md5": "b0930b7ae84b13cd62139791f1205a33", "sha256": "0da457348a1e7343dd22f47873be49bc38ee25cb5dea347eb9e6b96771ca450a" }, "downloads": -1, "filename": "CointArbitrage-0.0.63-py3-none-any.whl", "has_sig": false, "md5_digest": "b0930b7ae84b13cd62139791f1205a33", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21859, "upload_time": "2019-01-04T01:18:20", "url": "https://files.pythonhosted.org/packages/bd/94/4b054b04371516186f38d7d6d74ccb262d8a7074fecc27fa8c340a4be9b6/CointArbitrage-0.0.63-py3-none-any.whl" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "b0930b7ae84b13cd62139791f1205a33", "sha256": "0da457348a1e7343dd22f47873be49bc38ee25cb5dea347eb9e6b96771ca450a" }, "downloads": -1, "filename": "CointArbitrage-0.0.63-py3-none-any.whl", "has_sig": false, "md5_digest": "b0930b7ae84b13cd62139791f1205a33", "packagetype": "bdist_wheel", "python_version": "py3", "requires_python": null, "size": 21859, "upload_time": "2019-01-04T01:18:20", "url": "https://files.pythonhosted.org/packages/bd/94/4b054b04371516186f38d7d6d74ccb262d8a7074fecc27fa8c340a4be9b6/CointArbitrage-0.0.63-py3-none-any.whl" } ] }