蒙特卡洛量化分析方法

蒙特卡洛方法主要思想:对于一个随机系统,输出随输入变化是随机的,那么通过重复采样的方法可以得到输出的具体分布,进而再对输出分布形式进行分析。

大数定律:当在试验不变的条件下,重复试验多次,随机事件的频率近似于它的概率。

将上述思想用于量化分析:

(1)假设股票收盘价符合正态分布。

(2)根据历史数据计算正态分布均值和方差。

(3)假设历史数据的均值和方差来在预测周期内近似不变,确定正态分布参数。

(4)假设预测周期为N,那么每运行一次正态分布函数会得到一组数据,这些数据是随机的。

(5)将第(4)步重复M次,那么会得到M结果。

(6)统计M个结果中最终涨幅的分布概率就可以得到预测的不同价格下的概率。

参考代码:

# -*- coding: utf-8 -*-
"""
Created on Sat Aug 21 22:06:30 2021

@author: Administrator
#参考:https://mp.weixin.qq.com/s/hBs3gMI0SXdTpX-5h2iHmQ
"""
import sys
import math
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
from tqdm import tqdm

ts.set_token('xxxxxxxxxxxx')
pro = ts.pro_api()


def get_kdata(stock_code='603396.SH', start_date='20210701', end_date='20210821', reload=False):
    if reload:
        df = pro.daily(ts_code=stock_code, start_date=start_date, end_date=end_date)
        df = df.iloc[::-1]
        df.to_csv(stock_code+'.csv')
    else:
        df = pd.read_csv(stock_code+'.csv')
    return df

if __name__ == '__main__':
    #定义预测周期T
    T = 11
    
    #K线获取
    kdata = get_kdata(stock_code='603396.SH', start_date='20210101', end_date='20210821', reload=True)
    
    #总的交易日数
    days = len(kdata)
    
    #周期数量
    N = days // T
    
    #提取整数周期
    kdata = kdata.iloc[days%T:, :]
    
    #定义待预测的周期
    Pth = min(N, N) 
    
    #获取参考数据,需根据参考数据对预测周期进行预测
    #定义参考开始周期
    Sth = 1
    ref_data = kdata.iloc[(Sth-1)*T:(Pth-1)*T, :]
    
    #获取参考周期内的平均周期增长率
    mu = ((((ref_data.close.iloc[-1]) / ref_data.close.iloc[0])) ** (T/len(ref_data))) - 1
    print ("平均周期增长率:", str(round(mu,4)*100)+"%")
    
    #计算平均周期波动率
    ref_data['Returns'] = ref_data.close.pct_change()
    vol = ref_data['Returns'].std()*np.sqrt(T)
    print ("平均周期波动率:", str(round(vol,4)*100)+"%")

    S = ref_data.close.iloc[-1]
    result = []
    
    # 模拟次数
    for i in tqdm(range(10000)):
        # 正态分布生成
        daily_returns = np.random.normal(mu/T,vol/math.sqrt(T),T)+1

        #设置起始价格
        price_list = [S]

        for x in daily_returns:
            price_list.append(price_list[-1]*x)

        #绘制曲线
        plt.plot(price_list)

        #当前模拟状态下的最终价格
        result.append(price_list[-1])

    # 显示图片
    plt.show()

    # 绘制直方图,即各种最终价格出现的次数统计分布
    plt.hist(result,bins=50)
    plt.show()

    #平均价格,即预测的目标价格,依据大数定律
    print('当前日期: ', ref_data.trade_date.iloc[-1])
    print('当前价格: ', S)
    pred_price = np.mean(result)
    print('预测的目标价格: ', round(pred_price, 2))
    print('预测的目标涨幅: ', str(round((pred_price-S)/S, 4)*100)+"%")

    # 绘制直方图,即各种最终价格出现的次数统计分布
    plt.hist(result,bins=100)
    
    #获取目标价格下跌的概率
    delta = np.inf
    percentage =  0
    for i in range(101):
        p = np.percentile(result, i)
        if abs(p-S) < delta:
            delta = abs(p-S)
            percentage = i
            
    print('目标价格下跌的概率: ', percentage, '%')    
    print("5% 概率低于:",np.percentile(result,5))
    print("5% 概率高于:",np.percentile(result,95))
    
    plt.axvline(S, color='b', linestyle='dashed', linewidth=2)
    plt.axvline(np.percentile(result,5), color='r', linestyle='dashed', linewidth=2)
    plt.axvline(np.percentile(result,95), color='r', linestyle='dashed', linewidth=2)
    plt.show()

运行结果:

随机走势图:

最终结果分布图:

 结果:

当前日期:  20210805
当前价格:  106.95
预测的目标价格:  114.32
预测的目标涨幅:  6.890000000000001%
目标价格下跌的概率:  34 %
5% 概率低于: 89.23284241851933
5% 概率高于: 143.09267477654623

ps:

1、公众号实时查询股票涨幅,无需打开交易软件,方便查看;

2、量化知识和策略分享。

请关注“量化之窗”公众号,如有疑问,请在文章下方留言,欢迎使用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Coding的叶子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值