import pandas as pd
import numpy as np
from WindPy import *
w.start()
w.isconnected()
(1)设置当前的日期
import datetime
now_day = datetime.datetime.now().strftime('%Y-%m-%d') #得到的当前日期,是字符串格式
(2)得到上月的天数
import calendar
last_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 = 0
stock_position_down = 0
if zz800_pb > qt_dot90:
stock_position_down = 0
stock_position_up = 0.45
elif zz800_pb > qt_dot75 and zz800_pb < qt_dot90:
stock_position_down = 0.1
stock_position_up = 0.55
elif zz800_pb > qt_dot25 and zz800_pb < qt_dot75:
stock_position_down = 0.35
stock_position_up = 0.80
else:
stock_position_down = 0.55
stock_position_up = 1
print("基金:本月股票仓位下限为 %s,本月股票仓位上限为 %s. " % (stock_position_down, stock_position_up))
(1)可以进一步优化,上月最后一天的日期取法存在漏洞。
(2)月数为两位数时,存在取数的漏洞。
(3)WinPy取数的代码可以用代码生成器辅助进行。