数据清洗,筛选

本人在私募,负责数据收集以及清洗,就是包括收集数据,按照领导要求,选出满足条件的数据,用于校验策略是否正确。
现在就在这进行代码上传,即用于自己总结整理,也用于供大家学习了解,实习生到底干什么事。
数据收集:
#期权数据收集
import akshare as ak
import pandas as pd
import numpy as np
import datetime
import time
#用于将千分位数字改为常规数字
from  locale import atof
# 显示所有列
pd.set_option('display.max_columns', None)
# 显示所有行
pd.set_option('display.max_rows', None)
#收集数据,铁矿石期权的全部数据
start = '2019-02-09'
#获得全部的交易日数据
dates  = ak.tool_trade_date_hist_sina() 
today = time.strftime("%Y-%m-%d")
#筛选符合条件的日期
dates = dates.loc[(dates['trade_date']>start)&(dates['trade_date']<today)] 
#创建储存数据的DF
last = pd.DataFrame()
last_2 = pd.DataFrame()
#循环获取数据
for i in range(len(dates)):
    date = dates.iloc[i, 0]
    #print(date)
    # 获取当天所有合约
    part_1, part_2 = ak.get_dce_option_daily(trade_date= i, symbol="铁矿石期权")
    #print(part_1.head())
    #print(part_2.head())
    #增加日期,cp,年份,月份,行权价,
    part_1['date'] = date
    part_1['cp'] = part_1['合约名称'].apply(lambda x: x[6:7])
    part_1['year'] = part_1['合约名称'].apply(lambda x: x[1:3])
    part_1['o_month'] = part_1['合约名称'].apply(lambda x: x[3:5])
    part_1['xqj'] = part_1['合约名称'].apply(lambda x: x[8:]) 
    part_1['合约系列'] = part_1['合约名称'].apply(lambda x: x[0:5])
    #以日期作为index
    part_1.set_index('date',inplace=True)
    last = last.append(part_1)

    part_2.columns = [['合约系列','IV']]
 	#增加日期,年份,月份
    part_2['date'] = date
    part_2.set_index('date')
    part_2['year'] = part_2['合约系列'].apply(lambda x: x[1:3])
    part_2['month'] = part_2['合约系列'].apply(lambda x: x[3:])
    last_2 = last_2.append(part_2)
#保存数据,为方便读者复现,使用csv。(真实情况,直接存入sql数据库,各种报错,各种坑,数据缺失,格式不正确............)
last.to_csv('i.csv')
last_2.to_csv('i2.csv')

数据处理:

df = pd.read_csv('i.csv')
#默认期权持仓量为1,999这种千分位数字格式。
setlocale(LC_NUMERIC, 'English_US')
df['持仓量'] = df['持仓量'].apply(lambda x:atof(x))

#根据每天的主力合约数据信息,筛选最虚值合约,分为C,P两块,且持仓量最大。
#举例:今天c端最虚c5800,持仓量1w,为c端最大持仓量,则符合条件保留。
def select_xu(df):
    df_c = df.loc[df['cp'] == 'C']
    #根据行权价排序,获得最虚值,C端取最大值。
    dfc = df_c.sort_values(by='xqj',ascending=True).tail(1)
#     print(df_c)
#     print(dfc)
#     print('-'*20)
    df_p = df.loc[df['cp']=='P']
    #根据行权价排序,获得最虚值,p端取最小值。
    dfp = df_p.sort_values(by='xqj',ascending=True).head(1)
#     print(df_p)
#     print(dfp)
    if max(dfc['持仓量']) == max(df_c['持仓量']) :
        dfc = dfc
    else:
        dfc = None
    if max(dfp['持仓量']) == max(df_p['持仓量']) :
        dfp = dfp
    else:
        dfp = None
    return dfc ,dfp
#目标,里面为日期和年份,月份
dfd = pd.read_excel('I.xlsx') 
last = pd.DataFrame()
last1 = pd.DataFrame()
last2 = pd.DataFrame()
if __name__ == '__main__':
    for i in range(len(dfd)):
        year = dfd.iloc[i,-2]
        month = dfd.iloc[i,-1]
        date = dfd.iloc[i,0]
        #筛选数据
        d = df.loc[(df['year']==int(year))&(df['o_month']==int(month))&(df['date']==datetime.datetime.strftime(date,'%Y-%m-%d'))]
       #如果数据不为空
        if len(d)>0:
            dfc,dfp =select_xu(d)
            if dfc is not None and dfp is not None:
                s = pd.merge(dfc,dfp)
                last = last.append(s)
            elif dfc is  None and dfp is not None :
                s = dfp
                last1 = last1.append(s)
            elif dfc is not None and dfp is  None :
                s = dfc
                last2 = last2.append(s)
            else:
                s = None
        else:
            pass
    last.to_csv('i0.csv')
    last1.to_csv('i1.csv')
    last2.to_csv('i2.csv')

I.xlsx数据内容如下:
dfd数据格式
此时便可获得满足条件的期权数据。用于后续的校验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神出鬼没,指的就是我!

必须花钱,数据超好

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值