1.导入需要的模块,尤其连接wind数据模块WindPy
import pandas as pdimport numpy as npfrom WindPy import *w.start()w.isconnected()
2.中证800指数P/b历史分位数情况并判断基金目标仓位
(1)设置当前的日期
import datetimenow_day = datetime.datetime.now().strftime('%Y-%m-%d') #得到的当前日期,是字符串格式
(2)得到上月的天数
import calendarlast_month_days = calendar.monthrange(int(now_day[0:4]), int(now_day[5:7])-1) #上上个月最后天的星期数和得到上月的天数及,返回值是元组last_month_days = last_month_days[1] #得到上月的天数,元组的引用同列表
(3)设定好上月最后一天的日期
last_month_lastday = now_day[0:6] + str(int(now_day[6:7])-1) + '-' + str(last_month_days) #字符串拼接成了上个月最后一天的具体日期,有漏洞的
(4)返回上月末最后一天的中证800指数市净率P/B数据
`zz800_pb = w.wsd("000906.SH", "pb_lf", "ED0TD", last_month_lastday, "")` #设定好最后一天,取相对日期,起始日为上追溯0交易日
zz800_pb = round(sum(zz800_pb.Data,[])[0], 4)
(5)返回中证800指数(000906.SH)最近十年的市净率p/b历史数据
data = w.wsd("000906.SH", "pb_lf", "ED-10Y", last_month_lastday, "")df = pd.DataFrame(sum(data.Data, []), index=data.Times, columns=['P/b'])df.index.name = 'date'
(6)可以得到过去十年每日P/B分位数排名情况
qt_dot90 = round(df.quantile(0.9)[0], 4)qt_dot75 = round(df.quantile(0.75)[0], 4)qt_dot25 = round(df.quantile(0.25)[0], 4)
(7)判断上月末最后一天的分位数与最近十年市净率大小情况,选定本月的仓位上限情况
stock_position_up = 0stock_position_down = 0if zz800_pb > qt_dot90:stock_position_down = 0stock_position_up = 0.45elif zz800_pb > qt_dot75 and zz800_pb < qt_dot90:stock_position_down = 0.1stock_position_up = 0.55elif zz800_pb > qt_dot25 and zz800_pb < qt_dot75:stock_position_down = 0.35stock_position_up = 0.80else:stock_position_down = 0.55stock_position_up = 1print("基金:本月股票仓位下限为 %s,本月股票仓位上限为 %s. " % (stock_position_down, stock_position_up))
3. 小结
(1)可以进一步优化,上月最后一天的日期取法存在漏洞。
(2)月数为两位数时,存在取数的漏洞。
(3)WinPy取数的代码可以用代码生成器辅助进行。