20200607:根据中证800指数最近十年历史P/b分位数确认基金目标仓位

1.导入需要的模块,尤其连接wind数据模块WindPy

import pandas as pd
import numpy as np
from WindPy import *
w.start()
w.isconnected()

2.中证800指数P/b历史分位数情况并判断基金目标仓位

(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))

3. 小结

(1)可以进一步优化,上月最后一天的日期取法存在漏洞。
(2)月数为两位数时,存在取数的漏洞。
(3)WinPy取数的代码可以用代码生成器辅助进行。

你可能感兴趣的:(项目实施)