创建一个文件find_best_param.py
用于寻找最优参数。
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.ma_strategy as ma
# 参数1:股票池
code = '000001.XSHE'
data = st.get_single_price(stock_code=code, timefrequency='daily', start_date='2016-01-01', end_date='2021-01-01')
# 参数2:周期参数
params=[5, 10, 20, 60, 120, 250]
# 匹配,并计算不同的周期参数对:5-10,5-20,...120-150
for short in params:
for long in params:
if long > short:
print("当前周期参数对:", short, long)
ma.ma_strategy(data=data, short_window=short, long_window=long)
运行
我们得到了一支股票,在所有的周期对
的收益率。可以看到越到周期越长的时间,交易的次数越少。
这里我想直接看到最终的周期对
对应的收益,而不是打印出这么多数据,应该怎么实现呢?
其实就是提取dataframe的cum_profit的最后一个数据。
直接来提取:
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.ma_strategy as ma
import pandas as pd
# 参数1:股票池
code = '000001.XSHE'
data = st.get_single_price(stock_code=code, timefrequency='daily', start_date='2016-01-01', end_date='2021-01-01')
# 参数2:周期参数
params=[5, 10, 20, 60, 120, 250]
#存放参数与收益
res = []
# 匹配,并计算不同的周期参数对:5-10,5-20,...120-150
for short in params:
for long in params:
if long > short:
print("当前周期参数对:", short, long)
df = ma.ma_strategy(data=data, short_window=short, long_window=long)
# 获取周期参数,及其对应的累计收益率
cum_profit = df['cum_profit'].iloc[-1]
#将参数放入结果列表
res.append([short, long, cum_profit])
# 将结果李彪转换为df,并找到最优参数
res = pd.DataFrame(res,columns=['short_win', 'long_win', 'cum_profit'])
# 按收益倒叙排列
res = res.sort_values(by='cum_profit', ascending=False)
print(res)
运行
从这个最后的收益来看,10天对应20天
的收益是最高的,这能不能说明双均线策略适合10天对20天
呢?当然不可以,因为这只是针对这一支股票,个股是由极大的特殊性的。所以需要跑大量的A股,你发现百分之80的情况下,都是10天对20天
收益最高,你才能说这个周期对对应的收益是最好的。
你发现这个打印出来的dataframe
的索引是乱序的,这是因为排序了,你可以直接忽视掉。
转载请注明:xuhss » Python量化交易实战-28基于策略,寻找最优周期对