引入3个包,分别是talib,tushare和pandas
import tushare as ts
import pandas as pd
import talib
首先,我们需要获取股票的历史数据行情,这里我们获取格力电器(000651)股票的历史数据行情,我们通过tushare获取。
def get_stock_data(code): # 通过tushare获取数据,前复权后的数据 df_raw = ts.get_k_data(code, autype='qfq') # code数据处理 df_raw["code"] = df_raw.apply(lambda x: add_note(x.code), axis=1) df_raw.to_csv(code + '.csv') return code + '.csv'
获取的股票数据行情,保存到csv,数据格式如下:

接着,我们需要定义一个函数,计算我们要的均线,均线的值我们通过ma1和ma2传入。
def calculate_sma(filename, ma1=5, ma2=10):
df = pd.read_csv(filename, index_col='date')
# Simple Moving Average SMA 简单移动平均
df['SMA_' + str(ma1)] = talib.MA(df['close'], timeperiod=ma1)
df['SMA_' + str(ma2)] = talib.MA(df['close'], timeperiod=ma2)
df['compare'] = df.apply(lambda x: compare_diff(x['SMA_' + str(ma1)], x['SMA_' + str(ma2)]), axis=1)
df = df[9:]
df.to_csv("sma_data.csv")
return df
计算结果的文件,存了均线的值,我们示例中的ma1=5日均线,ma2=10日均线。

最后,我们需要根据均线的值做出买卖的决策依据,5日上穿10日均线,买入,5日下穿10日均线,卖出。
def sell_and_buy(df, ma1=5, ma2=10):
# 标记均线上穿与下穿
df['match'] = df.compare == df.compare.shift()
df.to_csv("sma_change.csv")
# 开仓与平仓
df["tag"] = df.apply(lambda row: tag(row.match, row.compare), axis=1)
df.to_csv("result.csv")
我们使用tag来标识卖出还是买入,match列表示,本次的5日均线值与10日均线值的比较大小是否改变,如果改变则代表是上穿还是下穿。

我们用定义一个计算盈利。这里我们简单计算下开平仓以及盈利次数,成功率还有最后的总盈亏。
def cal_profit():
df = pd.read_csv("result.csv", index_col='date')
df["profit"] = 0
total = 0
win = 0
buyprice = 0
for index, row in df.iterrows():
if row.tag == '买入':
buyprice = row.close
if row.tag == '卖出' and buyprice != 0:
total += 1
# 用这种方式赋值
df.loc[index, 'profit'] = row.close - buyprice
if row.close - buyprice > 0:
win += 1
percent = round((win / total) * 100, 2)
profit = round(df["profit"].sum(),2)
print("开平仓次数:", total, "\n盈利次数:", win, "\n成功率:", percent, "%", "\n总共盈亏:", profit)
df.to_csv("profit.csv")
最后结果输出如下:
===简单双均线策略====
开平仓次数: 34
盈利次数: 14
成功率: 41.18 %
总共盈亏: 4.15
以上,就是我们本次的双均线买卖策略,希望对大家有所帮助。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/76856
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!