Skip to content

Commit d25575e

Browse files
committed
added test for moving correlation
1 parent d0a5784 commit d25575e

File tree

4 files changed

+73
-2
lines changed

4 files changed

+73
-2
lines changed

PyFin/Analysis/SecurityValueHolders.pyx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -313,10 +313,10 @@ cdef class SecurityBinaryValueHolder(SecurityValueHolder):
313313
for name in sec_values1.index():
314314
try:
315315
holder = self._innerHolders[name]
316-
holder.push({dummy_name1: sec_values1[name], dummy_name2: sec_values2})
316+
holder.push({dummy_name1: sec_values1[name], dummy_name2: sec_values2[name]})
317317
except KeyError:
318318
holder = copy.deepcopy(self._holderTemplate)
319-
holder.push({dummy_name1: sec_values1[name], dummy_name2: sec_values2})
319+
holder.push({dummy_name1: sec_values1[name], dummy_name2: sec_values2[name]})
320320
self._innerHolders[name] = holder
321321

322322
def __str__(self):

PyFin/examples/demo.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from PyFin.api import *
2+
from sqlalchemy import select, create_engine, and_
3+
import pandas as pd
4+
from alphamind.data.dbmodel.models import Market
5+
6+
engine = create_engine('postgresql+psycopg2://alpha:alpha@180.166.26.82:8889/alpha')
7+
begin_date = '2018-12-26'
8+
end_date = '2018-12-28'
9+
query = select([Market]).where(
10+
and_(Market.trade_date >= begin_date, Market.trade_date <= end_date, ))
11+
mkt_df = pd.read_sql(query, engine)
12+
mkt_df.rename(columns={'preClosePrice': 'pre_close', 'openPrice': 'openPrice',
13+
'highestPrice': 'highestPrice', 'lowestPrice': 'lowestPrice',
14+
'closePrice': 'closePrice', 'turnoverVol': 'turnoverVol',
15+
'turnoverValue': 'turnover_value', 'accumAdjFactor': 'accum_adj',
16+
'vwap': 'vwap'}, inplace=True)
17+
mkt_df = mkt_df[[('000000' + str(code))[-6:][0] in '036' for code in mkt_df['code']]]
18+
trade_date_list = list(set(mkt_df.trade_date))
19+
trade_date_list.sort(reverse=True)
20+
mkt_df = mkt_df.sort_values(['trade_date', 'code']).set_index(['trade_date', 'code'])
21+
mkt_df = mkt_df[mkt_df['turnoverVol'] > 0]
22+
23+
import datetime as dt
24+
25+
start = dt.datetime.now()
26+
27+
expression1 = LAST('closePrice') * 2 - LAST('lowestPrice') - LAST('highestPrice')
28+
expression2 = LAST('highestPrice') - LAST('lowestPrice')
29+
30+
alpha2 = DIFF(expression1 / expression2) * - 1
31+
32+
df = mkt_df.loc['2018-12-26':'2018-12-28'].reset_index(level=1)
33+
df['alpha2'] = alpha2.transform(df, name='alpha2', category_field='code')['alpha2']
34+
#df[['trade_date', 'code', 'closePrice', 'highestPrice', 'lowestPrice', 'alpha2']].set_index('code').loc[603999]
35+
print("elapsed time: {0}".format(dt.datetime.now() - start))

PyFin/examples/demo2.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from PyFin.Analysis.TechnicalAnalysis import SecurityMovingRank
2+
from PyFin.Math.Accumulators.StatefulAccumulators import MovingCorrelation
3+
# TSRANK(VOLUME,5)
4+
expression1 = SecurityMovingRank(5, 'turnoverVol')
5+
# TSRANK(HIGH,5)
6+
expression2 = SecurityMovingRank(5, 'highPrice')
7+
8+
MovingCorrelation(5, expression1, expression2)

PyFin/tests/Analysis/TechnicalAnalysis/testStatefulTechnicalAnalysers.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,34 @@ def testSecurityMovingRank(self):
395395
'expected: {1:.12f}\n'
396396
'calculated: {2:.12f}'.format(i, expected, calculated))
397397

398+
def testSecurityMovingCorrelation(self):
399+
window = 120
400+
mc = SecurityMovingCorrelation(window, ['close'], ['open'])
401+
402+
for i in range(len(self.aapl['close'])):
403+
data = dict(aapl=dict(close=self.aapl['close'][i],
404+
open=self.aapl['open'][i]),
405+
ibm=dict(close=self.ibm['close'][i],
406+
open=self.ibm['open'][i]))
407+
mc.push(data)
408+
if i < window:
409+
start = 0
410+
else:
411+
start = i + 1 - window
412+
413+
if i < 1:
414+
continue
415+
416+
value = mc.value
417+
for name in value.index():
418+
xs = self.dataSet[name]['close'][start:(i + 1)]
419+
ys = self.dataSet[name]['open'][start:(i + 1)]
420+
expected = np.corrcoef(xs, ys)[0, 1]
421+
calculated = value[name]
422+
self.assertAlmostEqual(expected, calculated, 12, 'at index {0}\n'
423+
'expected: {1:.12f}\n'
424+
'calculated: {2:.12f}'.format(i, expected, calculated))
425+
398426
def testSecurityMovingQuantile(self):
399427
window = 10
400428
mq = SecurityMovingQuantile(window, ['close'])

0 commit comments

Comments
 (0)