第一段量化决策代码

碎碎念

心心念念的量化决策念叨了好久,前段时间终于把excel版的决策模板做出来了,但是一遍遍手动录入市价数据太繁琐,这周利用闲暇学习python,终于写出了自己的第一段量化决策代码。

没有图的道理都是耍流氓,话不多说,上图!


持仓一览
量化决策

平台选择

前期简单了解了一下,目前国内主流的量化平台如下:

  • 优矿(Uqer)
  • 万矿(Wind Quant)
  • 聚宽(JoinQuant)
  • BigQuant
  • 文华财经
  • 同花顺Mind Go
  • 米筐(RiceQuant)
  • 掘金量化

优矿是最早做的,但是近一年社区没那么活跃了;
万矿依托国内最强大的金融数据端wind提供数据支持;
聚宽社区挺活跃的,但是用了几天感觉用户体验不太好,尤其是新手接入这块儿存在断层。

思虑再三,决定从万矿入手,毕竟有wind的数据支持,数据可靠性还是很有保证的。

设计思路

小插曲

因为上周五刚接触python,对这块还不够熟悉,加之对pandas、numpy等数据操作库的生疏,决定从excel开始构建数据,而非在python中从0开始捏数据。

之前设计的excel模板有些不适合代码读取后提取有用信息,故做了简单的整理改造,改造后各表结构如下:

标的池
标的持仓
调仓参数
调仓决策

整体思路:

  1. 读取excel,提取各表数据
  2. 根据'标的池'表代码,查询各标的最新 市价
  3. 结合'标的持仓'表持仓数,计算最新 持仓市值
  4. 根据持仓情况,计算 当前仓位
  5. 结合当前仓位、目标仓位和'调仓参数'表的配置,计算 动态仓位
  6. 根据调仓参数表的可分配资金和持仓市值计算 可分配价值
  7. 根据可分配价值和动态仓位确定 目标市值
  8. 再借此计算 价值偏移应调仓数调仓金额

代码实现

  1. 引入万矿依赖并建立连接
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

# 引入万矿依赖并建立连接
from WindPy import *
w.start(show_welcome = False)
  1. 引入pandas依赖,用以数据处理
# 引入pandas依赖,用以数据处理
import pandas as pd
  1. 定义持仓处理函数:获取市价,计算最新持仓市值
# 处理持仓
def work_flow1(stockpool,positions):
    codes=stockpool['代码'].tolist()
    # 获取行情
    error,prices=w.wsq(codes, 'rt_last', "func=DemoWSQCallback", usedf=True)
    assert error ==0 , "API数据提取错误,ErrorCode={},具体含义请至帮助文档附件《常见API错误码》中查询。".format(error) 
    # 行情数据处理:拼接市价、计算持仓市值
    positions=pd.merge(positions,prices,left_on='代码', right_index=True, how='left')
    positions['市价']=positions.pop('RT_LAST')
    positions['持仓市值'] = positions.apply(lambda r: round(r['市价'] * r['持仓数']),axis=1)
    return positions
  1. 定义决策处理函数:根据持仓情况和调仓配置,作出调仓决策
# 处理决策
def work_flow2(positions,param,decision):
    market_cap = positions['持仓市值'].sum()  # 持仓市值合计
    step = param.loc[param['名称'] == '调整步数']['值'].iloc[0] # 分步数
    amt = param.loc[param['名称'] == '当次投入额']['值'].iloc[0] # 手头现金
    value_cap=market_cap+amt        # 可支配价值
    print('持仓市值合计:%d,可支配价值:%d' % (market_cap,value_cap))

    def action(row):
        pos = positions.loc[positions['代码'] == row['代码']].iloc[0]
        row['当前仓位'] = round(pos['持仓市值'] / value_cap, 4)
        row['动态仓位'] = round(row['当前仓位'] + (row['目标仓位'] - row['当前仓位']) / step, 4)
        # 目标市值
        tar_value = row['动态仓位'] * value_cap
        row['价值偏移'] = round((pos['持仓市值'] - tar_value) / tar_value, 4)
        row['应调仓数'] = round((tar_value - pos['持仓市值']) / pos['市价'], -2)
        row['调仓金额'] = round(row['应调仓数'] * pos['市价'], 2)
        return row
    decision=decision.apply(action,axis=1)
    return decision
  1. 编排工作流并执行
# 工作流
def work_flow():
    # 定义文件路径和表名
    data_from='data/榜单应用模板20200424.xlsx'
    stockpool_sheet='标的池'
    positions_sheet='标的持仓'
    param_sheet='调仓参数'
    decision_sheet='调仓决策'
    # 读取模板excel
    stockpool = pd.read_excel (data_from, sheet_name = stockpool_sheet)
    positions = pd.read_excel (data_from, sheet_name = positions_sheet)
    param = pd.read_excel (data_from, sheet_name = param_sheet)
    decision = pd.read_excel (data_from, sheet_name = decision_sheet)
    # 处理持仓数据
    positions=work_flow1(stockpool,positions)
    # 处理决策
    decision=work_flow2(positions,param,decision)

    print('完成工作流!')
    return stockpool,positions,param,decision

# 执行工作流
df=work_flow()
  1. 展示持仓情况
# 持仓
from WindCharts import *
# 数据显示
WTable(data=df[1]).plot()
持仓情况
  1. 展示决策情况
# 决策结果
from WindCharts import *
# 数据显示
WTable(data=df[3]).plot()
决策结果
  1. 为了直观地分析持仓分布,定义了柱状图和饼状图
# 持仓柱状图
import matplotlib.pyplot as plt
def draw_bar(positions):
    names=positions['名称'].tolist()
    values=positions['持仓市值'].tolist()
    plt.bar(names,values)
    plt.xticks(rotation=90)
    
draw_bar(df[1])
持仓分布
# 持仓饼图
import matplotlib.pyplot as plt
def draw_pie(positions):
    positions=positions.loc[positions['持仓市值'] != 0,:].sort_values('持仓市值')
    names=positions['名称'].tolist()
    values=positions['持仓市值'].tolist()
    
    fig = plt.figure(facecolor='#f1f5f5')
    ax=plt.axes([0,0,1.6,1.6])
    patches,l_text,p_text=ax.pie(values,labels=names,autopct='%1.2f%%',startangle=90)
    for t in l_text: t.set_size(20)
    for t in p_text: t.set_size(18)
    
draw_pie(df[1])
持仓分布

Ending

项目地址:https://gitee.com/stephenshen/ark-quant/tree/master/first-quant
可以直接导入到万矿

记得上传数据表到指定位置


image.png

转载请注明出处:https://www.jianshu.com/p/b973a5f56213
谢谢~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • 算法技术解构 1、Python基础知识 (1)IPythonIPython的开发者吸收了标准解释器的基本概念,在此...
    shenciyou阅读 5,294评论 0 10
  • ——读《跟巴菲特学习仓位管理》感想 一、仓位管理的重要性 一项好的投资必须具备的三大要素是:好公司、好价格和好仓位...
    蒋仁钢阅读 2,245评论 0 5
  • 转眼已是一年中最后一个月。 随手翻看台历,发现每个月都有那么三五天被标记上红叉叉——这代表“那天我发飙了”。也就是...
    胆儿大阅读 1,142评论 10 25
  • *前端 *软件主要分为俩种架构C/S和B/S. *B/S中的B指的是browsers,是浏览器的意思,S值Serv...
    我想要上天阅读 233评论 0 1
  • 没有假如,你就是天堂11.27悟 想什么,没什么 怕什么,来什么 舍与得:有舍有得,有得有失 智者知之,愚者昧之,...
    闻思修1965阅读 310评论 0 0