单因子——数据Wind
读取数据
import time
date = time.strftime("%Y-%m-%d")
date = date.replace("'", "")
from WindPy import *
import pandas as pd
import numpy as np
from pymongo import MongoClient
w.start()
w.isconnected()
import time
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor, as_completed
import json
连接数据库
host ='xxx.xxx.x.xx'
port='27017'
user='xxxx'
code='utf8utf8'
uri= "mongodb://"+user+":"+code+"@"+host+":"+port+"/"+"?authMechanism=SCRAM-SHA-1"
client=MongoClient(uri)
db = client['CN_Stock']
collection = db['Wind_Close_Price']
获取Wind中A股公司列表
A_list = w.wset("sectorconstituent","date=2019-07-30;sectorid=a001010100000000",usedf=True)
A_list = A_list[1]#取dataframe部分
多线程
df = pd.DataFrame(columns = ['wind_code','close','volume','amt','total_shares'] )
df['wind_code'] = A_list['wind_code']
df_list = A_list.copy()
#定义多线程函数
def applyParallel(dfGrouped, func):ppe = ThreadPoolExecutor(10)#设置线程池中最多能同时运行的线程数目futures = []results = []for name, group in dfGrouped:p = ppe.submit(func, group)#提交函数和变量,立即返回futures.append(p)for future in as_completed(futures):r = future.result()results.append(r)return pd.concat(results)#合并表
#定义获取股票价格函数
def get_price(df_list):stk = df_list['wind_code'].iloc[0]collection = db['Wind_Data_Raw_Price_Daily']Adjust_Price_Daily = pd.DataFrame()try:data2 = w.wsd(stk, "close,industry_csrc12_n", "2018-01-10", "2019-08-08","industryType=1;PriceAdj=F",usedf=True)data2 = data2[1]#前复权价格data2['wind_code']= stkAdjust_Price_Daily = pd.concat([Adjust_Price_Daily,data2]) time.sleep(0.5)print("done2_"+stk)except:print('error_no_record'+stk)df['state']= 'error_no_record'return Adjust_Price_Dailydf_list['rank'] = df_list.index
t1=time.time()
Adjust_Price_Daily_temp = applyParallel(df_list.groupby('rank'), get_price)
t2=time.time()
print(t2-t1)
Adjust_Price_Daily.index = range(len(Adjust_Price_Daily))
#某只股票的价格走势图
Adjust_Price_Daily[(Adjust_Price_Daily['wind_code'] == '000001.SZ')].plot(y=['CLOSE'])
collection.drop()
collection.insert_many(json.loads(Adjust_Price_Daily.T.to_json()).values())
清洗数据,标准化
Adjust_Price_Daily['date'] = Adjust_Price_Daily.index
Adjust_Price_Daily.dropna(axis=0, how='any', inplace=True)#去掉有空值的行
Adjust_Price = Adjust_Price_Daily.pivot( index='date',values='CLOSE', columns='wind_code')#将SQL格式转化为DataFrame格式
Adjust_Price.dropna(axis=1, how='any', inplace=True)
df_r = Adjust_Price.iloc[:,:]/Adjust_Price.iloc[:,:].shift(1)-1#获得每只股票每天的回报率
df_m = Adjust_Price.iloc/Adjust_Price.iloc.shift(30)#获得股票30天动量
df_m.dropna(axis=0, how='any', inplace=True)
df_r.dropna(axis=0, how='any', inplace=True)
将动量作为因子
data_all = pd.DataFrame()for i in range(len(df_m)):print (i)df_1= df_m.iloc[i:i+1,:]df_1 = df_1.Tdf_1.columns = ['m_fz']q0,q1,q2,q3,q4,q5 = df_1['m_fz'].quantile([0,0.2,0.4,0.6,0.8,1.0])#获取分位点bins = [q0-1,q1, q2, q3, q4, q5+1] labels=['1', '2', '3', '4', '5']df_1 = pd.cut(df_1.m_fz, bins,right=True,labels=labels) #将股票分为五组df_2= df_r.iloc[i+15:i+16,:]df_2 = df_2.Tdf = pd.concat([df_1,df_2],axis=1)#获得一个df,有组别和return值data = df.groupby('m_fz').mean()#加入5-1,4-2data_51 = data.iloc[4]-data.iloc[0]data_42 = data.iloc[3]-data.iloc[1]data = data.append(data_51,ignore_index=True)data = data.append(data_42,ignore_index=True) data_all = pd.concat([data_all,data],axis = 1)data_all.index = ['1','2','3','4','5','5-1','4-2']
data_all = data_all.Tpic = (1+data_all).cumprod().plot()#画图
接下来以vol波动率为因子
df_vol = df_r.rolling(30).std()*(252**0.5)#年化利率
df_vol.dropna(axis=0, how='any', inplace=True)data_all = pd.DataFrame()
for i in range(len(df_vol)):print (i)df_1= df_vol.iloc[i+15:i+16,:]df_1 = df_1.Tdf_1.columns = ['v_fz']q0,q1,q2,q3,q4,q5 = df_1['v_fz'].quantile([0,0.2,0.4,0.6,0.8,1.0])bins = [q0-1,q1, q2, q3, q4, q5+1] labels=['1', '2', '3', '4', '5']df_1 = pd.cut(df_1.v_fz, bins,right=True,labels=labels) df_2= df_r.iloc[i:i+1,:]df_2 = df_2.Tdf = pd.concat([df_1,df_2],axis=1)data = df.groupby('v_fz').mean()data_51 = data.iloc[4]-data.iloc[0]data_42 = data.iloc[3]-data.iloc[1]data = data.append(data_51,ignore_index=True)data = data.append(data_42,ignore_index=True) data_all = pd.concat([data_all,data],axis = 1)data_all = data_all.T
data_all.columns = ['1','2','3','4','5','5-1','4-2']
data_all.head()(1+data_all).cumprod().plot()#画图
加入行业对冲
df_Industry = pd.read_excel('首先有一个行业列表的excel.xlsx',encoding='utf-8')#读取行业,当然这个也是wind下的
df_Industry.columns=['wind_code','Industry']
df_Industry.dropna(axis=0, how='any', inplace=True)
#result = df_Industry.values.tolist()
Adjust_Price_Daily['date'] = Adjust_Price_Daily.index
Adjust_Price_Daily = pd.merge(Adjust_Price_Daily,df_Industry,on='wind_code')
Adjust_Price_Daily.dropna(axis=0, how='any', inplace=True)
#获取行业list
Industry = df_Industry['Industry'].unique()
Industry = Industry.tolist()
#根据行业分组,选取每个行业表现最好的一组
data_all = pd.DataFrame()
data_al = pd.DataFrame()
for ind in Industry:print(ind)df = Adjust_Price_Daily[Adjust_Price_Daily['Industry']==ind]df = df.pivot( index='date',values='CLOSE', columns='wind_code')df.dropna(axis=1, how='any', inplace=True)df_r = df.iloc[:,:]/df.iloc[:,:].shift(1)-1df_m = df/df.shift(30)df_m.dropna(axis=0, how='any', inplace=True)df_r.dropna(axis=0, how='any', inplace=True)for i in range(len(df_m)):print (i)df_1= df_m.iloc[i:i+1,:]df_1 = df_1.Tdf_1.columns = ['m_fz']if len(df_1)<5:data = df_r.maxelse: q0,q1,q2,q3,q4,q5 = df_1['m_fz'].quantile([0,0.2,0.4,0.6,0.8,1.0])bins = [q0-1,q1, q2, q3, q4, q5+1] labels=['1', '2', '3', '4', '5']df_1 = pd.cut(df_1['m_fz'], bins,right=True,labels=labels) df_2= df_r.iloc[i+15:i+16,:]df_2 = df_2.Tdf_3 = pd.concat([df_1,df_2],axis=1)data = df_3.groupby('m_fz').mean()data = data.iloc[4]data_al = pd.concat([data_all,data],axis=1)data_all = pd.concat([data_all,data_al],axis=1)data_all.index = ['1','2','3','4','5','5-1','4-2']
data_all = data_all.T
(1+data_all).cumprod().plot()
单因子——数据Wind相关推荐
- 量化投资之多因子选股(一):数据准备与单因子检验
文章目录 前言 系列文章 矢量化选股回测概述 要点1:数据格式 要点2:股票池 要点3:剔除ST股.停盘股.涨跌停 要点4: 仓位构建 要点5:回测 数据准备 单因子检测 样例 前言 本菜狗现在是哈工 ...
- 方差分析的MATLAB实现(单因子)
单因子方差分析是比较俩组或多组数据的均值,它返回原假设--均值相等的概率,在matlab中我们可以用函数anova1进行单因子方差分析. 函数anova1 格式: p=anova1(X) %X的各列为 ...
- UA MATH571A QE练习 R语言 单因子试验的回归分析
UA MATH571A QE练习 R语言 单因子试验的回归分析 2015年5月的第六题是单因子试验,因为历年只有这一道,所以单独做一下. 土壤中的硅主要以硅酸盐矿物的形式存在,受成土母质和成土过程的影 ...
- pb 如何导出csv_backtrader如何加载股票因子数据?以换手率、市盈率为例进行回测【附Python代码】
1引言 关于backtrader,公众号已连续发布了三篇推文:<[手把手教你]入门量化回测最强神器backtrader(一)>.<[手把手教你]入门量化回测最强神器backtrade ...
- 量化交易之单因子策略
量化交易之单因子策略 单因子策略 小市值选股策略 移动平均线:如何躲过股灾和大跌 『布带林线:衡量市场的波动性/趋势』 单因子策略 你知道剩男剩女是如何剩下的吗? 许多年后,他们都一样,都会发现自己其 ...
- python行业中性_单因子测试(上)——因子中性化
之前做了很多因子测试的工作,但一直没有总结,感觉很凌乱,决定花时间把这部分东西写一写,温故知新,也为后续学习打基础.首先写一下单因子测试部分,分三篇,数据预处理一篇, 回归法一篇,分层测试法一篇.本篇 ...
- 中信期货财务因题专题报告:财务因子之单因子测试
中信期货财务因题专题报告:财务因子之单因子测试 报告时间:2022-02-09 R语言 Python 量化选股 因子选股 pandas numpy seasonal plotly 文章目录 中信期货财 ...
- 【ML】线性回归 [单因子](LinearRegression)实践(基于sklearn)
[ML]线性回归 [单因子](LinearRegression)实践(基于sklearn) 数据准备 读取数据 绘制图表(观察数据规律) 数据处理 模型训练 预测 评估(MSE,R2) 图形展示结果 ...
- 量化交易 实战第七课 单因子 IC 分析
量化交易 实战第七课 单因子 IC 分析 概述 代码实现 导包 1. 准备因子数据 2. 准备价格数据 3. 生成通用 Alphalens 结构 4. 计算因子 因子 IC 结果分析 时间序列图和移动 ...
最新文章
- 【swjtu】数据结构实验_二叉树的字符图形显示程序(半期)
- 深掘市场 开拓机遇 西部数据将亮相2014年北京安博会
- flask request (request.files)
- 电子管计算机的操作者是谁,大一计算机第一学期考试重点及相应习题 作者
- 职场中一路走来却拂不去一丝失落——一个女IT的告白
- 漫游Kafka设计篇之主从同步
- python显示数据长度_python – 获取CSV的长度以显示进度
- ranger管mysql_添加Kafka的Ranger访问权限策略
- mysql show 存储过程_mysql 存储过程 show errors
- matlab检查错误 函数,检查代码中的错误和警告
- CentOS6.x 下 LNMP环境搭建(二、安装 Nginx)
- 用c++实现一个插入,删除和随机访问都是O(1)的容器(剑指||30)
- easyui弹出加载遮罩层(转)
- 苹果Mac系统无法输入密码的解决办法
- 集成电路模拟版图入门-版图基础学习笔记(五)
- 如何把照片裁剪成证件照指定尺寸比例?
- timestamp显示毫秒_TimeStamp 毫秒和纳秒
- P3456 [POI2007]GRZ-Ridges and Valleys(bfs)
- 电子信息工程求职目标_应用电子专业求职信范文合集6篇
- 基于腾讯云实时音视频(TRTC)的web端 多人人脸识别小游戏