数据收集:
#期权数据收集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数据内容如下:

此时便可获得满足条件的期权数据。用于后续的校验。
郑重声明: 本文只是个人(本单位)复盘记录,文内提到的所有信息仅为分享和盘面结构梳理,不构成投资或投机建议,买卖自行决策,结果自己负责。
购买点数和充值VIP全部支持支付宝或微信扫码支付,登陆会员中心侧面板>>财务选择相关操作即可。
在线预览主旨方便移动设备使用和临时查看,直观浏览,对需要的文章再下载,预览了的文件且能秒速下载。
阅读与下载说明
1.『会员阅览(扣点)』为普通会员扣点(1元=1点)通道,已浏览过的只扣一次。
2.『VIP阅览 (VIP)』 为VIP特权通道,充值成VIP用户直接无任何限制高速在线阅览,VIP会员分包月,包年和终身VIP三种。
3.『免费阅览(免费)』为未付费会员通道,可无任何限制免费阅览该资源,推荐购买点数或充值VIP,以获取超值资源。
4. 阅览的资讯文件过大,根据您的网速而会有相应的延迟,请耐心等待;如果提示其他问题请联系客户解决。
购买点数和充值VIP全部支持支付宝或微信扫码支付,登陆会员中心侧面板>>财务选择相关操作即可。
在线预览主旨方便移动设备使用和临时查看,直观浏览,对需要的文章再下载,预览了的文件且能秒速下载。