Python量化交易01——构建基础策略

参考书目:深入浅出Python量化交易实战


量化交易是很早就想开的栏目了,之前没时间。现在正好放寒假,然后也找到了一本合适的书可以进行学习。

本次第一章就介绍一下简单的量化流程和一个简单的策略。

量化交易顾名思义就是用代码去验证交易策略是否赚钱,严格按照程序的交易可以避免人性的很多缺点。

核心思想需要回测验证。

第一章就使用最简单的交易策略,低买高卖。如果股价在当天跌了就买,涨了就买。

使用Python进行回测验证收益。


下载数据创建交易信号

使用国内量化最为流行的Tushare库获取数据,很简单便捷。

导入数据分析常用的库

#导入必要的库
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

下载中国平安的数据来测试,时间从2020年1月1日到202年3月20日。

#指定下载股票的日期范围
start_date = '2020-01-01'
end_date = '2020-03-20'
#使用ts获取数据
#将时间范围作为参数传入
zgpa = ts.get_k_data('601318',
                    start_date, end_date)
zgpa = zgpa.set_index('date')
#检查是否下载成功
zgpa.head()

 #下面我们来创建交易信号
#为了不影响原始数据,这里创建一个新的数据表

#只保留原始数据中的日期index
zgpa_signal = pd.DataFrame(index = zgpa.index)
#为了更能体现股票的真实价值
#使用Adj Close调整价格作为股票价格
zgpa_signal['price'] = zgpa['close']
#增加一个字段,来存储股价的变化
zgpa_signal['diff'] = zgpa_signal['price'].diff()
#增加diff字段后,第一行会出现空值,我们使用0来进行填补
zgpa_signal = zgpa_signal.fillna(0.0)
#如果股价上涨或不变,则标记为0
#如果股价下跌,则标记为1
zgpa_signal['signal'] = np.where(zgpa_signal['diff'] >= 0, 0,1)
#接下来,根据交易信号的变化进行下单
#一般情况下,在A股市场,买入或卖出至少为100股,即1手
zgpa_signal['order'] = zgpa_signal['signal'].diff()*100
#检查一下下单的情况
zgpa_signal.head()

singal为0表示卖出,1表示买入。order表示相应的买入和卖出的数量 。


回测验证

初始资金20000进行交易,计算持仓市值和账户总余额。

initial_cash = 20000.00
#增加一个字段,代表交易的股票的市值
zgpa_signal['stock'] = zgpa_signal['order']*zgpa_signal['price']
#两次买卖的订单变化之差就是某一时刻仓位的变化情况
#持仓股票的数量变化乘以现价,就是代表交易产生的现金流
#用初始资金减去现金流变化的累加,就是剩余的现金
zgpa_signal['cash'] = initial_cash -(zgpa_signal['order'].diff()*zgpa_signal['price']).cumsum()
#而最股票的市值加上剩余的现金,就是总资产
zgpa_signal['total'] = zgpa_signal['stock'] + zgpa_signal['cash']
zgpa_signal.head()

可以看到计算出来了每一天的持仓市值和总体的账户余额。

自己写量化的核心难点就在于怎么计算现金流的变化,这里是用order表示交易订单的变化之差表示仓位的变化,然后乘价格在累计加合就表示为交易的现金流。

 画图展示

#用图形来进行展示
#设置图形的尺寸是10*6
plt.figure(figsize=(10,6))
#分别绘制总资产和持仓股票市值的变化
plt.plot(zgpa_signal['total'])
plt.plot(zgpa_signal['order'].cumsum()*zgpa_signal['price'],'--',
        label='stock value')
#增加网格,调整一下图注的位置,就可以显示图像了
plt.xticks([0,12,24,36,48])
plt.grid()
plt.legend(loc='center right')
plt.show()

 蓝色的线表示账户总额的变化,可以看到略微亏损,但整体还算不错。

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阡之尘埃

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值