Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added README
Empty file.
1 change: 1 addition & 0 deletions installwindpy.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
D:\Anaconda3\envs\windpyplus\python.exe "C:\Wind\Wind.NET.Client\WindNET\bin\installWindPy.py" "C:\Wind\Wind.NET.Client\WindNET"
4 changes: 2 additions & 2 deletions requirements_dev.txt
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -8,4 +9,3 @@ coverage==4.1
Sphinx==1.4.8
cryptography==1.7
PyYAML==3.11

19 changes: 19 additions & 0 deletions tests.py
Original file line number Diff line number Diff line change
@@ -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))
2 changes: 2 additions & 0 deletions windpyplus/Scripts/activate
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
source D:\Anaconda3\Scripts\activate "$@"
2 changes: 2 additions & 0 deletions windpyplus/Scripts/activate.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
call "D:\Anaconda3\Scripts\activate" %*
2 changes: 2 additions & 0 deletions windpyplus/Scripts/conda
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
D:\Anaconda3\Scripts\conda.exe "$@"
2 changes: 2 additions & 0 deletions windpyplus/Scripts/conda.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
call "D:\Anaconda3\Scripts\conda" %*
2 changes: 2 additions & 0 deletions windpyplus/Scripts/deactivate
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
#!/usr/bin/env bash
source D:\Anaconda3\Scripts\deactivate "$@"
2 changes: 2 additions & 0 deletions windpyplus/Scripts/deactivate.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
@echo off
call "D:\Anaconda3\Scripts\deactivate" %*
3 changes: 2 additions & 1 deletion windpyplus/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

"""Top-level package for windpyplus."""

__author__ = """rome peng"""
__author__ = "rome peng"
__email__ = 'romepeng@outlook.com'
__version__ = '0.1.0'

Empty file added windpyplus/concept/__init__.py
Empty file.
25 changes: 25 additions & 0 deletions windpyplus/concept/foreCast.py
Original file line number Diff line number Diff line change
@@ -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")
21 changes: 21 additions & 0 deletions windpyplus/concept/sector.py
Original file line number Diff line number Diff line change
@@ -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))


31 changes: 31 additions & 0 deletions windpyplus/fundamental/IForcast.py
Original file line number Diff line number Diff line change
@@ -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)
Empty file.
18 changes: 18 additions & 0 deletions windpyplus/fundamental/financialReport.py
Original file line number Diff line number Diff line change
@@ -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
27 changes: 27 additions & 0 deletions windpyplus/fundamental/foreCastWind.py
Original file line number Diff line number Diff line change
@@ -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




86 changes: 86 additions & 0 deletions windpyplus/fundamental/ftpsync.settings
Original file line number Diff line number Diff line change
@@ -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

}
91 changes: 91 additions & 0 deletions windpyplus/fundamental/fundamentalWind.py
Original file line number Diff line number Diff line change
@@ -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))

Loading