Modular

# -*- coding: utf-8 -*-

"""

Created on %(date)s

@author: %(username)s

"""

"""

讀取文件路徑

方法:

1 利用cmd命令把所有目標(biāo)文件路徑寫(xiě)入文件劲厌, dir /b/s >filepath.txt间唉,再刪掉filepath.txt中包含的filepath.txt自己的路徑

2 利用python的open和readlines完成

"""

target = open(r'C:\finance\filepath.txt')

filelist = target.readlines();

#print(filelist[0])

#print(type(filelist))

stockFilePath = filelist[455][:-1]

#這里文件路徑都含有換行符月弛,用[:-1]去掉換行符

stockFile = open(stockFilePath)

#print(stockFilePath)

stockData = stockFile.readline()

#第一行數(shù)據(jù)為列說(shuō)明威沫,略去不讀

stockData = stockFile.readlines()

#print(stockData[0])

date_array = []

open_array = []

high_array = []

close_array = []

low_array = []

volume_array = []

amount_array = []

"""

下面定義一個(gè)取出數(shù)據(jù)的函數(shù)

"""

def dataInit(date_array=date_array, open_array=open_array, high_array=high_array, close_array=close_array,

? ? ? ? ? ? low_array=low_array, volume_array=volume_array, amount_array=amount_array):

? ? date_array = []

? ? open_array = []

? ? high_array = []

? ? close_array = []

? ? low_array = []

? ? volume_array = []

? ? amount_array = []

def dataGot(stockData=stockData, date_array=date_array, open_array=open_array, high_array=high_array, close_array=close_array,

? ? ? ? ? ? ? low_array=low_array, volume_array=volume_array, amount_array=amount_array):

? ? dataInit()

? ? for data in stockData:

? ? ? ? tmp = data[:-1].split(',')

? ? ? ? date_array.append(tmp[0])

? ? ? ? open_array.append(tmp[1])

? ? ? ? high_array.append(tmp[2])

? ? ? ? close_array.append(tmp[3])

? ? ? ? low_array.append(tmp[4])

? ? ? ? volume_array.append(tmp[5])

? ? ? ? amount_array.append(tmp[6])

? ? date_array.reverse()

? ? open_array.reverse()

? ? high_array.reverse()

? ? close_array.reverse()

? ? low_array.reverse()

? ? volume_array.reverse()

? ? amount_array.reverse()

dataGot()

#print(date_array[-1])

from collections import namedtuple,OrderedDict

from functools import reduce

class StockTradeDays(object):

? ? def __init__(self, date_array=date_array, open_array=open_array, high_array=high_array, close_array=close_array,

? ? ? ? ? ? ? ? low_array=low_array, volume_array=volume_array, amount_array=amount_array):

? ? ? ? self.__date_array = date_array

? ? ? ? self.__open_array = open_array

? ? ? ? self.__high_array = high_array

? ? ? ? self.__close_array = close_array

? ? ? ? self.__low_array = low_array

? ? ? ? self.__volume_array = volume_array

? ? ? ? self.__amount_array = amount_array

? ? ? ? self.__change_array = self.__init_change()

? ? ? ? self.stock_dict = self._init_stock_dict()

? ? def __init_change(self):

? ? ? ? price_float_array =[float(price_str) for price_str in self.__close_array]

? ? ? ? pp_array = [(p1,p2) for p1, p2 in zip(price_float_array[:-1], price_float_array[1:])]

? ? ? ? change_array = list(map(lambda pp: reduce(lambda a, b:round((b - a) / a, 3), pp), pp_array))

? ? ? ? change_array.insert(0,0)

? ? ? ? return change_array

? ? def _init_stock_dict(self):

? ? ? ? stock_namedtuple = namedtuple('stock',('date','open','high','close','low','volume','amount','change'))

? ? ? ? stock_dict = OrderedDict((date,stock_namedtuple(date,openprice,high,close,low,volume,amount,change))

? ? ? ? for date,openprice,high,close,low,volume,amount,change in

? ? ? ? zip(self.__date_array, self.__open_array, self.__high_array, self.__close_array, self.__low_array, self.__volume_array, self.__amount_array,

? ? ? ? ? ? self.__change_array))

? ? ? ? return stock_dict

? ? def __str__(self):

? ? ? ? return str(self.stock_dict)

? ? __repr__ = __str__

? ? def __iter__(self):

? ? ? ? for key in self.stock_dict:

? ? ? ? ? ? yield self.stock_dict[key]

? ? def __getitem__(self, ind):

? ? ? ? date_key = self.__date_array[ind]

? ? ? ? return self.stock_dict[date_key]

? ? def __len__(self):

? ? ? ? return len(self.stock_dict)

stock1 = StockTradeDays()

#for ind, day in enumerate(stock1):

#? ? if ind < 10:

#? ? ? ? print(day)

#? ? else:

#? ? ? ? break

import six

from abc import ABCMeta, abstractmethod

class TradeStrategyBase(six.with_metaclass(ABCMeta, object)):

? ? """

? ? 交易策略抽象基類

? ? """

? ? @abstractmethod

? ? def buy_strategy(self, *args, **kwargs):

? ? ? ? pass


? ? @abstractmethod

? ? def sell_strategy(self, *args, **kwargs):

? ? ? ? pass


class TradeStrategy1(TradeStrategyBase):

? ? s_keep_stock_threshold = 20

? ? def __init__(self):

? ? ? ? self.keep_stock_day = 0

? ? ? ? self.__buy_change_threshold = 0.07

? ? def buy_strategy(self, trade_ind, trade_day, trade_days):

? ? ? ? if self.keep_stock_day == 0 and \

? ? ? ? trade_day.change > self.__buy_change_threshold:

? ? ? ? ? ? self.keep_stock_day +=1

? ? ? ? elif self.keep_stock_day >0:

? ? ? ? ? ? self.keep_stock_day += 1

? ? def sell_strategy(self, trade_ind, trade_day, trade_days):

? ? ? ? if self.keep_stock_day >=\

? ? ? ? TradeStrategy1.s_keep_stock_threshold:

? ? ? ? ? ? self.keep_stock_day = 0

? ? @property

? ? def buy_change_threshold(self):

? ? ? ? return self.__buy_change_threshold

? ? @buy_change_threshold.setter

? ? def buy_change_threshold(self, buy_change_threshold):

? ? ? ? if not isinstance(buy_change_threshold, float):

? ? ? ? ? ? raise TypeError('buy_change_threshold must be float')

? ? ? ? self.__buy_change_threshold = round(buy_change_threshold, 2)

class TradeLoopBack(object):

? ? def __init__(self, trade_days, trade_strategy):

? ? ? ? self.trade_days = trade_days

? ? ? ? self.trade_strategy = trade_strategy

? ? ? ? self.profit_array = []

? ? def execute_trade(self):

? ? ? ? for ind, day in enumerate(self.trade_days):

? ? ? ? ? ? if self.trade_strategy.keep_stock_day > 0:

? ? ? ? ? ? ? ? self.profit_array.append(day.change)

? ? ? ? ? ? if hasattr(self.trade_strategy, 'buy_strategy'):

? ? ? ? ? ? ? ? self.trade_strategy.buy_strategy(ind, day, self.trade_days)

? ? ? ? ? ? if hasattr(self.trade_strategy, 'sell_strategy'):

? ? ? ? ? ? ? ? self.trade_strategy.sell_strategy(ind, day, self.trade_days)

trade_loop_back = TradeLoopBack(stock1, TradeStrategy1())

trade_loop_back.execute_trade()

print ('回測(cè)策略1 總盈虧為:{}%'.format(

? ? ? ? reduce(lambda a, b:a+b, trade_loop_back.profit_array) * 100))

import numpy as np

import matplotlib.pyplot as plt

plt.plot(np.array(trade_loop_back.profit_array).cumsum())

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雾袱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子芹橡,更是在濱河造成了極大的恐慌林说,老刑警劉巖腿箩,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件珠移,死亡現(xiàn)場(chǎng)離奇詭異末融,居然都是意外死亡滑潘,警方通過(guò)查閱死者的電腦和手機(jī)锨咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)酪刀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)骂倘,“玉大人,你說(shuō)我怎么就攤上這事诅需⊙咚” “怎么了分衫?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵牵现,是天一觀的道長(zhǎng)邀桑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)贼急,這世上最難降的妖魔是什么瓤摧? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮这揣,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘给赞。我一直安慰自己片迅,他們只是感情好柑蛇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布耻台。 她就那樣靜靜地躺著,像睡著了一般盆耽。 火紅的嫁衣襯著肌膚如雪摄杂。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音框杜,去河邊找鬼袖肥。 笑死椎组,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的专筷。 我是一名探鬼主播磷蛹,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼味咳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼槽驶!你這毒婦竟也來(lái)了掂铐?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤聂受,失蹤者是張志新(化名)和其女友劉穎蛋济,沒(méi)想到半個(gè)月后碗旅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體祟辟,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡侣肄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年吼具,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拗盒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锥债。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡哮肚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恼策,到底是詐尸還是另有隱情戏蔑,我是刑警寧澤总棵,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站骤视,受9級(jí)特大地震影響鹃觉,放射性物質(zhì)發(fā)生泄漏盗扇。R本人自食惡果不足惜疗隶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一蒋纬、第九天 我趴在偏房一處隱蔽的房頂上張望蜀备。 院中可真熱鬧琼掠,春花似錦瓷蛙、人聲如沸艰猬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)樱报。三九已至迹蛤,卻和暖如春盗飒,著一層夾襖步出監(jiān)牢的瞬間逆趣,已是汗流浹背宣渗。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留涯鲁,地道東北人抹腿。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓盅称,卻偏偏與公主長(zhǎng)得像缩膝,于是被迫代替她去往敵國(guó)和親疾层。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容