使用P值验证策略的可靠性

首先创建一个​​statistical_test.py​​文件

Python量化交易实战-27使用P值验证策略的可靠性_数据

一、测试平安银行的P值可靠性

import sys,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

import Data.Stock as st
import Strategy.Base as stb
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import Strategy.ma_strategy as ma
from scipy import stats

# 对策略收益进行ttest检验
def ttest(data_return):
# 调用假设检验tt est函数:scipy
t, p = stats.ttest_1samp(data_return, 0, nan_policy='omit')
# 获取单边P值
p_value = p/2
# 打印t、P
print("t value:" , t)
print("p value:" , p_value)

# 判断是否与理论均值有显著性差异
print("是否拒绝H0:收益均值=0:", p < 0.05)
return t, p_value


if __name__ == '__main__':
code = '000001.XSHE'
data = st.get_single_price(stock_code=code, timefrequency='daily', start_date=None, end_date='2021-01-01')
data = ma.ma_strategy(data)
# 策略的单次收益率
returns = data['profit_pct']
print(returns)
# 绘制一下分布图用于观察
# plt.hist(returns, bins=30)
# plt.show()
#对多个股票进行计算和测试
ttest(returns)

Python量化交易实战-27使用P值验证策略的可靠性_相似度_02

​P Value​​​为​​0.08​​,也就是说,从统计学上来说,它与均值0并没有显著的差异,但是这个结果不能够反推这个策略不赚钱,只能说从概率学上说,只有百分之8到10的概率是不赚钱的。大体上还是可以参考的策略,

如果说有一支股票,你测到它的​​P Value​​=0.001,它并不能代表这支股票一定能赚到钱,它代表的是样本和理论数据有显著差异。也就是它极有可能让你赚钱,

所以从结论来说你可以简单的理解,当​​P Value​​<0.05的时候,这个策略似乎是更可靠的,但这只是一个推论性质的指标,不是绝对的,

二、查看多只股票的P值

多测试2个股票的数据:

if __name__ == '__main__':
stocks = ['000001.XSHE','000858.XSHE','002594.XSHE']
for code in stocks:
data = st.get_single_price(stock_code=code, timefrequency='daily', start_date='2016-12-01', end_date='2021-01-01')
data = ma.ma_strategy(data)
# 策略的单次收益率
returns = data['profit_pct']
# print(returns)
# 绘制一下分布图用于观察
# plt.hist(returns, bins=30)
# plt.show()
#对多个股票进行计算和测试
print(code)
ttest(returns)

Python量化交易实战-27使用P值验证策略的可靠性_数据_03

第一支股票的​​t Value​​和最小,所以它样本的相似度最高,

从结果上来说,3支股票的​​p value​​都没有小于0.05,也就是它和我们的样本没有啥显著性的差异

但是 当​​p value​​越小,能代表和原来理论设置的0样本的差异越大 也就是越可能让我赚钱.