diff --git a/README b/README new file mode 100644 index 0000000..e69de29 diff --git a/installwindpy.bat b/installwindpy.bat new file mode 100644 index 0000000..4aa31f1 --- /dev/null +++ b/installwindpy.bat @@ -0,0 +1 @@ +D:\Anaconda3\envs\windpyplus\python.exe "C:\Wind\Wind.NET.Client\WindNET\bin\installWindPy.py" "C:\Wind\Wind.NET.Client\WindNET" \ No newline at end of file diff --git a/requirements_dev.txt b/requirements_dev.txt index 5c9dcb6..e9844ac 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -1,4 +1,5 @@ -pip==8.1.2 +pip>=8.1.2 +pandas>=0.20.3 bumpversion==0.5.3 wheel==0.29.0 watchdog==0.8.3 @@ -8,4 +9,3 @@ coverage==4.1 Sphinx==1.4.8 cryptography==1.7 PyYAML==3.11 - diff --git a/tests.py b/tests.py new file mode 100644 index 0000000..747fd74 --- /dev/null +++ b/tests.py @@ -0,0 +1,19 @@ +# test scripts in project + + +import pandas as pd + + +from WindPy import w +w.start() + +from windpyplus.utils.tradedate import tradedate +from windpyplus.fundamental.performanceExpress import performance_express +from windpyplus.fundamental.financialReport import financial_report +from windpyplus.stockSector.StockSector import allAstock + +allstocks = list(allAstock().index.values) +print(allstocks) +print(tradedate()) +#print(performance_express(allstocks)) +#print(financial_report(allstocks)) diff --git a/windpyplus/Scripts/activate b/windpyplus/Scripts/activate new file mode 100644 index 0000000..11ef45b --- /dev/null +++ b/windpyplus/Scripts/activate @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +source D:\Anaconda3\Scripts\activate "$@" \ No newline at end of file diff --git a/windpyplus/Scripts/activate.bat b/windpyplus/Scripts/activate.bat new file mode 100644 index 0000000..f889817 --- /dev/null +++ b/windpyplus/Scripts/activate.bat @@ -0,0 +1,2 @@ +@echo off +call "D:\Anaconda3\Scripts\activate" %* diff --git a/windpyplus/Scripts/conda b/windpyplus/Scripts/conda new file mode 100644 index 0000000..f0f90e4 --- /dev/null +++ b/windpyplus/Scripts/conda @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +D:\Anaconda3\Scripts\conda.exe "$@" \ No newline at end of file diff --git a/windpyplus/Scripts/conda.bat b/windpyplus/Scripts/conda.bat new file mode 100644 index 0000000..9c467c9 --- /dev/null +++ b/windpyplus/Scripts/conda.bat @@ -0,0 +1,2 @@ +@echo off +call "D:\Anaconda3\Scripts\conda" %* diff --git a/windpyplus/Scripts/deactivate b/windpyplus/Scripts/deactivate new file mode 100644 index 0000000..1eba0e9 --- /dev/null +++ b/windpyplus/Scripts/deactivate @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +source D:\Anaconda3\Scripts\deactivate "$@" \ No newline at end of file diff --git a/windpyplus/Scripts/deactivate.bat b/windpyplus/Scripts/deactivate.bat new file mode 100644 index 0000000..06dd1fb --- /dev/null +++ b/windpyplus/Scripts/deactivate.bat @@ -0,0 +1,2 @@ +@echo off +call "D:\Anaconda3\Scripts\deactivate" %* diff --git a/windpyplus/__init__.py b/windpyplus/__init__.py index 26eadb9..d362855 100644 --- a/windpyplus/__init__.py +++ b/windpyplus/__init__.py @@ -2,6 +2,7 @@ """Top-level package for windpyplus.""" -__author__ = """rome peng""" +__author__ = "rome peng" __email__ = 'romepeng@outlook.com' __version__ = '0.1.0' + diff --git a/windpyplus/concept/__init__.py b/windpyplus/concept/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/concept/foreCast.py b/windpyplus/concept/foreCast.py new file mode 100644 index 0000000..f969af3 --- /dev/null +++ b/windpyplus/concept/foreCast.py @@ -0,0 +1,25 @@ +#from windpyplus.utils import WindPyStart +from windpyplus.utils.tradedate import tradedate +from windpyplus.stockPool.mystocks import stocklists +from windpyplus.stockPool.bigquantstocks import bqstocks +from windpyplus.utils.convertToWindCode import convertBQCode + +def foreCastWind(stocklists): + data = w.wss(stocklists, + "sec_name,profitnotice_style,profitnotice_change,profitnotice_lasteps,profitnotice_changemax,profitnotice_changemin,profitnotice_date,profitnotice_abstract,", + "rptDate=20170630;unit=1") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + df = df[df['PROFITNOTICE_CHANGEMIN'] > -10] + df = df.sort_values(by= 'PROFITNOTICE_DATE', ascending=False) + print(df) + return df + +if __name__ == '__main__': + stocklists = convertBQCode(bqstocks) + df = foreCastWind(stocklists) + from dfToExcel import dftoSameWorkbook, dfToExcel + #from StockSector import MSCIAStock + from StockSector import allAstock, MSCIAStock, allMainBoardStock + mscistocks = MSCIAStock().index.values + dfToExcel(df, "foreCastWind_bqstocks") + #dfToExcel(foreCastWind(mscistocks), "foreCastWind_MSCIAStock") diff --git a/windpyplus/concept/sector.py b/windpyplus/concept/sector.py new file mode 100644 index 0000000..f3c80a8 --- /dev/null +++ b/windpyplus/concept/sector.py @@ -0,0 +1,21 @@ +import pandas as pd +from windpyplus.utils.tradedate import tradedate +from WindPy import w +w.start() + +def Concept(stocklists): + data = w.wss(stocklists,"sec_name,concept","tradeDate="+ tradedate(0)[1] ) + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + return df + +def Industry(stocklists): + data = w.wss(stocklists,"sec_name,industry_gics,industry_citic,industry_sw","industryType=1;tradeDate="+ tradedate(0)[1] ) + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + return df + +if __name__ == '__main__': + from windpyplus.stockPool.mystocks import stocklists + print(Concept(stocklists)) + print(Industry(stocklists)) + + diff --git a/windpyplus/fundamental/IForcast.py b/windpyplus/fundamental/IForcast.py new file mode 100644 index 0000000..8fc84e6 --- /dev/null +++ b/windpyplus/fundamental/IForcast.py @@ -0,0 +1,31 @@ +import pandas as pd +from windpyplus.utils.tradedate import tradedate +from datetime import datetime +from WindPy import w +w.start() + +def iForecast(code, startdate = tradedate(180)[0], year = datetime.strptime(tradedate(0)[1],"%Y-%m-%d").year): + data = w.wset("institutionforecasts", "year=" + str(year), "startdate=" +startdate, "windcode=" +code ,"orgname=all") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + #print(df.head()) + df = df.sort_values(by ='last_rating_date', ascending = False) + return df + +def stockWest(code,startdate = tradedate(180)[0], year = datetime.strptime(tradedate(0)[1],"%Y-%m-%d").year): + data = w.wset("stockwest", + "startdate=" + startdate, "windcode=" + code ,"orgname=全部", + "field=date,organization,researcher,epsa0,epse1,epse2,epse3,netprofita0,netprofite1,netprofite2,netprofite3,incomea0,incomee1,incomee2,incomee3") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + df = df.sort_values(by ='date', ascending = False) + return df + +if __name__ == '__main__': + df = iForecast('000333.SZ') + + print(df) + from windpyplus.utils.dfToExcel import dfToExcel + dfToExcel(df, "iForecast_code") + df = stockWest('002139.sz') + print(df) diff --git a/windpyplus/fundamental/__init__.py b/windpyplus/fundamental/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/fundamental/financialReport.py b/windpyplus/fundamental/financialReport.py new file mode 100644 index 0000000..122548b --- /dev/null +++ b/windpyplus/fundamental/financialReport.py @@ -0,0 +1,18 @@ +import pandas as pd + +from WindPy import w +w.start() + +from ..utils.tradedate import tradedate + +def financial_report(stocks, rptdate='20170630'): + data = w.wss(stocks, "sec_name,industry_sw,ev,val_pe_deducted_ttm,pb_lf,gr_ttm,deductedprofit_ttm,eps_ttm,ocfps_ttm,eps_exdiluted2,bps_new,stm_issuingdate,stm_predict_issuingdate", + "industryType=1;unit=1;tradeDate=" + tradedate(0)[-1], "rptDate=" + rptdate,"currencyType=") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + df = df.dropna() + df = df.sort_values(by='STM_ISSUINGDATE', ascending=False) + print(len(df)) + return df + +def financial_fastrep(stocks,rptdate='20170630'): + pass \ No newline at end of file diff --git a/windpyplus/fundamental/foreCastWind.py b/windpyplus/fundamental/foreCastWind.py new file mode 100644 index 0000000..e408d88 --- /dev/null +++ b/windpyplus/fundamental/foreCastWind.py @@ -0,0 +1,27 @@ +import pandas as pd +from datetime import datetime, date, timedelta +from windpyplus.utils.tradedate import tradedate +from WindPy import w +w.start() + +def foreCastWind(stocklists, reportDate = '20170930'): + data = w.wss(stocklists, + "sec_name,profitnotice_style,profitnotice_lasteps,profitnotice_changemax,profitnotice_changemin,profitnotice_date,profitnotice_abstract,profitnotice_netprofitmin,profitnotice_netprofitmax,", + "rptDate=" + str(reportDate)) + # stm_predict_issuingdate + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + #df = df[df['PROFITNOTICE_CHANGEMIN'] > -10] + #df['PROFITNOTICE_NETPROFITMEAN'] = 0.5*(df['PROFITNOTICE_CHANGEMIN'] + df['PROFITNOTICE_NETPROFITMAX']) + # PROFITNOTICE_DATE, STM_PREDICT_ISSUINGDATE + df = df[df['PROFITNOTICE_DATE'] > (datetime.now() + timedelta(days=-150))] + df = df.sort_values(by= 'PROFITNOTICE_DATE', ascending=False) + df['PROFITNOTICE_CHANGEMEAN'] = 0.5*(df['PROFITNOTICE_CHANGEMIN'] + df['PROFITNOTICE_CHANGEMAX']) + df['PROFITNOTICE_DATE'] = df['PROFITNOTICE_DATE'].apply(lambda x: x.date()) + #df['STM_PREDICT_ISSUINGDATE'] = df['STM_PREDICT_ISSUINGDATE'].apply(lambda x:x.date()) + print(df[df['PROFITNOTICE_DATE'] == date.today()]) + print('NUM of PROFITNOTICE LIST :{}'.format(len(df))) + return df + + + + diff --git a/windpyplus/fundamental/ftpsync.settings b/windpyplus/fundamental/ftpsync.settings new file mode 100644 index 0000000..1c69894 --- /dev/null +++ b/windpyplus/fundamental/ftpsync.settings @@ -0,0 +1,86 @@ +{ + // HELP / INFO moved to bottom + // Remove "//" to uncomment settings directive + + "default": { + + "host": "191.181.35.67", + "username": "root", // or null for anonymous login + "password": "null", + "path": "/root/.tushareplus/", + + "upload_on_save": true, // set *false* if you do not want to upload on save! + + "port": 26873, + // "tls": false, + // "timeout": 30, // [seconds] + + // "passive": true, + // "download_on_open": false, + // "overwrite_newer_prevention": true, + // "default_folder_permissions": "755", + // "default_upload_permissions": null, // null = no action taken + // "time_offset": 0, // [seconds] + // "always_sync_local_permissions": true, + + // Value "auto" = use UTF-8 if availible (FEAT: UTF8), otherwise use local + // "encoding": "auto", + + // Trade small performance impact for more stable and secure transfer (old file is intact until the download is finished) + // "use_tempfile": true, + + // Regular expression, recommending using \b in general and /.../ for folders to avoid matching substrings + // "ignore": "", + + // Can be used for increase of performance or to allow build scripts to finish + // "upload_delay": 0, // [seconds] + + // Only if the server has MFMT extension installed + // "set_remote_lastmodified": true, + + // Chmod value for files newly downloaded by FTPSync + // "auto" = same as on server + // null = no action taken + // "0644" = example for direct value + // "default_local_permissions": "auto", + + // List of lists with pathnames and filenames to folders to be watched for change in between delay (upload_delay) + // example: after_save_watch: [ [ "code/assets/css", "*.css" ], [ "code/assets/", "*.jpg, *.png, *.gif" ] ] + // used only in conjunction with upload_on_save and upload_delay ** + // For more info see https://github.com/NoxArt/SublimeText2-FTPSync/wiki/Why-and-how-to-use-afterwatch + // "after_save_watch": [], + + } + + // ------ INFO ---------------------------------------------------------------------- + + // Index page + // --- https://github.com/NoxArt/SublimeText2-FTPSync/ + + // For settings description see: + // --- https://github.com/NoxArt/SublimeText2-FTPSync/wiki/All-settings + + // For more info see: + // --- https://github.com/NoxArt/SublimeText2-FTPSync/wiki/_pages + + // Want to ask? Report a bug? + // --- Hit: https://github.com/NoxArt/SublimeText2-FTPSync/issues/new + + + // ** Commas ** + + // from now on extra commas are allowed and recommended + + // ** Comments ** + + // The "//" are so called "comments", all text after it is ignored, + // they are used for notes or deactivating an entry + + // Non-basic settings are deactivated and default options specified in the global settings file, + // that is $packages$/FTPSync/ftpsync.sublime-settings (where $packages$ is a path where Sublime + // keeps packages in your Operating System) accessible via Preferences > Package Settings > FTPSync + // Use Settings - User to override the global defaults + + // More info about Sublime Text 2 settings on http://www.sublimetext.com/docs/2/settings.html + +} diff --git a/windpyplus/fundamental/fundamentalWind.py b/windpyplus/fundamental/fundamentalWind.py new file mode 100644 index 0000000..75e5356 --- /dev/null +++ b/windpyplus/fundamental/fundamentalWind.py @@ -0,0 +1,91 @@ +from WindPy import w +w.start() +import pandas as pd +import subprocess + +from ..utils.tradedate import tradedate +from ..utils import remind as rm + +def financialDataWind(stocklists): + field = ["sec_name,roe_avg,roe_basic,roe_diluted,roe_deducted,roe_exbasic,roa2,roic,netprofitmargin,grossprofitmargin,deductedprofittoprofit,ocftocf,ocftosales,debttoassets,deducteddebttoassets,current,quick,cashtocurrentdebt,longdebttodebt,arturn,faturn,yoy_tr,yoy_or,yoyprofit,yoynetprofit,yoynetprofit_deducted,yoyocf,yoyroe,yoy_equity,tot_oper_rev,net_profit_is,tot_profit,np_belongto_parcomsh,net_cash_flows_oper_act"] + data = w.wss(stocklists, field, "rptDate=20161231;unit=1;rptType=1") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + print(df.head()) + return df + +def dfToExcel(df, filename): + df.to_excel("D:/Stock/tushare/" + str(filename) + ".xlsx", sheet_name = tradedate(0)[-1]) + print(" df to_excel filename .") + pass + +def ROE_filter(stocklists, ROE_limit = 7.0): + df = financialDataWind(stocklists) + #df = df[(df['ROA2'] > 7.0) & (df['ROE_DEDUCTED'] > ROE_limit)] + df = df[df['ROE_DEDUCTED'] > ROE_limit] + print("ROE > " + str(ROE_limit) + " Num: {} ".format(len(df))) + return df.index.values + +def netProfit_filter(stocklists, netProfit_limit = 1.0e+8): + df = financialTTM(stocklists) + df = df[df['DEDUCTEDPROFIT_TTM'] > netProfit_limit] + print("DEDUCTEDPROFIT_TTM > " + str(netProfit_limit) + " Num: {} ".format(len(df))) + return df.index.values + +def DB_filter(stocklists, DB_limit = 0.75): + df = financialDataWind(stocklists) + df = df[df['NP_BELONGTO_PARCOMSH'] < DB_limit] + print("NP_BELONGTO_PARCOMSH > " + str(netProfit_limit) + " Num: {} ".format(len(df))) + return df.index.values + +def cashFlow_filter(stocklists, cashFlow_percent = 0.95): + df = financialTTM(stocklists) + df = df[df['OCFPS_TTM'] > cashFlow_percent*df['EPS_TTM']] + print("OCFPS_TTM'> " + str(cashFlow_percent) + "*EPS_TTM Num: {} ".format(len(df))) + return df.index.values + +def financialTTM(stocklists): + data = w.wss(stocklists, "gr_ttm,or_ttm,profit_ttm,netprofit_ttm,deductedprofit_ttm,operatecashflow_ttm,cashflow_ttm,eps_ttm,ocfps_ttm,orps_ttm,cfps_ttm","unit=1; tradeDate=" + str(tradedate(0)[1]) + ";year=2016") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + return df + +def growth(stocklists, reportDate= "20161231"): + data = w.wss(stocklists, "yoyeps_basic,yoyeps_diluted,yoyocfps,yoy_tr,yoy_or,yoyop,yoyop2,yoyebt,yoyprofit,yoynetprofit,yoynetprofit_deducted,yoyocf,yoyroe,yoy_cash,yoy_equity,yoycf,yoydebt,yoy_assets","rptDate=" + str(reportDate) +";rptType=1") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + return df + +def growth_filter(stocklists, growth_min = 6): + df_1Y = growth(stocklists, "20161231") + df_1Y = df_1Y[df_1Y['YOYNETPROFIT_DEDUCTED'] > growth_min] + df_2Y = growth(stocklists, "20151231") + df_2Y = df_2Y[df_2Y['YOYNETPROFIT_DEDUCTED'] > 0] + df_N = growth(stocklists, "20170331") + df_N = df_N[df_N['YOYNETPROFIT_DEDUCTED'] > 2*growth_min] + stocks = [s for s in df_2Y.index if s in df_1Y.index] + stocks = [s for s in df_N.index if s in stocks] + print("YOYNETPROFIT_DEDUCTED'> " + str(growth_min) + " Num: {} ".format(len(stocks))) + return stocks + +def multi_filter(stocklists,ROE_limit=8, growth_min=15, netProfit_limit=1.0e+8): + roe_list = ROE_filter(stocklists, 8) + #cashflow_list = cashFlow_filter(stocklists) + growth_list = growth_filter(stocklists, 15) + netProfit_list = netProfit_filter(stocklists) + #result_list = [s for s in roe_list if s in cashflow_list] + result_list = [ s for s in roe_list if s in growth_list] + result_list = [s for s in result_list if s in netProfit_list] + print("ROE>8, growth>15, netProfit>1.0e+8" + "Num: {} ".format(len(result_list))) + return result_list + +if __name__ == '__main__': + from windpyplus.stockPool.mystocks import stocklists + print(stocklists) + from windpyplus.stockSector.StockSector import HKToChina + stocklists = HKToChina() + len(financialDataWind(stocklists)) + print(ROE_filter(stocklists, 8)) + #print(netProfit_filter(stocklists, 1.5e+8)) + #print(financialTTM(stocklists)) + print(cashFlow_filter(stocklists)) + print(growth_filter(stocklists, 5)) + print(multi_filter(stocklists)) + diff --git a/windpyplus/fundamental/info_wind.py b/windpyplus/fundamental/info_wind.py new file mode 100644 index 0000000..a1f2cae --- /dev/null +++ b/windpyplus/fundamental/info_wind.py @@ -0,0 +1,39 @@ +from windpyplus.utils.tradedate import tradedate, futuredate +import pandas as pd +from WindPy import w +w.start() + +def info(stocklists): + data = w.wss(stocklists, "close,sec_name,industry_sw,ipo_date,mkt,sec_status,trade_code,compindex2,concept,marginornot,SHSC,SHSC2,sec_type,total_shares,float_a_shares,share_ntrd_prfshare,share_pledgeda,share_pledgeda_pct,share_rtd_unlockingdate,share_tradable_current,share_tradable_sharetype,holder_top10pct,holder_top10liqquantity,holder_controller,holder_name,","tradeDate=20170617;priceAdj=F;cycle=D;industryType=3;index=1;unit=1;order=0;rptDate=20161231") + # holder_pctbyinst,holder_pctbyqfii,holder_pctbyinsur,holder_pctbyssfund, holder_price_fellowon,holder_price_mh,holder_price_Majorshareholders,holder_price_ESOP,holder_price_stockbasedcompensation + #"roe_avg,roe_basic,roe_diluted,roe_deducted,roe_exbasic,roa2,roic,netprofitmargin,grossprofitmargin,deductedprofittoprofit,ocftocf,ocftosales,debttoassets,deducteddebttoassets,current,quick,cashtocurrentdebt,longdebttodebt,arturn,faturn,yoy_tr,yoy_or,yoyprofit,yoynetprofit,yoynetprofit_deducted,yoyocf,yoyroe,yoy_equity,tot_oper_rev,net_profit_is,tot_profit,np_belongto_parcomsh,net_cash_flows_oper_act","rptDate=20161231;unit=1;rptType=1") + #print(data) + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + #df.to_excel("D:/Stock/wind/info.xlsx", sheet_name = tradedate(0)[-1]) + #rm._play_wav() + print(df.head()) + return df + +def info1(stocklists): + data = w.wss(stocklists, "close,sec_name,industry_sw,ipo_date,mkt,sec_status,trade_code,compindex2,concept,","tradeDate=20170617;priceAdj=F;cycle=D;industryType=3;index=1;unit=1;order=0;rptDate=20161231") + #marginornot,SHSC,SHSC2,sec_type,total_shares,float_a_shares,share_ntrd_prfshare,share_pledgeda,share_pledgeda_pct,share_rtd_unlockingdate,share_tradable_current,share_tradable_sharetype,holder_top10pct,holder_top10liqquantity,holder_controller,holder_name, + # holder_pctbyinst,holder_pctbyqfii,holder_pctbyinsur,holder_pctbyssfund, holder_price_fellowon,holder_price_mh,holder_price_Majorshareholders,holder_price_ESOP,holder_price_stockbasedcompensation + #"roe_avg,roe_basic,roe_diluted,roe_deducted,roe_exbasic,roa2,roic,netprofitmargin,grossprofitmargin,deductedprofittoprofit,ocftocf,ocftosales,debttoassets,deducteddebttoassets,current,quick,cashtocurrentdebt,longdebttodebt,arturn,faturn,yoy_tr,yoy_or,yoyprofit,yoynetprofit,yoynetprofit_deducted,yoyocf,yoyroe,yoy_equity,tot_oper_rev,net_profit_is,tot_profit,np_belongto_parcomsh,net_cash_flows_oper_act","rptDate=20161231;unit=1;rptType=1") + #print(data) + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + #df.to_excel("D:/Stock/wind/info.xlsx", sheet_name = tradedate(0)[-1]) + #rm._play_wav() + print(df.head()) + return df + +def dfToExcel(df, filename): + df.to_excel("D:/Stock/wind/" + str(filename) + ".xlsx", sheet_name = tradedate(0)[-1]) + print(" df to_excel filename .") + pass + +def ROE_filter(stocklists, ROE_limit = 7.0): + df = financialDataWind(stocklists) + df = df[(df['ROA2'] > 7.0) & (df['ROE_DEDUCTED'] > ROE_limit)] + print("ROE and ROA2 > " + str(ROE_limit) + " Num: {} ".format(len(df))) + return df.index.values + diff --git a/windpyplus/fundamental/performanceExpress.py b/windpyplus/fundamental/performanceExpress.py new file mode 100644 index 0000000..bcf5d8c --- /dev/null +++ b/windpyplus/fundamental/performanceExpress.py @@ -0,0 +1,13 @@ +import pandas as pd + + +from WindPy import w +w.start() + +def performance_express(stocks, rptdate='20170630'): + data = w.wss(stocks, "sec_name, performanceexpress_perfexincome, performanceexpress_perfexnetfrofittoshareholder,performanceexpress_perfexepsdiluted, performanceexpress_date", "unit=1; rptData=20170630") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + df = df.dropna() + df = df.sort_values(by= "PERFORMANCEEXPRESS_DATE", ascending=False) + print(len(df)) + return df diff --git a/windpyplus/fundamental/valucation.py b/windpyplus/fundamental/valucation.py new file mode 100644 index 0000000..7cfd4a8 --- /dev/null +++ b/windpyplus/fundamental/valucation.py @@ -0,0 +1,43 @@ +import pandas as pd +from windpyplus.utils.tradedate import tradedate +from windpyplus.utils import remind as rm + +from WindPy import * +w.start() + +def valucationWind(stocklists): + rm._write_msg('[Getting Data:]') + df_V = pd.DataFrame() + for code in stocklists: + rm._write_inprogress() + # sec_status,trade_code, + data = w.wsd(code, "windcode,sec_name, close, ev,pe_ttm,val_pe_deducted_ttm,pe_lyr,pb_lf,pcf_ocflyr,west_eps_FY1,west_eps_FY2,estpe_FY1,estpe_FY2, estpeg_FTM,estpeg_FY1, industry_sw,concept", + tradedate(0)[0], tradedate(0)[1], "index=4;industryType=3") + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + #df['ev'] = df['ev']/1.0E+8 + df_V = pd.concat([df_V, df]) + df_V = df_V.sort_values(by='INDUSTRY_SW') + #df_V.to_excel("D:/Stock/tushare/stocklists.xlsx", sheet_name = tradedate(0)[-1]) + #rm._play_wav() + print(len(df_V)) + return df_V + +def PE_filter(stocklists, PE_ttm_max=100, PE_FY1_max = 50): + df = valucationWind(stocklists) + df = df[(df['VAL_PE_DEDUCTED_TTM'] < PE_ttm_max) & (df['ESTPE_FY1'] < PE_FY1_max)] + print("PE_ttm < " + str(PE_ttm_max) + "and PE_FY1 < " + str(PE_FY1_max) + " nums: {}".format(len(df))) + return df.index.values + +def PEG_filter(stocklists, PEG_max=1.5): + df = valucationWind(stocklists) + df = df[df['ESTPEG_FTM'] < PEG_max] + print("PEG < " + str(PEG_max) + " nums: {}".format(len(df))) + return df.index.values + +def PB_filter(stocklists, PB_max=2): + df = valucationWind(stocklists) + df = df[(df['PB_LF'] < PB_max)] + print("PB < " + str(PB_max) + " nums : {} ".format(len(df))) + return df.index.values + + diff --git a/windpyplus/info/__init__.py b/windpyplus/info/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/info/info_wind.py b/windpyplus/info/info_wind.py new file mode 100644 index 0000000..e4e1b1e --- /dev/null +++ b/windpyplus/info/info_wind.py @@ -0,0 +1,46 @@ +from tradedate import tradedate +from allAstock import allAstock +from mystocks import stocklists +from bigquantstocks import bqstocks +from convertToWindCode import convertBQCode + + +def info(stocklists): + data = w.wss(stocklists, "close,sec_name,industry_sw,ipo_date,mkt,sec_status,trade_code,compindex2,concept,marginornot,SHSC,SHSC2,sec_type,total_shares,float_a_shares,share_ntrd_prfshare,share_pledgeda,share_pledgeda_pct,share_rtd_unlockingdate,share_tradable_current,share_tradable_sharetype,holder_top10pct,holder_top10liqquantity,holder_controller,holder_name,","tradeDate=20170617;priceAdj=F;cycle=D;industryType=3;index=1;unit=1;order=0;rptDate=20161231") + # holder_pctbyinst,holder_pctbyqfii,holder_pctbyinsur,holder_pctbyssfund, holder_price_fellowon,holder_price_mh,holder_price_Majorshareholders,holder_price_ESOP,holder_price_stockbasedcompensation + #"roe_avg,roe_basic,roe_diluted,roe_deducted,roe_exbasic,roa2,roic,netprofitmargin,grossprofitmargin,deductedprofittoprofit,ocftocf,ocftosales,debttoassets,deducteddebttoassets,current,quick,cashtocurrentdebt,longdebttodebt,arturn,faturn,yoy_tr,yoy_or,yoyprofit,yoynetprofit,yoynetprofit_deducted,yoyocf,yoyroe,yoy_equity,tot_oper_rev,net_profit_is,tot_profit,np_belongto_parcomsh,net_cash_flows_oper_act","rptDate=20161231;unit=1;rptType=1") + #print(data) + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + #df.to_excel("D:/Stock/tushare/info.xlsx", sheet_name = tradedate(0)[-1]) + #rm._play_wav() + print(df.head()) + return df + +def info1(stocklists): + data = w.wss(stocklists, "close,sec_name,industry_sw,ipo_date,mkt,sec_status,trade_code,compindex2,concept,","tradeDate=20170617;priceAdj=F;cycle=D;industryType=3;index=1;unit=1;order=0;rptDate=20161231") + #marginornot,SHSC,SHSC2,sec_type,total_shares,float_a_shares,share_ntrd_prfshare,share_pledgeda,share_pledgeda_pct,share_rtd_unlockingdate,share_tradable_current,share_tradable_sharetype,holder_top10pct,holder_top10liqquantity,holder_controller,holder_name, + # holder_pctbyinst,holder_pctbyqfii,holder_pctbyinsur,holder_pctbyssfund, holder_price_fellowon,holder_price_mh,holder_price_Majorshareholders,holder_price_ESOP,holder_price_stockbasedcompensation + #"roe_avg,roe_basic,roe_diluted,roe_deducted,roe_exbasic,roa2,roic,netprofitmargin,grossprofitmargin,deductedprofittoprofit,ocftocf,ocftosales,debttoassets,deducteddebttoassets,current,quick,cashtocurrentdebt,longdebttodebt,arturn,faturn,yoy_tr,yoy_or,yoyprofit,yoynetprofit,yoynetprofit_deducted,yoyocf,yoyroe,yoy_equity,tot_oper_rev,net_profit_is,tot_profit,np_belongto_parcomsh,net_cash_flows_oper_act","rptDate=20161231;unit=1;rptType=1") + #print(data) + df = pd.DataFrame(data.Data, columns=data.Codes, index=data.Fields).T + #df.to_excel("D:/Stock/tushare/info.xlsx", sheet_name = tradedate(0)[-1]) + #rm._play_wav() + print(df.head()) + return df + +def dfToExcel(df, filename): + df.to_excel("D:/Stock/tushare/" + str(filename) + ".xlsx", sheet_name = tradedate(0)[-1]) + print(" df to_excel filename .") + pass + +def ROE_filter(stocklists, ROE_limit = 7.0): + df = financialDataWind(stocklists) + df = df[(df['ROA2'] > 7.0) & (df['ROE_DEDUCTED'] > ROE_limit)] + print("ROE and ROA2 > " + str(ROE_limit) + " Num: {} ".format(len(df))) + return df.index.values + +if __name__ == '__main__': + bqstock = convertBQCode(bqstocks) + + #df.to_excel("D:/Stock/tushare/info.xlsx", sheet_name = tradedate(0)[-1]) + info1(stocklists) diff --git a/windpyplus/info/listedGeneralView.py b/windpyplus/info/listedGeneralView.py new file mode 100644 index 0000000..180631b --- /dev/null +++ b/windpyplus/info/listedGeneralView.py @@ -0,0 +1,29 @@ +from windpyplus.utils.tradedate import tradedate, futuredate +import pandas as pd +from WindPy import w +w.start() + +def companyScopeView(): + data = w.wset("companyscopegeneralview","enddate=" +tradedate(0)[1], "year=2016","sectorid=a001010100000000") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + print(df.head()) + return df + + +def companyGenneralView(): + data = w.wset("listedcompanygenerayview","sectorid=a001010100000000") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + print(df.head()) + return df + + +def securityGenneralView(): + data = w.wset("listedsecuritygeneralview","sectorid=a001010100000000") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + print(df.head()) + return df + +if __name__ == '__main__': + companyScopeView() + companyGenneralView() + securityGenneralView() \ No newline at end of file diff --git a/windpyplus/marketStat/__init__.py b/windpyplus/marketStat/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/marketStat/limitingToFree.py b/windpyplus/marketStat/limitingToFree.py new file mode 100644 index 0000000..a283b2e --- /dev/null +++ b/windpyplus/marketStat/limitingToFree.py @@ -0,0 +1,22 @@ +from windpyplus.utils.tradedate import tradedate, futuredate +import pandas as pd +from WindPy import w +w.start() + +def limitToFree(): + data = w.wset("limitingtofreeofcompanydetail","startdate="+ futuredate(180*4)[0],"enddate=" + futuredate(180*4)[1],"sectorid=a001010100000000;search=") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + #print(df.head()) + return df + +def blockTradeRecord(): + data = w.wset("blocktraderecord","startdate=" +tradedate(20)[0] , "enddate="+tradedate(20)[1],"sectorid=a001010100000000") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + df = df.sort_values(by='trade_date', ascending=False) + #print(df.head(30)) + return df + +if __name__ == '__main__': + from windpyplus.utils.dfToExcel import dfToExcel + dfToExcel(limitToFree(), '限售股解禁_2Y' ) + dfToExcel(blockTradeRecord(), '大宗交易') diff --git a/windpyplus/marketStat/marketStatic.py b/windpyplus/marketStat/marketStatic.py new file mode 100644 index 0000000..4030f30 --- /dev/null +++ b/windpyplus/marketStat/marketStatic.py @@ -0,0 +1,34 @@ +from windpyplus.utils.tradedate import tradedate, futuredate +import pandas as pd +from WindPy import w +w.start() + +def marketSiceSatic(): + data = w.wset("stockmarketsizestatistics","market=shsz") + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + print(df.head()) + return df + + +def marketScaleStat(): + data = w.wset("marketscalestatisticbywind","reporttype=y1;startdate=" +tradedate(90)[0], "enddate="+tradedate(0)[1]) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + print(df.head()) + return df + +def indScaleStat(): + data = w.wset("indscalestatbywind","industrytype=证监会行业;enddate=" +tradedate(0)[1]) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + print(df.head()) + return df + +def mkTradeStat(): + data = w.wset("mkttradestatsec","startdate="+tradedate(365)[0] ,"enddate="+tradedate(0)[1],"sectorid=a001010100000000") + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + df = df.sort_values(by='date', ascending = False) + print(df.head()) + return df + + +if __name__ == '__main__': + mkTradeStat() \ No newline at end of file diff --git a/windpyplus/scheduler/__init__.py b/windpyplus/scheduler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/scheduler/timeTest.py b/windpyplus/scheduler/timeTest.py new file mode 100644 index 0000000..5b8e017 --- /dev/null +++ b/windpyplus/scheduler/timeTest.py @@ -0,0 +1,41 @@ +import platform, os +import time +from datetime import datetime, timedelta + + +def run_Task(): + os_platform = platform.platform() + #print(os_platform) + if os_platform.startswith('Darwin'): + print('This is mac os system.') + os.system('ls') + elif os_platform.startswith('Windows'): + print('This is Windows system.') + os.system('dir') + +def timerFunc(sched_Timer): + flag=0 + while True: + now = datetime.now() + #print(now) + if now == sched_Timer: + run_Task() + flag = 1 + else: + if flag == 1: + sched_Timer = sched_Timer + timedelta(minutes=1) + print(sched_Timer) + flag=0 + +if __name__ == '__main__': + sched_Timer = datetime(2017, 7, 6, 19, 40, 10) + print('run the timer task at {}'.format(sched_Timer)) + timerFunc(sched_Timer) + + + + + + + + diff --git a/windpyplus/stockPool/__init__.py b/windpyplus/stockPool/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/stockPool/bigquantstocks.py b/windpyplus/stockPool/bigquantstocks.py new file mode 100644 index 0000000..3eebf30 --- /dev/null +++ b/windpyplus/stockPool/bigquantstocks.py @@ -0,0 +1,602 @@ +bqstocks = ['000001.SZA', + '000002.SZA', + '000006.SZA', + '000012.SZA', + '000022.SZA', + '000028.SZA', + '000030.SZA', + '000035.SZA', + '000046.SZA', + '000049.SZA', + '000062.SZA', + '000065.SZA', + '000069.SZA', + '000070.SZA', + '000090.SZA', + '000166.SZA', + '000333.SZA', + '000400.SZA', + '000402.SZA', + '000404.SZA', + '000417.SZA', + '000418.SZA', + '000423.SZA', + '000429.SZA', + '000498.SZA', + '000501.SZA', + '000513.SZA', + '000529.SZA', + '000531.SZA', + '000537.SZA', + '000538.SZA', + '000540.SZA', + '000550.SZA', + '000559.SZA', + '000568.SZA', + '000581.SZA', + '000587.SZA', + '000596.SZA', + '000598.SZA', + '000600.SZA', + '000601.SZA', + '000603.SZA', + '000607.SZA', + '000620.SZA', + '000623.SZA', + '000625.SZA', + '000650.SZA', + '000651.SZA', + '000661.SZA', + '000666.SZA', + '000671.SZA', + '000681.SZA', + '000685.SZA', + '000688.SZA', + '000712.SZA', + '000718.SZA', + '000719.SZA', + '000726.SZA', + '000732.SZA', + '000739.SZA', + '000776.SZA', + '000783.SZA', + '000786.SZA', + '000789.SZA', + '000810.SZA', + '000811.SZA', + '000826.SZA', + '000828.SZA', + '000848.SZA', + '000858.SZA', + '000869.SZA', + '000876.SZA', + '000883.SZA', + '000888.SZA', + '000895.SZA', + '000900.SZA', + '000902.SZA', + '000908.SZA', + '000910.SZA', + '000915.SZA', + '000921.SZA', + '000928.SZA', + '000951.SZA', + '000957.SZA', + '000963.SZA', + '000989.SZA', + '000997.SZA', + '000998.SZA', + '000999.SZA', + '002001.SZA', + '002002.SZA', + '002003.SZA', + '002007.SZA', + '002008.SZA', + '002014.SZA', + '002019.SZA', + '002020.SZA', + '002022.SZA', + '002032.SZA', + '002033.SZA', + '002035.SZA', + '002038.SZA', + '002041.SZA', + '002047.SZA', + '002050.SZA', + '002051.SZA', + '002053.SZA', + '002056.SZA', + '002062.SZA', + '002065.SZA', + '002071.SZA', + '002078.SZA', + '002081.SZA', + '002085.SZA', + '002091.SZA', + '002094.SZA', + '002100.SZA', + '002101.SZA', + '002108.SZA', + '002116.SZA', + '002117.SZA', + '002126.SZA', + '002138.SZA', + '002139.SZA', + '002142.SZA', + '002146.SZA', + '002152.SZA', + '002158.SZA', + '002174.SZA', + '002179.SZA', + '002183.SZA', + '002185.SZA', + '002191.SZA', + '002195.SZA', + '002202.SZA', + '002203.SZA', + '002206.SZA', + '002210.SZA', + '002219.SZA', + '002221.SZA', + '002223.SZA', + '002224.SZA', + '002233.SZA', + '002236.SZA', + '002238.SZA', + '002241.SZA', + '002242.SZA', + '002245.SZA', + '002247.SZA', + '002258.SZA', + '002262.SZA', + '002271.SZA', + '002273.SZA', + '002275.SZA', + '002281.SZA', + '002285.SZA', + '002287.SZA', + '002292.SZA', + '002293.SZA', + '002294.SZA', + '002300.SZA', + '002304.SZA', + '002310.SZA', + '002311.SZA', + '002317.SZA', + '002324.SZA', + '002329.SZA', + '002343.SZA', + '002345.SZA', + '002357.SZA', + '002361.SZA', + '002367.SZA', + '002368.SZA', + '002372.SZA', + '002373.SZA', + '002376.SZA', + '002382.SZA', + '002385.SZA', + '002394.SZA', + '002396.SZA', + '002400.SZA', + '002410.SZA', + '002415.SZA', + '002419.SZA', + '002421.SZA', + '002424.SZA', + '002434.SZA', + '002436.SZA', + '002437.SZA', + '002439.SZA', + '002440.SZA', + '002444.SZA', + '002448.SZA', + '002450.SZA', + '002454.SZA', + '002460.SZA', + '002462.SZA', + '002466.SZA', + '002470.SZA', + '002475.SZA', + '002479.SZA', + '002491.SZA', + '002498.SZA', + '002503.SZA', + '002507.SZA', + '002508.SZA', + '002518.SZA', + '002531.SZA', + '002532.SZA', + '002540.SZA', + '002543.SZA', + '002548.SZA', + '002550.SZA', + '002555.SZA', + '002557.SZA', + '002561.SZA', + '002563.SZA', + '002572.SZA', + '002573.SZA', + '002581.SZA', + '002588.SZA', + '002589.SZA', + '002595.SZA', + '002597.SZA', + '002602.SZA', + '002603.SZA', + '002609.SZA', + '002614.SZA', + '002624.SZA', + '002626.SZA', + '002631.SZA', + '002635.SZA', + '002643.SZA', + '002653.SZA', + '002658.SZA', + '002662.SZA', + '002672.SZA', + '002673.SZA', + '002677.SZA', + '002681.SZA', + '002688.SZA', + '002690.SZA', + '002701.SZA', + '002705.SZA', + '002706.SZA', + '002707.SZA', + '002709.SZA', + '002711.SZA', + '002713.SZA', + '002714.SZA', + '002717.SZA', + '002718.SZA', + '002726.SZA', + '002727.SZA', + '002732.SZA', + '002736.SZA', + '002737.SZA', + '002739.SZA', + '002742.SZA', + '002745.SZA', + '002749.SZA', + '300001.SZA', + '300002.SZA', + '300003.SZA', + '300009.SZA', + '300015.SZA', + '300017.SZA', + '300026.SZA', + '300033.SZA', + '300037.SZA', + '300039.SZA', + '300043.SZA', + '300049.SZA', + '300054.SZA', + '300058.SZA', + '300066.SZA', + '300070.SZA', + '300071.SZA', + '300072.SZA', + '300075.SZA', + '300078.SZA', + '300098.SZA', + '300113.SZA', + '300115.SZA', + '300124.SZA', + '300127.SZA', + '300129.SZA', + '300136.SZA', + '300144.SZA', + '300145.SZA', + '300146.SZA', + '300166.SZA', + '300170.SZA', + '300178.SZA', + '300182.SZA', + '300183.SZA', + '300187.SZA', + '300188.SZA', + '300196.SZA', + '300197.SZA', + '300199.SZA', + '300202.SZA', + '300203.SZA', + '300204.SZA', + '300207.SZA', + '300208.SZA', + '300231.SZA', + '300232.SZA', + '300237.SZA', + '300244.SZA', + '300251.SZA', + '300253.SZA', + '300255.SZA', + '300258.SZA', + '300274.SZA', + '300284.SZA', + '300285.SZA', + '300294.SZA', + '300296.SZA', + '300303.SZA', + '300324.SZA', + '300326.SZA', + '300336.SZA', + '300339.SZA', + '300342.SZA', + '300347.SZA', + '300355.SZA', + '300357.SZA', + '300358.SZA', + '300360.SZA', + '300363.SZA', + '300365.SZA', + '300369.SZA', + '300373.SZA', + '300375.SZA', + '300376.SZA', + '300382.SZA', + '300389.SZA', + '300393.SZA', + '300394.SZA', + '300395.SZA', + '300396.SZA', + '300403.SZA', + '300406.SZA', + '300408.SZA', + '300418.SZA', + '300426.SZA', + '300429.SZA', + '300433.SZA', + '600000.SHA', + '600004.SHA', + '600007.SHA', + '600009.SHA', + '600012.SHA', + '600015.SHA', + '600016.SHA', + '600018.SHA', + '600020.SHA', + '600023.SHA', + '600029.SHA', + '600033.SHA', + '600036.SHA', + '600039.SHA', + '600048.SHA', + '600053.SHA', + '600054.SHA', + '600056.SHA', + '600060.SHA', + '600062.SHA', + '600066.SHA', + '600068.SHA', + '600079.SHA', + '600081.SHA', + '600085.SHA', + '600086.SHA', + '600094.SHA', + '600104.SHA', + '600106.SHA', + '600114.SHA', + '600115.SHA', + '600116.SHA', + '600118.SHA', + '600131.SHA', + '600133.SHA', + '600138.SHA', + '600153.SHA', + '600162.SHA', + '600167.SHA', + '600170.SHA', + '600176.SHA', + '600177.SHA', + '600180.SHA', + '600182.SHA', + '600183.SHA', + '600195.SHA', + '600196.SHA', + '600197.SHA', + '600201.SHA', + '600236.SHA', + '600240.SHA', + '600252.SHA', + '600261.SHA', + '600269.SHA', + '600270.SHA', + '600271.SHA', + '600273.SHA', + '600276.SHA', + '600285.SHA', + '600298.SHA', + '600305.SHA', + '600309.SHA', + '600312.SHA', + '600323.SHA', + '600325.SHA', + '600326.SHA', + '600329.SHA', + '600332.SHA', + '600335.SHA', + '600337.SHA', + '600340.SHA', + '600350.SHA', + '600352.SHA', + '600363.SHA', + '600373.SHA', + '600377.SHA', + '600380.SHA', + '600383.SHA', + '600388.SHA', + '600398.SHA', + '600409.SHA', + '600415.SHA', + '600418.SHA', + '600420.SHA', + '600422.SHA', + '600426.SHA', + '600436.SHA', + '600438.SHA', + '600446.SHA', + '600477.SHA', + '600479.SHA', + '600483.SHA', + '600486.SHA', + '600487.SHA', + '600498.SHA', + '600502.SHA', + '600511.SHA', + '600517.SHA', + '600518.SHA', + '600519.SHA', + '600521.SHA', + '600522.SHA', + '600523.SHA', + '600535.SHA', + '600547.SHA', + '600548.SHA', + '600562.SHA', + '600563.SHA', + '600565.SHA', + '600566.SHA', + '600571.SHA', + '600572.SHA', + '600585.SHA', + '600594.SHA', + '600597.SHA', + '600612.SHA', + '600633.SHA', + '600637.SHA', + '600639.SHA', + '600641.SHA', + '600642.SHA', + '600649.SHA', + '600660.SHA', + '600663.SHA', + '600665.SHA', + '600668.SHA', + '600674.SHA', + '600684.SHA', + '600690.SHA', + '600694.SHA', + '600697.SHA', + '600703.SHA', + '600705.SHA', + '600708.SHA', + '600717.SHA', + '600718.SHA', + '600723.SHA', + '600729.SHA', + '600741.SHA', + '600742.SHA', + '600743.SHA', + '600750.SHA', + '600761.SHA', + '600763.SHA', + '600783.SHA', + '600803.SHA', + '600804.SHA', + '600809.SHA', + '600816.SHA', + '600820.SHA', + '600823.SHA', + '600828.SHA', + '600829.SHA', + '600835.SHA', + '600843.SHA', + '600845.SHA', + '600846.SHA', + '600850.SHA', + '600867.SHA', + '600872.SHA', + '600873.SHA', + '600874.SHA', + '600885.SHA', + '600886.SHA', + '600887.SHA', + '600894.SHA', + '600895.SHA', + '600897.SHA', + '600900.SHA', + '600917.SHA', + '600965.SHA', + '600978.SHA', + '600983.SHA', + '600987.SHA', + '600988.SHA', + '600990.SHA', + '600993.SHA', + '600999.SHA', + '601000.SHA', + '601006.SHA', + '601009.SHA', + '601012.SHA', + '601098.SHA', + '601139.SHA', + '601158.SHA', + '601166.SHA', + '601169.SHA', + '601186.SHA', + '601199.SHA', + '601216.SHA', + '601231.SHA', + '601238.SHA', + '601288.SHA', + '601311.SHA', + '601313.SHA', + '601318.SHA', + '601328.SHA', + '601390.SHA', + '601398.SHA', + '601515.SHA', + '601566.SHA', + '601567.SHA', + '601601.SHA', + '601607.SHA', + '601633.SHA', + '601668.SHA', + '601669.SHA', + '601678.SHA', + '601689.SHA', + '601766.SHA', + '601799.SHA', + '601800.SHA', + '601801.SHA', + '601818.SHA', + '601888.SHA', + '601928.SHA', + '601939.SHA', + '601965.SHA', + '601988.SHA', + '601998.SHA', + '603008.SHA', + '603018.SHA', + '603020.SHA', + '603111.SHA', + '603118.SHA', + '603126.SHA', + '603158.SHA', + '603168.SHA', + '603188.SHA', + '603288.SHA', + '603306.SHA', + '603328.SHA', + '603338.SHA', + '603368.SHA', + '603369.SHA', + '603555.SHA', + '603588.SHA', + '603600.SHA', + '603609.SHA', + '603611.SHA', + '603678.SHA', + '603686.SHA', + '603698.SHA', + '603699.SHA', + '603766.SHA', + '603788.SHA', + '603806.SHA', + '603889.SHA', + '603898.SHA', + '603899.SHA', + '603969.SHA'] + +print('bigquant net_profit and roe (3years) num : {}'.format(len(bqstocks))) \ No newline at end of file diff --git a/windpyplus/stockPool/mystocks.py b/windpyplus/stockPool/mystocks.py new file mode 100644 index 0000000..be22922 --- /dev/null +++ b/windpyplus/stockPool/mystocks.py @@ -0,0 +1,7 @@ + +# myselect stocks +stocklists = ["000333.SZ","002050.SZ","002139.SZ","002008.SZ","000623.SZ", + "000915.SZ","600298.SH","300115.SZ", "600519.SH", "601318.SH","002258.SZ", + "000858.SZ","300296.SZ",'002236.SZ','002422.SZ','601231.SH',"601607.SH", + "002555.SZ","002415.SZ", "002230.SZ", "600487.SH","002456.SZ", "600373.SH"] +print(len(stocklists)) \ No newline at end of file diff --git a/windpyplus/stockSector/StockSector.py b/windpyplus/stockSector/StockSector.py new file mode 100644 index 0000000..7b97f92 --- /dev/null +++ b/windpyplus/stockSector/StockSector.py @@ -0,0 +1,62 @@ +from ..utils.tradedate import tradedate +import pandas as pd +from WindPy import w +w.start() + +def allAstock(): + data = w.wset("sectorconstituent", "date="+str(tradedate(0)[1]) , "sectorid = a001010100000000") + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + del df["date"] + df = df.set_index("wind_code") + #print(df.head()) + print("All stock Num : {} ".format(len(df))) + return df + +def allMainBoardStock(): + data = w.wset("sectorconstituent", "date="+str(tradedate(0)[1]) , "sectorid=1000007902000000") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + del df["date"] + df = df.set_index("wind_code") + #print(df.head()) + print("MSCI stock Num : {} ".format(len(df))) + return df + + +def MSCIAStock(): + data = w.wset("sectorconstituent", "date="+str(tradedate(0)[1]) , "sectorid=1000027970000000") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + del df["date"] + df = df.set_index("wind_code") + #print(df.head()) + print("MSCI stock Num : {} ".format(len(df))) + return df + +def HKToChina(): + data = w.wset("sectorconstituent","date="+str(tradedate(0)[1]) ,"sectorid=1000025141000000") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + df = df.set_index("wind_code") + del df['date'] + #print(df.head()) + print("All stock Num : {} ".format(len(df))) + return df + +def HKToSZ(): + data = w.wset("sectorconstituent","date="+str(tradedate(0)[1]) ,"sectorid=1000023475000000") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + df = df.set_index("wind_code") + #print(df.head()) + print("All stock Num : {} ".format(len(df))) + return df + +def HKToSH(): + data = w.wset("sectorconstituent","date="+str(tradedate(0)[1]) ,"sectorid=1000014938000000") + #print(data) + df = pd.DataFrame(data.Data, index= data.Fields, columns=data.Codes).T + df = df.set_index("wind_code") + #print(df.head()) + print("HK to shnaghai Num : {} ".format(len(df))) + return df diff --git a/windpyplus/stockSector/__init__.py b/windpyplus/stockSector/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/technical/RS_OH_Tech.py b/windpyplus/technical/RS_OH_Tech.py new file mode 100644 index 0000000..aceec6d --- /dev/null +++ b/windpyplus/technical/RS_OH_Tech.py @@ -0,0 +1,41 @@ +import pandas as pd +from iwindpy_plus.utils.tradedate import tradedate +from WindPy import w +w.start() + +def RS_OH(stocklists): + data = w.wss(stocklists, + "sec_name,close,pct_chg,pct_chg_lowest_per,pct_chg_highest_per,pct_chg_5d,pct_chg_10d,pct_chg_1m,pct_chg_3m,pct_chg_6m,pct_chg_1y", + "tradeDate= " +tradedate(0)[1] , "priceAdj=F;cycle=D;startDate=" + tradedate(365)[0],"endDate="+tradedate(365)[1]) + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + df = df.sort_values(by= 'PCT_CHG_1Y', ascending= False) + #print(" stock num : {}".format(len(df))) + return df + +def newHighLow(stocklists): + data = w.wss(stocklists, + "sec_name,close,history_high,history_low,stage_high,stage_low", + "tradeDate= " +tradedate(0)[1] , "priceAdj=F;n=10;m=365") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + df = df.sort_values(by= 'HISTORY_HIGH', ascending= False) + #print(" stock num : {}".format(len(df))) + return df + + +def techIndictor(stocklists, days = 0): + data = w.wss(stocklists, + "sec_name,close,ATR,BBI,BBIBOLL,BIAS,BOLL,CCI,DMA,DMI,EXPMA,MA,MACD,RC,ROC,RSI,SAR,STD,TRIX,vol_ratio", + "tradeDate=" + tradedate(days)[0] , + "priceAdj=F;cycle=D;ATR_N=14;ATR_IO=1;BBI_N1=3;BBI_N2=6;BBI_N3=12;BBI_N4=24;BBIBOLL_N=10;BBIBOLL_Width=3;BBIBOLL_IO=1;BIAS_N=12;BOLL_N=26;BOLL_Width=2;BOLL_IO=1;CCI_N=14;DMA_S=10;DMA_L=50;DMA_N=10;DMA_IO=1;DMI_N=14;DMI_N1=6;DMI_IO=1;EXPMA_N=30;MA_N=3;MACD_L=26;MACD_S=12;MACD_N=9;MACD_IO=1;RC_N=50;ROC_interDay=12;ROC_N=6;ROC_IO=1;RSI_N=6;SAR_N=4;SAR_SP=2;SAR_MP=20;STD_N=26;TRIX_N1=12;TRIX_N2=20;TRIX_IO=1;VolumeRatio_N=50") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + df['CHG_5D/3D'] = 100*(df['MA'] - df['EXPMA'])/df['EXPMA'] + df = df.sort_values(by='CHG_5D/3D', ascending = False ) + return df + +if __name__ == '__main__': + from iwindpy_plus.stockPool.mystocks import stocklists + df = newHighLow(stocklists) + print(df) + df = RS_OH(stocklists) + print(df) + diff --git a/windpyplus/technical/__init__.py b/windpyplus/technical/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/windpyplus/technical/rt_last.py b/windpyplus/technical/rt_last.py new file mode 100644 index 0000000..6e9e76b --- /dev/null +++ b/windpyplus/technical/rt_last.py @@ -0,0 +1,18 @@ +from iwindpy_plus.utils.dfToExcel import dfToExcel +import pandas as pd +from WindPy import w +w.start() + + +def rtLast(stocklists): + data = w.wsq(stocklists, "rt_last,rt_pct_chg,rt_activenetin_amt,rt_activeinvol_prop,rt_mf_ratio,rt_mf_ratio_5d,rt_mf_ratio_10d,rt_mf_ratio_20d,rt_mf_ratio_60d,rt_mf_days_5d,rt_mf_days_10d,rt_mf_days_20d,rt_mf_days_60d") + df = pd.DataFrame(data=data.Data, index= data.Fields, columns=data.Codes).T + df = df.sort_values(by= 'RT_MF_RATIO_10D', ascending= False) + print(" real last price stock num : {}".format(len(df))) + return df + +if __name__ == '__main__': + from iwindpy_plus.stockPool.mystocks import stocklists + df = rtLast(stocklists) + dfToExcel(df, 'mystocks_realTrade_stat') + diff --git a/windpyplus/technical/technicalAnalysis.py b/windpyplus/technical/technicalAnalysis.py new file mode 100644 index 0000000..95eb12d --- /dev/null +++ b/windpyplus/technical/technicalAnalysis.py @@ -0,0 +1,104 @@ +#from pandas import DataFrame, Series +import pandas as pd +from WindPy import * +import datetime +w.start() +from ..utils.tradedate import tradedate + +class PriceAnalysis(object): + """ Stock Price Analysis""" + def __init__(self, code, period): + self.code = code + self.period = period # period = days of calender + + def Price(self): + field = ["close"] + data = w.wsd(self.code, field, "ED0D", tradedate(self.period)[1]) + df = pd.DataFrame(data.Data, index=data.Times, columns=data.Codes) + df.index = ["price"] + return df + + def SecName(self): + field = ["sec_name"] + data = w.wss(self.code, field) + df = pd.DataFrame(data.Data, index=data.Fields, columns=data.Codes) + df.index = ["SNAME"] + return df + + def PriceSeries(self): + field = ["close"] + data = w.wsd(self.code, field, tradedate(self.period)[0], tradedate(self.period)[1], "Fill=Previous;PriceAdj=F") + df = pd.DataFrame(data.Data,index=data.Codes,columns=data.Times).T + return df + + def Return(self): + df = PriceAnalysis(self.code, self.period).PriceSeries() + df = (df/df.shift(1) - 1) + df_R = df.sum()*100 + return df_R + + + def MA(self): + df = PriceAnalysis(self.code, self.period).PriceSeries() + ma = df.mean() + return ma + + def OH(self): # ??? + df = PriceAnalysis(self.code, self.period).PriceSeries() + df_max = df.max() + #print(df.max) + #oh = (close/max -1)*100. + return df_max + + +def MA_Periods(code, periods_list=[7, 15, 30, 90, 182, 365, 2*365, 3*365]): + df = PriceAnalysis(code,period= 20).Price() + #print(type(df)) + #df = pd.DataFrame() + for days in periods_list: + PA = PriceAnalysis(code, days) + MA = PA.MA() + index = "MA" + str(days) + d = {index: pd.Series(MA.values, MA.index)} + df1 = pd.DataFrame(d).T + df = pd.concat([df, df1]) + #print(df) + return(df) + + +def Return_Periods(code, periods_list=[7, 15, 30, 90, 182, 365, 2*365, 3*365]): + df = PriceAnalysis(code,period= 20).SecName() + #print(type(df)) + for days in periods_list: + PA = PriceAnalysis(code, days) + chg = PA.Return() + index = "Chg_" + str(days) + d = {index: pd.Series(chg.values, chg.index)} + df1 = pd.DataFrame(d).T + df = pd.concat([df, df1]) + #print(df) + return df + + +def OH_Periods(code, periods_list=[182, 365, 3*365, 5*365, 10*365]): + + for days in periods_list: + PA = PriceAnalysis(code, days) + OH = PA.OH() + print(days) + print(OH) + +if __name__ == '__main__': + print(starttradedate(30),lasttradedate()) + code = ["002139.SZ, 002460.SZ, 600373.SH, 002422.SZ, 600516.SH, 002230.SZ, 601318.SH, 600519.SH"] + PF = PriceAnalysis(code, period=30) + df = PF.Price() + print(df) + df = PF.PriceSeries() + print(df) + + df = MA_Periods(code) + df = Return_Periods(code) + #OH_Periods(code) + + \ No newline at end of file diff --git a/windpyplus/testatom.py b/windpyplus/testatom.py new file mode 100644 index 0000000..88f8eed --- /dev/null +++ b/windpyplus/testatom.py @@ -0,0 +1,3 @@ +from WindPy import w +w.start() + diff --git a/windpyplus/utils/WindPyStart.py b/windpyplus/utils/WindPyStart.py new file mode 100644 index 0000000..6a25777 --- /dev/null +++ b/windpyplus/utils/WindPyStart.py @@ -0,0 +1,30 @@ +import subprocess +import os +from WindPy import w + +def _startWindExe(): + print("Start WindNET.exe.") + subprocess.Popen(['C:\\Wind\\Wind.NET.Client\\WindNET\\bin\\WindNET.exe']) + pass + +def _windPyStart(): + w.start() + print("w.isconnected: {}".format(w.isconnected())) + +def wConnect(): + if w.isconnected(): + print("w.isconnected: {}".format(w.isconnected())) + #continue + elif os.system('tasklist | find "wmain.exe"') == 0 : + _windPyStart() + else: + _startWindExe() + _windPyStart() + +if __name__ == '__main__': + wConnect() + + + + + diff --git a/windpyplus/utils/__init__.py b/windpyplus/utils/__init__.py new file mode 100644 index 0000000..b28b04f --- /dev/null +++ b/windpyplus/utils/__init__.py @@ -0,0 +1,3 @@ + + + diff --git a/windpyplus/utils/convertToWindCode.py b/windpyplus/utils/convertToWindCode.py new file mode 100644 index 0000000..ff4f674 --- /dev/null +++ b/windpyplus/utils/convertToWindCode.py @@ -0,0 +1,28 @@ +def convertCode(stocklists): + windCodes= [] + for s in stocklists: + #print(s) + if s.startswith('6'): + windCodes.append(s + '.SH') + else: + windCodes.append(s + '.SZ') + return windCodes + +def convertBQCode(bqstocks): + windCodes= [] + for s in bqstocks: + s = s.replace('A', '') + windCodes.append(s) + + return windCodes + +def main(): + stocklists = ['600690', '000623', '000333','601318'] + bqstocks = ['300418.SZA', '300426.SZA', '300429.SZA', '600000.SHA', '600004.SHA', + '600007.SHA', '600009.SHA',] + print(convertCode(stocklists)) + print(convertBQCode(bqstocks)) + + +if __name__ == '__main__': + main() diff --git a/windpyplus/utils/dateu.py b/windpyplus/utils/dateu.py new file mode 100644 index 0000000..3636a02 --- /dev/null +++ b/windpyplus/utils/dateu.py @@ -0,0 +1,129 @@ +# -*- coding:utf-8 -*- + +import datetime +import time +import pandas as pd +#from tushare.stock import cons as ct +#ALL_CAL_FILE = '%s%s/tsdata/calAll.csv'%(P_TYPE['http'], DOMAINS['oss']) +# +def year_qua(date): + mon = date[5:7] + mon = int(mon) + return[date[0:4], _quar(mon)] + + +def _quar(mon): + if mon in [1, 2, 3]: + return '1' + elif mon in [4, 5, 6]: + return '2' + elif mon in [7, 8, 9]: + return '3' + elif mon in [10, 11, 12]: + return '4' + else: + return None + + +def today(): + day = datetime.datetime.today().date() + return str(day) + + +def get_year(): + year = datetime.datetime.today().year + return year + + +def get_month(): + month = datetime.datetime.today().month + return month + +def get_hour(): + return datetime.datetime.today().hour + + +def today_last_year(): + lasty = datetime.datetime.today().date() + datetime.timedelta(-365) + return str(lasty) + + +def day_last_week(days=-7): + lasty = datetime.datetime.today().date() + datetime.timedelta(days) + return str(lasty) + + +def get_now(): + return time.strftime('%Y-%m-%d %H:%M:%S') + + +def int2time(timestamp): + datearr = datetime.datetime.utcfromtimestamp(timestamp) + timestr = datearr.strftime("%Y-%m-%d %H:%M:%S") + return timestr + + +def diff_day(start=None, end=None): + d1 = datetime.datetime.strptime(end, '%Y-%m-%d') + d2 = datetime.datetime.strptime(start, '%Y-%m-%d') + delta = d1 - d2 + return delta.days + + +def get_quarts(start, end): + idx = pd.period_range('Q'.join(year_qua(start)), 'Q'.join(year_qua(end)), + freq='Q-JAN') + return [str(d).split('Q') for d in idx][::-1] + + +def trade_cal(): + ''' + 交易日历 + isOpen=1是交易日,isOpen=0为休市 + ''' + df = pd.read_csv(ct.ALL_CAL_FILE) + return df + + +def is_holiday(date): + ''' + 判断是否为交易日,返回True or False + ''' + df = trade_cal() + holiday = df[df.isOpen == 0]['calendarDate'].values + if isinstance(date, str): + today = datetime.datetime.strptime(date, '%Y-%m-%d') + + if today.isoweekday() in [6, 7] or date in holiday: + return True + else: + return False + + +def last_tddate(): + today = datetime.datetime.today().date() + today=int(today.strftime("%w")) + if today == 0: + return day_last_week(-2) + else: + return day_last_week(-1) + + +def tt_dates(start='', end=''): + startyear = int(start[0:4]) + endyear = int(end[0:4]) + dates = [d for d in range(startyear, endyear+1, 2)] + return dates + + +def _random(n=13): + from random import randint + start = 10**(n-1) + end = (10**n)-1 + return str(randint(start, end)) + +def get_q_date(year=None, quarter=None): + dt = {'1': '-03-31', '2': '-06-30', '3': '-09-30', '4': '-12-31'} + return '%s%s'%(str(year), dt[str(quarter)]) + + diff --git a/windpyplus/utils/dfReadExcel.py b/windpyplus/utils/dfReadExcel.py new file mode 100644 index 0000000..76e6596 --- /dev/null +++ b/windpyplus/utils/dfReadExcel.py @@ -0,0 +1,17 @@ +import pandas as pd +from windpyplus.utils.dfToExcel import dfToExcel +def readExcel(filename, sheet_name): + + xls = pd.ExcelFile(filename) + try: + sheet_name = xls.parse(str(sheet_name)) + print(sheet_name.head()) + return sheet_name + except Exception: + print("No sheetname {}".format(sheet_name)) + + +if __name__ == '__main__': + df = readExcel("D:/Stock/wind/value5Y_20170508.xlsx", "Wind_20170508") + print(df.head()) + dfToExcel(df,"value5Y_201705") diff --git a/windpyplus/utils/dfToExcel.py b/windpyplus/utils/dfToExcel.py new file mode 100644 index 0000000..e122b67 --- /dev/null +++ b/windpyplus/utils/dfToExcel.py @@ -0,0 +1,14 @@ +from windpyplus.utils.tradedate import tradedate +import pandas as pd + +def dfToExcel(df, filename, sheet_name=tradedate(0)[-1]): + df.to_excel("D:/Stock/wind/" + str(filename) + ".xlsx", sheet_name) + print(" df save to {} .".format(filename)) + +def dftoSameWorkbook(df_lists, sheetName_lists, filename): + writer = pd.ExcelWriter(filename) + for i in range(len(df_lists)): + df_lists[i].to_excel(writer, sheetName_lists[i]) + writer.save() + print(" multiple df save to {} .".format(filename)) + diff --git a/windpyplus/utils/remind.py b/windpyplus/utils/remind.py new file mode 100644 index 0000000..a22b8aa --- /dev/null +++ b/windpyplus/utils/remind.py @@ -0,0 +1,28 @@ +import sys +import time +import subprocess +import webbrowser + +def _write_inprogress(): + sys.stdout.write("#") + sys.stdout.flush() +def _write_msg(start_msg): + sys.stdout.write(start_msg) + sys.stdout.flush() +def _play_wav(): + print('\n') + subprocess.Popen(['start', 'E:\\wav\\notify.wav'], shell = True) + time.sleep(1) + +def _openWeb(url): + webbrowser.open(url) + pass + +if __name__ == '__main__': + _write_msg('[getting start:]') + for i in range(5): + _write_inprogress() + time.sleep(1) + _play_wav() + #url = 'https://i.bigquant.com/user/romepeng/lab?' + #_openWeb(url) \ No newline at end of file diff --git a/windpyplus/utils/reportDate.py b/windpyplus/utils/reportDate.py new file mode 100644 index 0000000..881fd0d --- /dev/null +++ b/windpyplus/utils/reportDate.py @@ -0,0 +1,47 @@ +import pandas as pd +from datetime import datetime, date, timedelta +import time, calendar +from windpyplus.utils.tradedate import tradedate +from WindPy import w +w.start() + +class ReportUtils(object): + REPORTQUARTER_MD = ['03-31','06-30','09-30','12-31'] + #PROFITNOTICE_DATE + PROFITNOTICE_Q1_MD = ['01-23','04-30'] + PROFITNOTICE_Q2_MD = ['04-08','08-30'] + PROFITNOTICE_Q3_MD = ['07-15','10-31'] + PROFITNOTICE_Q4_MD = ['08-01','04-27'] + + + + @classmethod + def reportDate(cls): + now = datetime.now().date() + print(now) + print(now.year, now.month, now.day) + reportdate = now + return reportdate + + @classmethod + def forecastReportDate(cls): + + + + pass + + + + +now = time.localtime() +print(now) +last_month = now[1] - 1 or 12 +next_month = (now[1] + 3) % 12 or 12 +print (last_month) +print (next_month) + + + +if __name__ == '__main__': + ReportUtils().reportDate() + ReportUtils().forecastReportDate() diff --git a/windpyplus/utils/tradedate.py b/windpyplus/utils/tradedate.py new file mode 100644 index 0000000..dbf533b --- /dev/null +++ b/windpyplus/utils/tradedate.py @@ -0,0 +1,27 @@ +from datetime import datetime, timedelta +from WindPy import w +w.start() + +def tradedate(days=30): + lastdate = datetime.now().date() + starttradedate = (datetime.now() - timedelta(days)).date() + + if lastdate.weekday() == 5 or lastdate.weekday() == 6: + lasttradedate = w.tdaysoffset(0, lastdate).Data[0][0].date() + else: + lasttradedate = w.tdaysoffset(-1, lastdate).Data[0][0].date() + if starttradedate >= lasttradedate: + starttradedate = lasttradedate + else: + pass + return (str(starttradedate), str(lasttradedate)) + + +def futuredate(days=30): + lastdate = datetime.now().date() + futuredate = datetime.now().date() + timedelta(days) + futuretradedate = w.tdaysoffset(0, futuredate).Data[0][0].date() + return (str(lastdate), str(futuredate), str(futuretradedate)) + + + diff --git a/windpyplus/windpyplus.py b/windpyplus/windpyplus.py index 7fbbae4..dfdb775 100644 --- a/windpyplus/windpyplus.py +++ b/windpyplus/windpyplus.py @@ -1,3 +1,41 @@ # -*- coding: utf-8 -*- """Main module.""" +#import sys +#sys.path.append(" D:\\windpyplus") + +#import site; site.getsitepackages() +import pandas as pd + +import windpyplus + +#from windpyplus.stockSector.StockSector import allAstock, MSCIAStock +from windpyplus.fundamental.foreCastWind import foreCastWind +from windpyplus.utils.convertToWindCode import convertBQCode, convertCode +from windpyplus.utils.dfToExcel import dftoSameWorkbook, dfToExcel +from windpyplus.fundamental.valucation import valucationWind + +allastocks = list(allAstock().index.values) + + +def fiter_ForecastValucation(qt = '20170630', CHG_MIN= 7): + allastocks = list(allAstock().index.values) + df = foreCastWind(allastocks, qt) + df = df[df['PROFITNOTICE_CHANGEMEAN'] > CHG_MIN] + print(df.head()) + + stocklists = df.index.values + df_V = valucationWind(stocklists) + print(df_V.head()) + df_f = pd.merge(df_V,df, how='left') + + dfToExcel(df_f, "filter_valucation_forecast_"+ str(qt)+"_"+ str(CHG_MIN)) + print('num of filter_forecastValucation : {}'.format(df_f)) + return df_f + +if __name__ == '__main__': + + df =fiter_ForecastValucation(CHG_MIN= 10) + print(df) + + print(tradedate(0)) diff --git a/windpyplus_fundamental_test.py b/windpyplus_fundamental_test.py new file mode 100644 index 0000000..9d06666 --- /dev/null +++ b/windpyplus_fundamental_test.py @@ -0,0 +1,18 @@ +from windpyplus.stockPool.mystocks import stocklists +from windpyplus.stockSector.StockSector import allAstock, HKToChina, allMainBoardStock +from windpyplus.fundamental.fundamentalWind import financialDataWind, netProfit_filter, ROE_filter, growth_filter, cashFlow_filter, multi_filter +from windpyplus.utils.dfToExcel import dfToExcel + + +print(stocklists) +#print(ROE_filter(stocklists, 8)) +#print(netProfit_filter(stocklists, 1.5e+8)) +#print(growth_filter(stocklists, 5)) +print(multi_filter(stocklists)) + +stock_hktochina = list(HKToChina().index.values) + +df_mylist = financialDataWind(stocklists) +dfToExcel(df_mylist, 'mystock_finacial') +dfToExcel(financialDataWind(multi_filter(list(allAstock().index))), 'allstock_filter') + diff --git a/windpyplus_tecnical.py b/windpyplus_tecnical.py new file mode 100644 index 0000000..caed20a --- /dev/null +++ b/windpyplus_tecnical.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- + +import pandas as pd + +from windpyplus.utils.tradedate import tradedate +from windpyplus.stockSector.StockSector import allAstock, MSCIAStock +from windpyplus.fundamental.foreCastWind import foreCastWind +from windpyplus.utils.convertToWindCode import convertBQCode, convertCode +from windpyplus.utils.dfToExcel import dftoSameWorkbook, dfToExcel +from windpyplus.fundamental.valucation import valucationWind +from windpyplus.stockPool import mystocks +from windpyplus.technical.technicalAnalysis import MA_Periods, Return_Periods + +allastocks = list(allAstock().index.values) + +def tecnical_filter(stocks): + df_MA = MA_Periods(stocks) + df_R = Return_Periods(stocks) + print(df_MA) + print(df_R) + #return df + + +if __name__ == '__main__': + + tecnical_filter(mystocks.stocklists) diff --git a/windpyplus_test.py b/windpyplus_test.py new file mode 100644 index 0000000..c06609f --- /dev/null +++ b/windpyplus_test.py @@ -0,0 +1,38 @@ +# -*- coding: utf-8 -*- + +import pandas as pd + +from windpyplus.utils.tradedate import tradedate +from windpyplus.stockSector.StockSector import allAstock, MSCIAStock +from windpyplus.fundamental.foreCastWind import foreCastWind +from windpyplus.utils.convertToWindCode import convertBQCode, convertCode +from windpyplus.utils.dfToExcel import dftoSameWorkbook, dfToExcel +from windpyplus.fundamental.valucation import valucationWind +from windpyplus.fundamental.fundamentalWind import financialDataWind, netProfit_filter, ROE_filter, growth_filter, cashFlow_filter, multi_filter + +allastocks = list(allAstock().index.values) + + +def fiter_ForecastValucation(qt = '20170930', CHG_MIN= 7): + allastocks = list(allAstock().index.values) + df = foreCastWind(allastocks, qt) + df = df[df['PROFITNOTICE_CHANGEMEAN'] > CHG_MIN] + print(df.head(10)) + + stocklists = df.index.values + df_V = valucationWind(stocklists) + print(df_V.head(10)) + df_f = pd.merge(df_V,df, how='left') + + dfToExcel(df_f, "filter_valucation_forecast_"+ str(qt)+"_"+ str(CHG_MIN)) + print('num of filter_forecastValucation : {}'.format(df_f)) + return df_f + +if __name__ == '__main__': + print(tradedate()) + df = fiter_ForecastValucation(qt= '20170930',CHG_MIN= 30) + + #stocks_muiltfilter = multi_filter(list(df.index.values), ) + #df = financialDataWind(stocks_muiltfilter) + #print(df) +